




















@@ -11,6 +11,7 @@ actor TalkModeRuntime {
11111212enum PlaybackPlan: Equatable {
1313case elevenLabsThenSystemVoice(apiKey: String, voiceId: String)
14+case gatewayTalkSpeakThenSystemVoice
1415case mlxThenSystemVoice
1516case systemVoiceOnly
1617}
@@ -504,6 +505,21 @@ actor TalkModeRuntime {
504505self.ttsLogger.error("talk system voice failed: \(error.localizedDescription, privacy: .public)")
505506}
506507}
508+case .gatewayTalkSpeakThenSystemVoice:
509+do {
510+try await self.playGatewayTalkSpeak(input: input)
511+return
512+} catch {
513+self.ttsLogger
514+.error(
515+"talk gateway TTS failed: \(error.localizedDescription, privacy: .public); " +
516+"falling back to system voice")
517+do {
518+try await self.playSystemVoice(input: input)
519+} catch {
520+self.ttsLogger.error("talk system voice failed: \(error.localizedDescription, privacy: .public)")
521+}
522+}
507523case .mlxThenSystemVoice:
508524do {
509525try await self.playMLX(input: input)
@@ -547,7 +563,7 @@ actor TalkModeRuntime {
547563case self.systemTalkProvider:
548564return .systemVoiceOnly
549565default:
550-return .systemVoiceOnly
566+return .gatewayTalkSpeakThenSystemVoice
551567}
552568}
553569@@ -614,8 +630,10 @@ actor TalkModeRuntime {
614630615631let voiceId: String? = if provider == Self.defaultTalkProvider, let apiKey, !apiKey.isEmpty {
616632await self.resolveVoiceId(preferred: preferredVoice, apiKey: apiKey)
617-} else {
633+} else if provider == Self.mlxTalkProvider || provider == Self.systemTalkProvider {
618634nil
635+} else {
636+ preferredVoice?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty == false ? preferredVoice : nil
619637}
620638621639if provider == Self.defaultTalkProvider, apiKey?.isEmpty != false {
@@ -1093,7 +1111,7 @@ extension TalkModeRuntime {
10931111} else {
10941112self.ttsLogger
10951113.info(
1096-"talk provider \(parsed.activeProvider, privacy: .public) unsupported; using system voice")
1114+"talk provider \(parsed.activeProvider, privacy: .public) uses gateway talk.speak with system voice fallback")
10971115}
10981116return parsed
10991117} catch {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。