Browse Source

修复ios通话奔溃问题,语言不播报问题

newdev_shunjiawei
fdp 1 year ago
parent
commit
ccee0da9a6
  1. 11
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrToAsr.kt
  2. 33
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/IntegratedSpeechTranslationService.swift
  3. 56
      local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/VolcanoTranslationServiceImpl.swift

11
local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrToAsr.kt

@ -1315,7 +1315,16 @@ class VolcanoTranslationServiceImpl :
"ms-MY" to "ms", // 马来语(马来西亚) "ms-MY" to "ms", // 马来语(马来西亚)
"id-ID" to "id", // 印尼语(印尼) "id-ID" to "id", // 印尼语(印尼)
"fil-PH" to "tl", // 菲律宾语(菲律宾) "fil-PH" to "tl", // 菲律宾语(菲律宾)
"sv-SE" to "sv", // 瑞典语(瑞典)
"ro-RO" to "ro", // 罗马尼亚语(罗马尼亚)
"hu-HU" to "hu", // 匈牙利语(匈牙利)
"da-DK" to "da", // 丹麦语(丹麦)
"fi-FI" to "fi", // 芬兰语(芬兰)
"nb-NO" to "nb", // 挪威语(挪威)
"hr-HR" to "hr", // 克罗地亚语(克罗地亚)
"ca-ES" to "ca", // 加泰隆语
"mr-IN" to "mr", // 马拉地语(印度)
"ur-IN" to "ur", // 乌尔都语(印度)
// 欧洲 // 欧洲
"en-US" to "en", // 英语(美国) "en-US" to "en", // 英语(美国)
"en-GB" to "en", // 英语(英国) "en-GB" to "en", // 英语(英国)

33
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/IntegratedSpeechTranslationService.swift

@ -605,12 +605,35 @@ import os.log
audioProcessor?.stopMicrophoneCapture() audioProcessor?.stopMicrophoneCapture()
recordFile?.closeFile(isSave: true) recordFile?.closeFile(isSave: true)
// 等待当前处理完成 // 使用后台队列等待当前处理完成,避免阻塞主线程
while serviceState.isTranslating || serviceState.isSynthesizing { DispatchQueue.global(qos: .userInitiated).async { [weak self] in
Thread.sleep(forTimeInterval: 0.1) guard let self = self else { return }
}
// 设置超时时间,避免无限等待
let timeout = DispatchTime.now() + .seconds(5)
while (self.serviceState.isTranslating || self.serviceState.isSynthesizing) && DispatchTime.now() < timeout {
Thread.sleep(forTimeInterval: 0.1)
}
// 强制停止合成器(如果仍在运行)
if self.serviceState.isSynthesizing {
do {
try self.synthesizer?.stopSpeaking()
} catch {
os_log("停止语音合成失败: %@", log: self.log, type: .error, error.localizedDescription)
}
self.serviceState.isSynthesizing = false
os_log("停止连续语音翻译", log: log, type: .info) DispatchQueue.main.async {
self.eventCallback?.onStateChanged(component: "Synthesis", isActive: false)
}
}
DispatchQueue.main.async {
os_log("停止连续语音翻译", log: self.log, type: .info)
}
}
} catch { } catch {
os_log("停止翻译失败: %@", log: log, type: .error, error.localizedDescription) os_log("停止翻译失败: %@", log: log, type: .error, error.localizedDescription)

56
local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/VolcanoTranslationServiceImpl.swift

@ -24,6 +24,8 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
private var region = "cn-north-1" private var region = "cn-north-1"
private var maxRetryAttempts = 3 private var maxRetryAttempts = 3
private var timeout: TimeInterval = 10.0 private var timeout: TimeInterval = 10.0
private var isDisposed = false // 添加释放状态标志
private let disposeLock = NSLock() // 添加线程安全锁
// HTTP客户端 // HTTP客户端
private lazy var urlSession: URLSession = { private lazy var urlSession: URLSession = {
@ -52,7 +54,16 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
"ms-MY": "ms", // 马来语(马来西亚) "ms-MY": "ms", // 马来语(马来西亚)
"id-ID": "id", // 印尼语(印尼) "id-ID": "id", // 印尼语(印尼)
"fil-PH": "tl", // 菲律宾语(菲律宾) "fil-PH": "tl", // 菲律宾语(菲律宾)
"sv-SE": "sv", // 瑞典语(瑞典)
"ro-RO": "ro", // 罗马尼亚语(罗马尼亚)
"hu-HU": "hu", // 匈牙利语(匈牙利)
"da-DK": "da", // 丹麦语(丹麦)
"fi-FI": "fi", // 芬兰语(芬兰)
"nb-NO": "nb", // 挪威语(挪威)
"hr-HR": "hr", // 克罗地亚语(克罗地亚)
"ca-ES": "ca", // 加泰隆语
"mr-IN": "mr", // 马拉地语(印度)
"ur-IN": "ur", // 乌尔都语(印度)
// 欧洲 // 欧洲
"en-US": "en", // 英语(美国) "en-US": "en", // 英语(美国)
"en-GB": "en", // 英语(英国) "en-GB": "en", // 英语(英国)
@ -150,11 +161,25 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
/** /**
* 释放资源 * 释放资源
* 添加线程安全保护,防止重复释放
*/ */
public func dispose() { public func dispose() {
disposeLock.lock()
defer { disposeLock.unlock() }
if isDisposed {
os_log("翻译服务已经释放,跳过重复释放", log: log, type: .info)
return
}
os_log("开始释放翻译服务资源", log: log, type: .info)
isDisposed = true
isInitialized = false isInitialized = false
// 取消并失效URLSession
urlSession.invalidateAndCancel() urlSession.invalidateAndCancel()
os_log("火山翻译服务已释放", log: log, type: .info)
os_log("翻译服务资源释放完成", log: log, type: .info)
} }
// MARK: - Private Methods // MARK: - Private Methods
@ -203,6 +228,7 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
/** /**
* 执行翻译 * 执行翻译
* 添加服务状态检查,防止在已释放的会话中创建任务
*/ */
private func performTranslation( private func performTranslation(
text: String, text: String,
@ -210,6 +236,19 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
targetLanguage: String targetLanguage: String
) async -> IntegratedSpeechTranslationService.TranslationResult { ) async -> IntegratedSpeechTranslationService.TranslationResult {
// 检查服务是否已被释放
disposeLock.lock()
let disposed = isDisposed
disposeLock.unlock()
if disposed {
os_log("翻译服务已释放,取消翻译请求", log: log, type: .error)
return IntegratedSpeechTranslationService.TranslationResult(
success: false,
error: "翻译服务已释放"
)
}
do { do {
// 转换语言代码 // 转换语言代码
let sourceCode = getLanguageCode(languageCode: sourceLanguage) let sourceCode = getLanguageCode(languageCode: sourceLanguage)
@ -263,6 +302,19 @@ public class VolcanoTranslationServiceImpl: IntegratedSpeechTranslationService.T
os_log("发送翻译请求到: %@", log: log, type: .debug, url.absoluteString) os_log("发送翻译请求到: %@", log: log, type: .debug, url.absoluteString)
// 再次检查服务状态,防止在请求构建过程中被释放
disposeLock.lock()
let stillDisposed = isDisposed
disposeLock.unlock()
if stillDisposed {
os_log("翻译服务在请求过程中被释放,取消网络请求", log: log, type: .error)
return IntegratedSpeechTranslationService.TranslationResult(
success: false,
error: "翻译服务已释放"
)
}
// 发送请求 // 发送请求
let (data, response) = try await urlSession.data(for: request) let (data, response) = try await urlSession.data(for: request)

Loading…
Cancel
Save