[bugfix] chat bubble error and Pronounce ID.UNYX error

This commit is contained in:
2025-08-18 13:34:57 +08:00
parent f2ffaf6f70
commit 028471a2b7
6 changed files with 52 additions and 36 deletions

View File

@@ -62,23 +62,21 @@ class _FullScreenState extends State<FullScreen> {
const SizedBox(height: 12),
Expanded(
child: Consumer<MessageService>(
builder: (context, handler, child) {
builder: (context, messageService, child) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_scrollToBottom();
});
final messageService = context.read<MessageService>();
List<ChatMessage> fullScreenMessages = List.from(handler.messages);
if (fullScreenMessages.isEmpty) {
Future.delayed(const Duration(milliseconds: 500), () {
if (messageService.messages.isEmpty) {
// Future.delayed(const Duration(milliseconds: 500), () {
String text = Intl.getCurrentLocale().startsWith('zh')
? "您好,我是众众,请问有什么可以帮您?"
: "Hi, I'm Zhongzhong, may I help you ? ";
messageService.addMessage(text, false, MessageStatus.normal);
});
// });
}
return ChatBox(
scrollController: _scrollController,
messages: handler.messages,
messages: messageService.messages,
);
},
),

View File

@@ -110,8 +110,7 @@ class _PartScreenState extends State<PartScreen> {
_scrollToBottom();
});
return Consumer<MessageService>(
builder: (context, handler, child) {
final messages = handler.messages;
builder: (context, messageService, child) {
return AnimatedContainer(
duration: const Duration(milliseconds: 180),
curve: Curves.easeInOut,
@@ -145,7 +144,7 @@ class _PartScreenState extends State<PartScreen> {
child: ChatBox(
scrollController:
_scrollController,
messages: messages,
messages: messageService.messages,
),
),
),

View File

@@ -78,6 +78,10 @@ class ChatSseService {
break;
}
tempText += textChunk;
if (tempText.contains("ID.")) {
tempText = tempText.replaceAllMapped(
RegExp(r'ID\.', caseSensitive: false), (m) => 'ID ');
}
int endIndex = _getCompleteTextEndIndex(tempText);
String completeText = CommonUtil.cleanText(tempText.substring(0, endIndex).trim(), true);
if (completeText.isNotEmpty) {
@@ -136,7 +140,7 @@ class ChatSseService {
int _getCompleteTextEndIndex(String buffer) {
// 支持句号、问号、感叹号和换行符作为分割依据
final sentenceEnders = RegExp(r'[,!?:,。!?:\n]');
final sentenceEnders = RegExp(r'[,.!?:,。!?:\n]');
final matches = sentenceEnders.allMatches(buffer);
return matches.isEmpty ? 0 : matches.last.end;
}

View File

@@ -36,6 +36,15 @@ class MessageService extends ChangeNotifier {
replaceMessage(id: _latestUserMessageId!, text: call.arguments);
break;
case "onAsrStop":
int index = findMessageIndexById(_latestUserMessageId!);
if (index == -1) {
return;
}
final message = _messages[index];
if (message.text.isEmpty) {
removeMessageById(_latestUserMessageId!);
return;
}
replaceMessage(
id: _latestUserMessageId!, status: MessageStatus.normal);
if (_asrCompleter != null && !_asrCompleter!.isCompleted) {

View File

@@ -50,8 +50,13 @@ class CommonUtil {
.trim();
if (forTts) {
cleanedText = cleanedText.replaceAllMapped(
RegExp(r'ID\.UNYX', caseSensitive: false), (m) => 'I D Unix');
if (cleanedText.contains("ID.UNYX")) {
cleanedText = cleanedText.replaceAllMapped(
RegExp(r'ID\.UNYX', caseSensitive: false), (m) => 'ID Unix');
} else {
cleanedText = cleanedText.replaceAllMapped(
RegExp(r'UNYX', caseSensitive: false), (m) => 'Unix');
}
}
return cleanedText;

View File

@@ -61,30 +61,31 @@ class _ChatBubbleState extends State<ChatBubble> {
),
child: _buildAssistantContent(isThinking),
)
: IntrinsicWidth(
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 12),
decoration: BoxDecoration(
color: message.isUser
? CommonUtil.commonColor
: Colors.white.withValues(alpha: 0.12),
borderRadius: message.isUser
? BorderRadius.only(
topLeft: Radius.circular(12),
bottomLeft: Radius.circular(12),
bottomRight: Radius.circular(12),
)
: BorderRadius.only(
topRight: Radius.circular(12),
bottomLeft: Radius.circular(12),
bottomRight: Radius.circular(12),
),
),
child: message.isUser
? _buildUserContent()
: _buildAssistantContent(isThinking),
: Container(
constraints: const BoxConstraints(
minWidth: 50,
),
padding: const EdgeInsets.symmetric(
horizontal: 12, vertical: 12),
decoration: BoxDecoration(
color: message.isUser
? CommonUtil.commonColor
: Colors.white.withOpacity(0.12),
borderRadius: message.isUser
? BorderRadius.only(
topLeft: Radius.circular(12),
bottomLeft: Radius.circular(12),
bottomRight: Radius.circular(12),
)
: BorderRadius.only(
topRight: Radius.circular(12),
bottomLeft: Radius.circular(12),
bottomRight: Radius.circular(12),
),
),
child: message.isUser
? _buildUserContent()
: _buildAssistantContent(isThinking),
),
),
],