Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
tanlongsheng 10 months ago
parent
commit
33828062ff
  1. 143
      lib/modules/picture_translation/controllers/picture_translation_controller.dart
  2. 2
      lib/modules/picture_translation/views/picture_translation_view.dart
  3. 141
      lib/modules/text_translation/controllers/text_translation_controller.dart
  4. 67
      lib/modules/translation/controllers/translation_controller.dart
  5. 10
      local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt
  6. 8
      local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift

143
lib/modules/picture_translation/controllers/picture_translation_controller.dart

@ -26,13 +26,15 @@ class PictureTranslationController extends GetxController {
final LanguageManager languageManager = Get.find<LanguageManager>();
// UI状态
final sourceLanguageChineseName = '中文(简体)'.obs;
final sourceLanguageChineseName = 'autoDetect'.obs;
final targetLanguageChineseName = '英语'.obs;
final sourceText = ''.obs;
final translatedText = ''.obs;
final translatedImageBytes = Rx<Uint8List?>(null); // 回贴后的图片二进制
final isProcessing = false.obs;
final pickedImageFile = Rx<File?>(null);
final isSourceLanguageUserSet = false.obs;
final isTargetLanguageUserSet = false.obs;
final currentStep = ProcessingStep(
title: 'waitingForAction'.tr, // 等待操作
description: 'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译
@ -49,6 +51,7 @@ class PictureTranslationController extends GetxController {
static const String _historyKey = 'picture_translation_history';
static const String _settingsKey = 'picture_translation_settings';
String? _lastDetectedSourceLanguageCode;
@override
void onInit() {
@ -68,11 +71,76 @@ class PictureTranslationController extends GetxController {
try {
final settings = _storage.read(_settingsKey) as Map<String, dynamic>?;
if (settings != null) {
sourceLanguageChineseName.value =
settings['sourceLanguage'] ?? '中文(简体)';
targetLanguageChineseName.value = settings['targetLanguage'] ?? '英语';
final langs = languageManager.getAllChineseNames();
final appDefaultTargetLanguage = _getLanguageByAppLocale();
final bool sourceUserSet =
(settings['sourceLanguageUserSet'] == true) ||
((settings['sourceLanguageUserSet'] == null) &&
(settings['sourceLanguage'] != null) &&
(settings['sourceLanguage'] != '中文(简体)'));
bool targetUserSet = settings['targetLanguageUserSet'] == true;
final bool shouldMigrateTargetUserSetKey =
settings['targetLanguageUserSet'] == null;
if (shouldMigrateTargetUserSetKey) {
final savedTargetLanguage = settings['targetLanguage'];
if (savedTargetLanguage != null &&
appDefaultTargetLanguage != null &&
savedTargetLanguage == appDefaultTargetLanguage) {
settings.remove('targetLanguage');
targetUserSet = false;
} else {
targetUserSet = savedTargetLanguage != null &&
savedTargetLanguage != 'autoDetect' &&
savedTargetLanguage != '英语';
}
}
isSourceLanguageUserSet.value = sourceUserSet;
isTargetLanguageUserSet.value = targetUserSet;
final savedSourceLanguage = settings['sourceLanguage'];
if (sourceUserSet &&
savedSourceLanguage != null &&
(savedSourceLanguage == 'autoDetect' ||
langs.contains(savedSourceLanguage))) {
sourceLanguageChineseName.value = savedSourceLanguage;
} else {
sourceLanguageChineseName.value = 'autoDetect';
}
final savedTargetLanguage = settings['targetLanguage'];
if (targetUserSet &&
savedTargetLanguage != null &&
savedTargetLanguage != 'autoDetect' &&
langs.contains(savedTargetLanguage)) {
targetLanguageChineseName.value = savedTargetLanguage;
} else {
if (appDefaultTargetLanguage != null &&
langs.contains(appDefaultTargetLanguage)) {
targetLanguageChineseName.value = appDefaultTargetLanguage;
} else {
targetLanguageChineseName.value = '英语';
}
}
if (shouldMigrateTargetUserSetKey) {
_saveSettings();
}
imageQuality.value = settings['imageQuality'] ?? 85;
maxImageSize.value = settings['maxImageSize'] ?? 1920;
} else {
final appDefaultTargetLanguage = _getLanguageByAppLocale();
final langs = languageManager.getAllChineseNames();
if (appDefaultTargetLanguage != null &&
langs.contains(appDefaultTargetLanguage)) {
targetLanguageChineseName.value = appDefaultTargetLanguage;
} else {
targetLanguageChineseName.value = '英语';
}
}
} catch (e) {
Logger.error('PictureTranslation', '加载设置失败: $e');
@ -83,8 +151,12 @@ class PictureTranslationController extends GetxController {
void _saveSettings() {
try {
_storage.write(_settingsKey, {
if (isSourceLanguageUserSet.value)
'sourceLanguage': sourceLanguageChineseName.value,
if (isTargetLanguageUserSet.value)
'targetLanguage': targetLanguageChineseName.value,
'sourceLanguageUserSet': isSourceLanguageUserSet.value,
'targetLanguageUserSet': isTargetLanguageUserSet.value,
'imageQuality': imageQuality.value,
'maxImageSize': maxImageSize.value,
});
@ -323,7 +395,7 @@ class PictureTranslationController extends GetxController {
final targetCode = languageManager
.getAsrCodeByChineseName(targetLanguageChineseName.value) ??
'zh-CN';
'en-US';
final result = await _translationService.translateImage(
imageBytes: bytes,
@ -355,6 +427,9 @@ class PictureTranslationController extends GetxController {
sourceText.value = '';
translatedText.value = '';
}
_lastDetectedSourceLanguageCode =
_resolveDetectedSourceLanguageAsrCode(result);
} catch (e) {
Logger.error('PictureTranslation', '图片翻译调用失败: $e');
_updateStep(
@ -370,9 +445,17 @@ class PictureTranslationController extends GetxController {
/// 保存翻译结果
Future<void> _saveTranslationResult(File imageFile) async {
try {
final sourceCode = languageManager
String sourceCode = 'zh-CN';
if (isSourceLanguageUserSet.value &&
sourceLanguageChineseName.value != 'autoDetect') {
sourceCode = languageManager
.getAsrCodeByChineseName(sourceLanguageChineseName.value) ??
'zh-CN';
} else if (_lastDetectedSourceLanguageCode != null &&
_lastDetectedSourceLanguageCode!.isNotEmpty) {
sourceCode = _lastDetectedSourceLanguageCode!;
}
final targetCode = languageManager
.getAsrCodeByChineseName(targetLanguageChineseName.value) ??
'en-US';
@ -413,6 +496,7 @@ class PictureTranslationController extends GetxController {
void setSourceLanguage(String language) {
if (sourceLanguageChineseName.value != language) {
sourceLanguageChineseName.value = language;
isSourceLanguageUserSet.value = language != 'autoDetect';
_saveSettings();
}
}
@ -420,13 +504,20 @@ class PictureTranslationController extends GetxController {
/// 设置目标语言
void setTargetLanguage(String language) {
if (targetLanguageChineseName.value != language) {
if (language == 'autoDetect') return;
targetLanguageChineseName.value = language;
isTargetLanguageUserSet.value = true;
_saveSettings();
}
}
/// 交换语言
void swapLanguages() {
if (sourceLanguageChineseName.value == 'autoDetect' ||
targetLanguageChineseName.value == 'autoDetect') {
return;
}
final temp = sourceLanguageChineseName.value;
sourceLanguageChineseName.value = targetLanguageChineseName.value;
targetLanguageChineseName.value = temp;
@ -436,6 +527,8 @@ class PictureTranslationController extends GetxController {
sourceText.value = translatedText.value;
translatedText.value = tempText;
isSourceLanguageUserSet.value = true;
isTargetLanguageUserSet.value = true;
_saveSettings();
}
@ -460,4 +553,42 @@ class PictureTranslationController extends GetxController {
'pleaseSelectImageToStart'.tr, // 请选择图片开始翻译
ProcessingStatus.idle);
}
String? _getLanguageByAppLocale() {
final Locale? locale = Get.locale ?? Get.deviceLocale;
if (locale == null) return null;
final languageCode = locale.languageCode.toLowerCase();
final countryCode = locale.countryCode?.toUpperCase();
final scriptCode = locale.scriptCode;
if (languageCode == 'zh') {
if (countryCode == 'HK' || countryCode == 'MO') {
return languageManager.getChineseNameByAsrCode('zh-HK');
}
if (countryCode == 'TW') {
return languageManager.getChineseNameByAsrCode('zh-TW');
}
if (scriptCode == 'Hant') {
return languageManager.getChineseNameByAsrCode('zh-TW');
}
return languageManager.getChineseNameByAsrCode('zh-CN');
}
final normalizedShortCode = switch (languageCode) {
'nb' => 'no',
_ => languageCode,
};
return languageManager.getChineseNameByShortCode(normalizedShortCode);
}
String? _resolveDetectedSourceLanguageAsrCode(ImageTranslationResult result) {
final shortCode = result.detectedLanguage ??
(result.blocks.isNotEmpty
? result.blocks.first.detectedLanguage
: null);
if (shortCode == null || shortCode.isEmpty) return null;
return languageManager.getAsrCodeByShortCode(shortCode);
}
}

2
lib/modules/picture_translation/views/picture_translation_view.dart

@ -242,7 +242,7 @@ class PictureTranslationView extends GetView<PictureTranslationController> {
isDarkMode,
languages: langs,
currentLanguage: currentLanguage,
includeAutoDetect: true, // 图片翻译也支持自动检测
includeAutoDetect: isSource,
translateLanguageNames: true, // 开启多语言显示,语言中文名作为翻译键
onSelected: (name) {
if (isSource) {

141
lib/modules/text_translation/controllers/text_translation_controller.dart

@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../../data/services/volcano_translation_service.dart';
import '../../../data/services/language_manager.dart';
@ -17,13 +16,20 @@ class TextTranslationController extends GetxController {
final LanguageManager _languageManager = Get.find<LanguageManager>();
final GetStorage _storage = GetStorage();
static const String _sourceLanguageKey = 'text_translation_source_language';
static const String _targetLanguageKey = 'text_translation_target_language';
static const String _sourceLanguageUserSetKey =
'text_translation_source_language_user_set';
static const String _targetLanguageUserSetKey =
'text_translation_target_language_user_set';
// 文本输入控制器
final TextEditingController textController = TextEditingController();
// 响应式状态
final sourceLanguageChineseName = '中文(简体)'.obs;
final sourceLanguageChineseName = 'autoDetect'.obs;
final targetLanguageChineseName = '英语'.obs;
final sourceLanguageCode = 'zh-CN'.obs;
final sourceLanguageCode = ''.obs;
final targetLanguageCode = 'en-US'.obs;
final translatedText = ''.obs;
final isTranslating = false.obs;
@ -83,44 +89,78 @@ class TextTranslationController extends GetxController {
/// 加载保存的语言设置
void _loadSavedLanguages() {
try {
final savedSourceLanguage =
_storage.read('text_translation_source_language');
final savedTargetLanguage =
_storage.read('text_translation_target_language');
final String? savedSourceLanguage = _storage.read(_sourceLanguageKey);
String? savedTargetLanguage = _storage.read(_targetLanguageKey);
final appDefaultTargetLanguage = _getLanguageByAppLocale();
final bool sourceUserSet =
_storage.read(_sourceLanguageUserSetKey) ?? false;
bool targetUserSet = _storage.read(_targetLanguageUserSetKey) ?? false;
final bool targetUserSetKeyExists =
_storage.hasData(_targetLanguageUserSetKey);
if (!targetUserSetKeyExists) {
if (savedTargetLanguage != null &&
appDefaultTargetLanguage != null &&
savedTargetLanguage == appDefaultTargetLanguage) {
savedTargetLanguage = null;
_storage.remove(_targetLanguageKey);
targetUserSet = false;
} else {
targetUserSet = savedTargetLanguage != null;
}
_storage.write(_targetLanguageUserSetKey, targetUserSet);
}
if (savedSourceLanguage != null &&
supportedLanguages.contains(savedSourceLanguage)) {
if (sourceUserSet &&
savedSourceLanguage != null &&
(savedSourceLanguage == 'autoDetect' ||
supportedLanguages.contains(savedSourceLanguage))) {
sourceLanguageChineseName.value = savedSourceLanguage;
// 同时更新语言代码
if (savedSourceLanguage == 'autoDetect') {
sourceLanguageCode.value = '';
} else {
final asrCode =
_languageManager.getAsrCodeByChineseName(savedSourceLanguage);
if (asrCode != null) {
sourceLanguageCode.value = asrCode;
if (asrCode != null) sourceLanguageCode.value = asrCode;
}
} else {
sourceLanguageChineseName.value = 'autoDetect';
sourceLanguageCode.value = '';
}
if (savedTargetLanguage != null &&
if (targetUserSet &&
savedTargetLanguage != null &&
savedTargetLanguage != 'autoDetect' &&
supportedLanguages.contains(savedTargetLanguage)) {
targetLanguageChineseName.value = savedTargetLanguage;
// 同时更新语言代码
final asrCode =
_languageManager.getAsrCodeByChineseName(savedTargetLanguage);
if (asrCode != null) {
targetLanguageCode.value = asrCode;
}
if (asrCode != null) targetLanguageCode.value = asrCode;
} else if (appDefaultTargetLanguage != null &&
supportedLanguages.contains(appDefaultTargetLanguage)) {
targetLanguageChineseName.value = appDefaultTargetLanguage;
final asrCode =
_languageManager.getAsrCodeByChineseName(appDefaultTargetLanguage);
if (asrCode != null) targetLanguageCode.value = asrCode;
} else {
targetLanguageChineseName.value = '英语';
targetLanguageCode.value = 'en-US';
}
} catch (e) {
Logger.error('加载语言设置失败: $e');
}
}
/// 保存语言设置
void _saveLanguageSettings() {
void _saveLanguageSettings(
{required bool saveSource, required bool saveTarget}) {
try {
_storage.write(
'text_translation_source_language', sourceLanguageChineseName.value);
_storage.write(
'text_translation_target_language', targetLanguageChineseName.value);
if (saveSource) {
_storage.write(_sourceLanguageKey, sourceLanguageChineseName.value);
}
if (saveTarget) {
_storage.write(_targetLanguageKey, targetLanguageChineseName.value);
}
} catch (e) {
Logger.error('保存语言设置失败: $e');
}
@ -131,7 +171,6 @@ class TextTranslationController extends GetxController {
if (language != sourceLanguageChineseName.value) {
sourceLanguageChineseName.value = language;
// 同时更新语言代码;当选择“自动检测”时,将源语言代码置空,后续翻译流程会进行语种检测
if (language == 'autoDetect') {
sourceLanguageCode.value = '';
} else {
@ -141,7 +180,11 @@ class TextTranslationController extends GetxController {
}
}
_saveLanguageSettings();
_storage.write(
_sourceLanguageUserSetKey,
language != 'autoDetect',
);
_saveLanguageSettings(saveSource: true, saveTarget: false);
// 如果已有翻译结果,清空结果
if (translatedText.value.isNotEmpty) {
@ -161,7 +204,8 @@ class TextTranslationController extends GetxController {
targetLanguageCode.value = asrCode;
}
_saveLanguageSettings();
_storage.write(_targetLanguageUserSetKey, true);
_saveLanguageSettings(saveSource: false, saveTarget: true);
// 如果已有翻译结果,清空结果
if (translatedText.value.isNotEmpty) {
@ -172,6 +216,11 @@ class TextTranslationController extends GetxController {
/// 交换源语言和目标语言
void swapLanguages() {
if (sourceLanguageChineseName.value == 'autoDetect' ||
targetLanguageChineseName.value == 'autoDetect') {
return;
}
final tempSource = sourceLanguageChineseName.value;
final tempTarget = targetLanguageChineseName.value;
final tempSourceCode = sourceLanguageCode.value;
@ -188,7 +237,9 @@ class TextTranslationController extends GetxController {
textController.text = tempTranslatedText;
translatedText.value = tempInputText;
_saveLanguageSettings();
_storage.write(_sourceLanguageUserSetKey, true);
_storage.write(_targetLanguageUserSetKey, true);
_saveLanguageSettings(saveSource: true, saveTarget: true);
}
/// 执行翻译
@ -269,6 +320,11 @@ class TextTranslationController extends GetxController {
Logger.info('语种检测结果: $detectedAsrCode');
}
if (sourceLanguageCode.value == targetLanguageCode.value) {
translatedText.value = text;
return;
}
// 调用翻译服务,使用检测或手动选择的源语言代码
final result = await _translationService.translateText(
text: text,
@ -331,7 +387,7 @@ class TextTranslationController extends GetxController {
currentLanguage: isSourceLanguage
? sourceLanguageChineseName.value
: targetLanguageChineseName.value,
includeAutoDetect: true, // 文本翻译源语言保留“自动检测”
includeAutoDetect: isSourceLanguage,
translateLanguageNames: true, // 开启多语言显示,语言中文名作为翻译键
onSelected: (name) {
if (isSourceLanguage) {
@ -342,4 +398,33 @@ class TextTranslationController extends GetxController {
},
);
}
String? _getLanguageByAppLocale() {
final Locale? locale = Get.locale ?? Get.deviceLocale;
if (locale == null) return null;
final languageCode = locale.languageCode.toLowerCase();
final countryCode = locale.countryCode?.toUpperCase();
final scriptCode = locale.scriptCode;
if (languageCode == 'zh') {
if (countryCode == 'HK' || countryCode == 'MO') {
return _languageManager.getChineseNameByAsrCode('zh-HK');
}
if (countryCode == 'TW') {
return _languageManager.getChineseNameByAsrCode('zh-TW');
}
if (scriptCode == 'Hant') {
return _languageManager.getChineseNameByAsrCode('zh-TW');
}
return _languageManager.getChineseNameByAsrCode('zh-CN');
}
final normalizedShortCode = switch (languageCode) {
'nb' => 'no',
_ => languageCode,
};
return _languageManager.getChineseNameByShortCode(normalizedShortCode);
}
}

67
lib/modules/translation/controllers/translation_controller.dart

@ -79,6 +79,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
// 存储相关配置
static const String _sourceLanguageKey = 'translation_source_language';
static const String _targetLanguageKey = 'translation_target_language';
static const String _sourceLanguageUserSetKey =
'translation_source_language_user_set';
// 添加悬浮按钮位置存储键
static const String _floatingButtonPositionKey = 'floating_button_position';
@ -544,16 +546,27 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
/// 加载保存的语言设置
void _loadSavedLanguages() {
final appDefaultSourceLanguage = _getSourceLanguageByAppLocale();
final savedSourceLanguage = _storage.read(_sourceLanguageKey);
final savedTargetLanguage = _storage.read(_targetLanguageKey);
final bool isSourceLanguageUserSet =
(_storage.read(_sourceLanguageUserSetKey) ?? false) == true;
if (savedSourceLanguage != null &&
supportedLanguages.containsKey(savedSourceLanguage)) {
final bool isSavedSourceValid = savedSourceLanguage != null &&
supportedLanguages.containsKey(savedSourceLanguage);
final bool isSavedTargetValid = savedTargetLanguage != null &&
supportedLanguages.containsKey(savedTargetLanguage);
if (isSourceLanguageUserSet && isSavedSourceValid) {
sourceLanguage.value = savedSourceLanguage;
} else if (appDefaultSourceLanguage != null &&
supportedLanguages.containsKey(appDefaultSourceLanguage)) {
sourceLanguage.value = appDefaultSourceLanguage;
} else if (isSavedSourceValid) {
sourceLanguage.value = savedSourceLanguage;
}
if (savedTargetLanguage != null &&
supportedLanguages.containsKey(savedTargetLanguage)) {
if (isSavedTargetValid) {
targetLanguage.value = savedTargetLanguage;
}
@ -580,12 +593,47 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
});
}
/// 保存当前语言设置
void _saveLanguageSettings() {
void _saveSourceLanguageSetting({required bool isUserSet}) {
_storage.write(_sourceLanguageKey, sourceLanguage.value);
if (isUserSet) {
_storage.write(_sourceLanguageUserSetKey, true);
}
}
void _saveTargetLanguageSetting() {
_storage.write(_targetLanguageKey, targetLanguage.value);
}
///根据当前系统语言获取默认源语言
String? _getSourceLanguageByAppLocale() {
final Locale? locale = Get.locale ?? Get.deviceLocale;
if (locale == null) return null;
final languageCode = locale.languageCode.toLowerCase();
final countryCode = locale.countryCode?.toUpperCase();
final scriptCode = locale.scriptCode;
if (languageCode == 'zh') {
if (countryCode == 'HK' || countryCode == 'MO') {
return _languageManager.getChineseNameByAsrCode('zh-HK');
}
if (countryCode == 'TW') {
return _languageManager.getChineseNameByAsrCode('zh-TW');
}
if (scriptCode == 'Hant') {
return _languageManager.getChineseNameByAsrCode('zh-TW');
}
return _languageManager.getChineseNameByAsrCode('zh-CN');
}
final normalizedShortCode = switch (languageCode) {
'nb' => 'no',
_ => languageCode,
};
return _languageManager.getChineseNameByShortCode(normalizedShortCode);
}
/// 请求录音权限
/// 返回是否授权成功
Future<bool> requestRecordPermission() async {
@ -1581,7 +1629,8 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
sourceLanguageCode.value = targetLanguageCode.value;
targetLanguageCode.value = tempCode;
_saveLanguageSettings();
_saveSourceLanguageSetting(isUserSet: true);
_saveTargetLanguageSetting();
_reinitializeAsrService();
}
@ -1598,7 +1647,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
sourceLanguageCode.value = asrCode;
}
_saveLanguageSettings();
_saveSourceLanguageSetting(isUserSet: true);
_reinitializeAsrService();
}
}
@ -1616,7 +1665,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver {
targetLanguageCode.value = asrCode;
}
_saveLanguageSettings();
_saveTargetLanguageSetting();
_reinitializeAsrService();
}
}

10
local_plugins/agent_service/android/src/main/kotlin/com/yunqiinnovation/agent_service/AgentService.kt

@ -383,7 +383,7 @@ object AgentService : CoroutineScope {
restartIdleCheck()
sendEvent("tts_started", mapOf("status" to "started"))
// 停止气泡音,避免与TTS同时播放
// audioPlayer?.stopAudio()
}
TtsEventType.SYNTHESIS_COMPLETED -> {
@ -404,7 +404,7 @@ object AgentService : CoroutineScope {
restartIdleCheck()
sendEvent("playback_started", mapOf("status" to "playback_started"))
// 确保气泡音已停止,避免与TTS播放重叠
// audioPlayer?.stopAudio()
audioPlayer?.stopAudio()
if(_isInterrupt.get()){
BleService.closeCodec()
}
@ -1119,7 +1119,7 @@ object AgentService : CoroutineScope {
if (reply && token.isNotEmpty()) {
// 发送流式回复token
sendEvent("assistant_token", mapOf("sessionid" to sessionid,"token" to token))
audioPlayer?.stopAudio()
// audioPlayer?.stopAudio()
}
} catch (e: Exception) {
Log.e(TAG, "liwei--------------- AI Call onToken 异常", e)
@ -1231,9 +1231,7 @@ object AgentService : CoroutineScope {
try {
Log.d(
TAG,
"liwei--------------- AI Call onFunctionCallResult ${sessionid}:${functionCallResult.toString()}",
)
"liwei--------------- AI Call onFunctionCallResult ${sessionid}:${functionCallResult.toString()}",)
audioPlayer?.stopAudio()
val name = functionCall.get("name") as String;
val resultmap = autoHandleFcunCallResult(name, functionCallResult);

8
local_plugins/agent_service/ios/agent_service/Sources/agent_service/AgentServiceImpl.swift

@ -1701,9 +1701,9 @@ class ChatApiStreamCallback: StreamCallback {
return
}
if (token != "" && responseBuilder.isEmpty) { //关闭声音
try agentService.audioPlayer?.stopAwaitSound()
}
// if (token != "" && responseBuilder.isEmpty) { //关闭声音
// try agentService.audioPlayer?.stopAwaitSound()
// }
responseBuilder += token
if speakResponse && reply && broadcast{
@ -1892,7 +1892,6 @@ extension AgentServiceImpl: TtsEventListener {
isSpeaking = true
restartIdleCheck()
sendEvent(name: "tts_started", data: ["status": "started"])
// audioPlayer?.stopAwaitSound()
case .synthesisCompleted:
isSpeaking = false
@ -1902,6 +1901,7 @@ extension AgentServiceImpl: TtsEventListener {
case .playbackStarted:
restartIdleCheck()
sendEvent(name: "playback_started", data: ["status": "playback_started"])
audioPlayer?.stopAwaitSound()
MusicService.shared.reduceVolume()
if(isInterrupt){ //播报开始。打断唤醒输入
BleService.shared.closeCodec()

Loading…
Cancel
Save