Browse Source

Merge commit '188bca06ba908ecc518103ce70e950655642718f' into new_dev

newdev_shunjiawei
lxm 1 year ago
parent
commit
068b237862
  1. 5
      lib/data/services/bluetooth_manager.dart
  2. 100
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift

5
lib/data/services/bluetooth_manager.dart

@ -3,6 +3,7 @@ import 'package:get/get.dart';
import 'package:classic_bluetooth/classic_bluetooth.dart';
import '../../core/utils/logger.dart';
import '../../routes/app_routes.dart';
import 'ble_manager.dart';
// 重新导出蓝牙设备类型,让外部可以通过BluetoothManager访问
export 'package:classic_bluetooth/classic_bluetooth.dart' show BluetoothDevice;
@ -19,7 +20,7 @@ class BluetoothManager extends GetxService {
// 当前经典蓝牙设备
final Rx<BluetoothDevice?> currentDeviceRx = Rx<BluetoothDevice?>(null);
BluetoothDevice? get currentDevice => currentDeviceRx.value;
final BleManager _bleManager = Get.find<BleManager>();
// 订阅
StreamSubscription<BluetoothEvent>? _bluetoothSubscription;
@ -75,7 +76,7 @@ class BluetoothManager extends GetxService {
currentDeviceRx.value = newDevice;
// 检查当前是否在OTA升级界面,如果是则不跳转
if (!_isInOtaUpgradePage()) {
if (!_isInOtaUpgradePage() && !_bleManager.isConnected) {
Get.toNamed(Routes.pairing, arguments: newDevice);
} else {
Logger.info('当前在OTA升级界面,跳过配对页面跳转');

100
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift

@ -264,74 +264,44 @@ public class AzureTtsHelper: NSObject, ITtsService {
pendingTasks.removeAll()
taskLock.unlock()
// 使用异步停止方法并等待完成
let stopGroup = DispatchGroup()
stopGroup.enter()
synthesisQueue.async { [weak self] in
guard let self = self else {
stopGroup.leave()
return
}
do {
print("liwei-------------停止语音合成播放")
try self.synthesizer?.stopSpeaking()
self.notifyEvent(eventType: .synthesisCanceled)
if !micCapture.isCapturing{
// 停止时设置音频会话为非活跃状态
// try AVAudioSession.sharedInstance().setActive(false)
}
print("音频会话已设置为非活跃状态")
} catch {
os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
self.notifyEvent(eventType: .error, params: [
"errorCode": "STOP_FAILED",
"errorMessage": error.localizedDescription
])
}
synthesisQueue.async {
do {
print("liwei-------------停止语音合成播放")
// 使用同步停止方法
if let synthesizer = self.synthesizer {
try synthesizer.stopSpeaking()
}
self.notifyEvent(eventType: .synthesisCanceled)
if !self.micCapture.isCapturing {
// 停止时设置音频会话为非活跃状态
// try AVAudioSession.sharedInstance().setActive(false)
}
print("音频会话已设置为非活跃状态")
// 等待所有合成操作完成后再重新创建
self.synthesisGroup.wait()
// 安全地销毁和重新创建合成器
self.synthesizer = nil
try self.recreateSynthesizer()
} catch {
os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
self.notifyEvent(eventType: .error, params: [
"errorCode": "STOP_FAILED",
"errorMessage": error.localizedDescription
])
}catch {
os_log("重置语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
}
stopGroup.leave()
}
// 等待停止操作完成
stopGroup.wait()
return true
}
/**
* 释放资源
*/
public func dispose() {
// 先停止所有操作
_ = stop()
// 等待所有异步操作完成
synthesisGroup.wait()
synthesisQueue.sync {
// 确保合成器完全停止后再销毁
if let synthesizer = self.synthesizer {
do {
try synthesizer.stopSpeaking()
} catch {
os_log("停止合成器失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
}
}
synthesizer = nil
speechConfig = nil
customAudioOutputStream = nil
@ -471,45 +441,29 @@ public class AzureTtsHelper: NSObject, ITtsService {
/**
* 执行语音合成
*/
private func performSynthesis(sessionid: String, text: String) {
private func performSynthesis(sessionid:String,text: String) {
if (self.sessionid != sessionid) {
return
}
// 进入合成组
synthesisGroup.enter()
speaking = true
// lastSpokenText = text
// 生成SSML
let ssml = generateOptimizedSsml(text)
do {
if (self.sessionid != sessionid) {
synthesisGroup.leave()
return
}
os_log("开始合成: %{public}@", log: log, type: .debug, ssml)
let result = try synthesizer?.startSpeakingSsml(ssml)
// 使用同步合成方法
if let synthesizer = self.synthesizer {
do {
try synthesizer.startSpeakingSsml(ssml)
os_log("合成开始成功", log: self.log, type: .debug)
} catch {
self.speaking = false
os_log("合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription)
self.notifyEvent(eventType: .error, params: [
"errorCode": "SYNTHESIS_FAILED",
"errorMessage": error.localizedDescription
])
}
if let result = result {
os_log("合成完成,结果: %{public}@", log: log, type: .debug, String(describing: result.reason))
}
} catch {
speaking = false
// 减少待处理文本计数
pendingTextCount = max(0, pendingTextCount - text.count)
synthesisGroup.leave()
os_log("语音合成失败: %{public}@", log: log, type: .error, error.localizedDescription)
notifyEvent(eventType: .error, params: [
"errorCode": "SYNTHESIS_FAILED",

Loading…
Cancel
Save