新增 logger 打印方法
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
import 'package:ai_chat_assistant/utils/common_util.dart';
|
||||
import 'package:ai_chat_core/ai_chat_core.dart';
|
||||
|
||||
// ...existing code...
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_tts/flutter_tts.dart';
|
||||
|
||||
@@ -46,27 +46,27 @@ class LocalTtsService {
|
||||
|
||||
// 设置TTS事件回调
|
||||
_flutterTts.setStartHandler(() {
|
||||
print('TTS开始播放');
|
||||
Logger.i('TTS开始播放');
|
||||
_isPlaying = true;
|
||||
_onStartHandler?.call();
|
||||
});
|
||||
|
||||
_flutterTts.setCompletionHandler(() {
|
||||
print('TTS播放完成');
|
||||
Logger.i('TTS播放完成');
|
||||
_isPlaying = false;
|
||||
_handleTtsPlaybackComplete();
|
||||
});
|
||||
|
||||
_flutterTts.setErrorHandler((msg) {
|
||||
print('TTS错误: $msg');
|
||||
Logger.e('TTS错误: $msg');
|
||||
_isPlaying = false;
|
||||
_onErrorHandler?.call(msg);
|
||||
_handleTtsPlaybackComplete(); // 错误时也要处理下一个任务
|
||||
});
|
||||
|
||||
print('TTS引擎初始化完成');
|
||||
Logger.i('TTS引擎初始化完成');
|
||||
} catch (e) {
|
||||
print('TTS引擎初始化失败: $e');
|
||||
Logger.e('TTS引擎初始化失败: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,17 +78,17 @@ class LocalTtsService {
|
||||
try {
|
||||
// 获取可用的TTS引擎
|
||||
dynamic engines = await _flutterTts.getEngines;
|
||||
print('可用的TTS引擎: $engines');
|
||||
Logger.i('可用的TTS引擎: $engines');
|
||||
|
||||
// 获取可用的语言
|
||||
dynamic languages = await _flutterTts.getLanguages;
|
||||
print('支持的语言: $languages');
|
||||
Logger.i('支持的语言: $languages');
|
||||
|
||||
// 获取当前默认引擎
|
||||
dynamic defaultEngine = await _flutterTts.getDefaultEngine;
|
||||
print('当前默认引擎: $defaultEngine');
|
||||
Logger.i('当前默认引擎: $defaultEngine');
|
||||
} catch (e) {
|
||||
print('获取TTS引擎信息失败: $e');
|
||||
Logger.e('获取TTS引擎信息失败: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,19 +100,19 @@ class LocalTtsService {
|
||||
_isProcessingTasks = false;
|
||||
_streamCompleted = false;
|
||||
_isPlaying = false; // 重置播放状态
|
||||
print('所有TTS队列和缓存已清空');
|
||||
Logger.i('所有TTS队列和缓存已清空');
|
||||
}
|
||||
|
||||
/// 推送文本到TTS队列进行流式处理(保证顺序)
|
||||
void pushTextForStreamTTS(String text) {
|
||||
if (text.trim().isEmpty) {
|
||||
print('接收到空字符串,跳过推送到TTS队列');
|
||||
Logger.i('接收到空字符串,跳过推送到TTS队列');
|
||||
return;
|
||||
}
|
||||
|
||||
String cleanedText = CommonUtil.cleanText(text, true);
|
||||
if (cleanedText.isEmpty) {
|
||||
print('清理后的文本为空,跳过推送到TTS队列');
|
||||
Logger.i('清理后的文本为空,跳过推送到TTS队列');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -125,7 +125,7 @@ class LocalTtsService {
|
||||
);
|
||||
|
||||
_orderedTasks.add(task);
|
||||
print('添加TTS任务 (索引: $taskIndex): $cleanedText');
|
||||
Logger.i('添加TTS任务 (索引: $taskIndex): $cleanedText');
|
||||
|
||||
// 尝试处理队列中的下一个任务
|
||||
_processNextReadyTask();
|
||||
@@ -135,7 +135,7 @@ class LocalTtsService {
|
||||
void _processNextReadyTask() {
|
||||
// 如果正在播放,则不处理下一个任务
|
||||
if (_isPlaying) {
|
||||
print('当前正在播放音频,等待播放完成');
|
||||
Logger.i('当前正在播放音频,等待播放完成');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ class LocalTtsService {
|
||||
while (_nextTaskIndex < _orderedTasks.length) {
|
||||
TtsTask task = _orderedTasks[_nextTaskIndex];
|
||||
if (task.status == TtsTaskStatus.ready) {
|
||||
print('按顺序播放TTS (索引: ${task.index}): ${task.text}');
|
||||
Logger.i('按顺序播放TTS (索引: ${task.index}): ${task.text}');
|
||||
_playTts(task.text);
|
||||
return; // 等待当前音频播放完成
|
||||
} else {
|
||||
@@ -155,7 +155,7 @@ class LocalTtsService {
|
||||
|
||||
// 检查是否所有任务都已处理完
|
||||
if (_streamCompleted && _nextTaskIndex >= _orderedTasks.length) {
|
||||
print('=== 所有TTS任务播放完成 ===');
|
||||
Logger.i('=== 所有TTS任务播放完成 ===');
|
||||
_isProcessingTasks = false;
|
||||
_onCompletionHandler?.call();
|
||||
}
|
||||
@@ -164,28 +164,28 @@ class LocalTtsService {
|
||||
/// 播放TTS
|
||||
Future<void> _playTts(String text) async {
|
||||
if (_isPlaying) {
|
||||
print('已有TTS正在播放,跳过本次播放');
|
||||
Logger.i('已有TTS正在播放,跳过本次播放');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
print('开始播放TTS: $text');
|
||||
Logger.i('开始播放TTS: $text');
|
||||
// 检测语言并设置
|
||||
bool isChinese = CommonUtil.containChinese(text);
|
||||
String targetLanguage = isChinese ? "zh-CN" : "en-US";
|
||||
// 检查语言是否可用,如果不可用则使用默认语言
|
||||
bool isLanguageOk = await isLanguageAvailable(targetLanguage);
|
||||
if (!isLanguageOk) {
|
||||
print('语言 $targetLanguage 不可用,使用默认语言');
|
||||
Logger.i('语言 $targetLanguage 不可用,使用默认语言');
|
||||
// 可以在这里设置备用语言或保持当前语言
|
||||
} else {
|
||||
await _flutterTts.setLanguage(targetLanguage);
|
||||
print('设置TTS语言为: $targetLanguage');
|
||||
Logger.i('设置TTS语言为: $targetLanguage');
|
||||
}
|
||||
// 播放TTS
|
||||
await _flutterTts.speak(text);
|
||||
} catch (e) {
|
||||
print('播放TTS失败: $e');
|
||||
Logger.i('播放TTS失败: $e');
|
||||
// 播放失败,重置状态并继续下一个
|
||||
_isPlaying = false;
|
||||
_handleTtsPlaybackComplete();
|
||||
@@ -195,7 +195,7 @@ class LocalTtsService {
|
||||
/// 处理TTS播放完成
|
||||
void _handleTtsPlaybackComplete() {
|
||||
if (!_isPlaying) {
|
||||
print('TTS已停止播放,处理下一个任务');
|
||||
Logger.i('TTS已停止播放,处理下一个任务');
|
||||
// 标记当前任务为已完成
|
||||
if (_nextTaskIndex < _orderedTasks.length &&
|
||||
_orderedTasks[_nextTaskIndex].status == TtsTaskStatus.ready) {
|
||||
@@ -209,7 +209,7 @@ class LocalTtsService {
|
||||
|
||||
/// 标记流完成
|
||||
void markSSEStreamCompleted() {
|
||||
print('=== 标记SSE流完成 ===');
|
||||
Logger.i('=== 标记SSE流完成 ===');
|
||||
_streamCompleted = true;
|
||||
|
||||
// 尝试完成剩余任务
|
||||
@@ -218,7 +218,7 @@ class LocalTtsService {
|
||||
|
||||
/// 停止播放
|
||||
void stopSSEPlayback() {
|
||||
print("停止SSE播放");
|
||||
Logger.i("停止SSE播放");
|
||||
// 立即停止TTS播放,无论当前是否在播报
|
||||
_flutterTts.stop();
|
||||
_isPlaying = false;
|
||||
@@ -241,11 +241,11 @@ class LocalTtsService {
|
||||
// 保留原有的播放逻辑用于完整文本处理
|
||||
Future<void> processCompleteText(String text) async {
|
||||
if (text.trim().isEmpty) {
|
||||
print("文本为空,跳过TTS处理");
|
||||
Logger.i("文本为空,跳过TTS处理");
|
||||
return;
|
||||
}
|
||||
|
||||
print("开始处理完整文本TTS,原始文本长度: ${text.length}字");
|
||||
Logger.i("开始处理完整文本TTS,原始文本长度: ${text.length}字");
|
||||
|
||||
// 清理缓存和重置队列
|
||||
clearAll();
|
||||
@@ -261,23 +261,23 @@ class LocalTtsService {
|
||||
Future<void> _processCompleteTextAsStream(String text) async {
|
||||
// 清理markdown和异常字符
|
||||
String cleanedText = _cleanTextForTts(text);
|
||||
print("清理后文本长度: ${cleanedText.length}字");
|
||||
Logger.i("清理后文本长度: ${cleanedText.length}字");
|
||||
|
||||
if (cleanedText.trim().isEmpty) {
|
||||
print("清理后文本为空,跳过TTS");
|
||||
Logger.i("清理后文本为空,跳过TTS");
|
||||
return;
|
||||
}
|
||||
|
||||
// 分割成句子并逐个处理
|
||||
List<String> sentences = _splitTextIntoSentences(cleanedText);
|
||||
print("=== 文本分段完成,共 ${sentences.length} 个句子 ===");
|
||||
Logger.i("=== 文本分段完成,共 ${sentences.length} 个句子 ===");
|
||||
|
||||
// 推送每个句子到流式TTS处理
|
||||
for (int i = 0; i < sentences.length; i++) {
|
||||
final sentence = sentences[i].trim();
|
||||
if (sentence.isEmpty) continue;
|
||||
|
||||
print("处理句子 ${i + 1}/${sentences.length}: $sentence");
|
||||
Logger.i("处理句子 ${i + 1}/${sentences.length}: $sentence");
|
||||
pushTextForStreamTTS(sentence);
|
||||
}
|
||||
|
||||
@@ -288,19 +288,19 @@ class LocalTtsService {
|
||||
// 停止当前播放的辅助方法
|
||||
Future<void> _stopCurrentPlayback() async {
|
||||
try {
|
||||
print("停止当前播放");
|
||||
Logger.i("停止当前播放");
|
||||
|
||||
if (_isPlaying) {
|
||||
await _flutterTts.stop();
|
||||
_isPlaying = false;
|
||||
print("TTS.stop() 调用完成");
|
||||
Logger.i("TTS.stop() 调用完成");
|
||||
}
|
||||
|
||||
// 短暂延迟确保播放器状态稳定
|
||||
await Future.delayed(Duration(milliseconds: 300));
|
||||
print("播放器状态稳定延迟完成");
|
||||
Logger.i("播放器状态稳定延迟完成");
|
||||
} catch (e) {
|
||||
print('停止当前播放错误: $e');
|
||||
Logger.i('停止当前播放错误: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -457,7 +457,7 @@ class LocalTtsService {
|
||||
await processCompleteText(text);
|
||||
return true;
|
||||
} catch (e) {
|
||||
print('TTS 播放错误: $e');
|
||||
Logger.i('TTS 播放错误: $e');
|
||||
_onErrorHandler?.call('TTS 播放错误: $e');
|
||||
return false;
|
||||
}
|
||||
@@ -469,7 +469,7 @@ class LocalTtsService {
|
||||
await _stopCurrentPlayback();
|
||||
clearAll();
|
||||
} catch (e) {
|
||||
print('停止音频播放错误: $e');
|
||||
Logger.i('停止音频播放错误: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,7 +479,7 @@ class LocalTtsService {
|
||||
await _flutterTts.pause();
|
||||
}
|
||||
} catch (e) {
|
||||
print('暂停音频播放错误: $e');
|
||||
Logger.i('暂停音频播放错误: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -487,9 +487,9 @@ class LocalTtsService {
|
||||
try {
|
||||
// flutter_tts没有resume方法,需要重新播放当前文本
|
||||
// 这里可以根据需要实现
|
||||
print('TTS不支持恢复,需要重新播放');
|
||||
Logger.i('TTS不支持恢复,需要重新播放');
|
||||
} catch (e) {
|
||||
print('恢复音频播放错误: $e');
|
||||
Logger.i('恢复音频播放错误: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -537,7 +537,7 @@ class LocalTtsService {
|
||||
dynamic engines = await _flutterTts.getEngines;
|
||||
return engines ?? [];
|
||||
} catch (e) {
|
||||
print('获取TTS引擎列表失败: $e');
|
||||
Logger.i('获取TTS引擎列表失败: $e');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -546,10 +546,10 @@ class LocalTtsService {
|
||||
Future<bool> setEngine(String engineName) async {
|
||||
try {
|
||||
int result = await _flutterTts.setEngine(engineName);
|
||||
print('设置TTS引擎: $engineName, 结果: $result');
|
||||
Logger.i('设置TTS引擎: $engineName, 结果: $result');
|
||||
return result == 1; // 1表示成功
|
||||
} catch (e) {
|
||||
print('设置TTS引擎失败: $e');
|
||||
Logger.i('设置TTS引擎失败: $e');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -560,7 +560,7 @@ class LocalTtsService {
|
||||
dynamic engine = await _flutterTts.getDefaultEngine;
|
||||
return engine?.toString();
|
||||
} catch (e) {
|
||||
print('获取当前TTS引擎失败: $e');
|
||||
Logger.i('获取当前TTS引擎失败: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -571,7 +571,7 @@ class LocalTtsService {
|
||||
dynamic languages = await _flutterTts.getLanguages;
|
||||
return languages ?? [];
|
||||
} catch (e) {
|
||||
print('获取支持的语言列表失败: $e');
|
||||
Logger.i('获取支持的语言列表失败: $e');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
@@ -582,7 +582,7 @@ class LocalTtsService {
|
||||
dynamic result = await _flutterTts.isLanguageAvailable(language);
|
||||
return result == true;
|
||||
} catch (e) {
|
||||
print('检查语言可用性失败: $e');
|
||||
Logger.i('检查语言可用性失败: $e');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user