|
|
@ -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) |
|
|
|
|
|
|
|
|
|