You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS应用语音转文本后系统TTS无声音问题求助

解决语音转文本后文本转语音无输出的问题

嘿,我之前也遇到过一模一样的问题!应用启动时能正常朗读静态文本,但语音转文本拿到服务器结果后,苹果默认的TTS就没声音了,大概率是这几个坑在搞鬼,咱们一个个来填:

  • 检查AVSpeechSynthesizer的生命周期
    你现在的代码里,AVSpeechSynthesizer是在makeTextTalk方法里创建的局部变量,方法执行完ARC就会把它回收掉,合成器还没来得及发声就没了!得把它改成类的成员变量,保留强引用:
    首先在你的类声明里添加属性:

    @property (nonatomic, strong) AVSpeechSynthesizer *talkSynthesizer;
    

    然后修改makeTextTalk方法:

    -(void)makeTextTalk:(NSString *)phraseToSpeak{
        [self stopTalkingAPI];
        // 只有当合成器不存在时才初始化
        if (!self.talkSynthesizer) {
            self.talkSynthesizer = [[AVSpeechSynthesizer alloc] init];
            // 如果需要监听朗读状态,这里可以设置代理:self.talkSynthesizer.delegate = self;
        }
        // 构建朗读语句,记得设置语言等参数(比如中文的话用zh-CN)
        AVSpeechUtterance *utterance = [[AVSpeechUtterance alloc] initWithString:phraseToSpeak];
        utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
        [self.talkSynthesizer speakUtterance:utterance];
    }
    
  • 修复音频会话冲突
    语音转文本(比如用SFSpeechRecognizer)会占用音频会话,把模式改成录音模式,完成后如果不切换回播放模式,TTS就拿不到音频输出权限。你需要在语音转文本完成的回调里重置音频会话:

    // 语音转文本完成后的回调方法中添加:
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *sessionError = nil;
    // 设置为播放模式,允许和其他音频混合(避免影响其他APP的声音)
    [audioSession setCategory:AVAudioSessionCategoryPlayback 
                   withOptions:AVAudioSessionCategoryOptionMixWithOthers 
                         error:&sessionError];
    if (sessionError) {
        NSLog(@"音频会话设置失败:%@", sessionError.localizedDescription);
    }
    [audioSession activateWithOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation 
                                error:&sessionError];
    
  • 检查stopTalkingAPI的实现
    确保这个方法只是暂停/停止朗读,不要把合成器实例置空,不然下次调用又得重新创建,容易出问题:

    -(void)stopTalkingAPI{
        if (self.talkSynthesizer && [self.talkSynthesizer isSpeaking]) {
            // 立即停止朗读,或者用AVSpeechBoundaryWord来读完当前词
            [self.talkSynthesizer stopSpeakingAtBoundary:AVSpeechBoundaryImmediate];
            // 千万不要写 self.talkSynthesizer = nil; 除非你确定之后完全不用它了
        }
    }
    
  • 验证要朗读的文本内容
    有时候服务器返回的结果可能是空字符串、只有空格,这时候TTS自然没声音,加个简单的校验:

    -(void)makeTextTalk:(NSString *)phraseToSpeak{
        // 去除首尾空白字符
        NSString *cleanedPhrase = [phraseToSpeak stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if (cleanedPhrase.length == 0) {
            NSLog(@"要朗读的文本为空或仅包含空白字符");
            return;
        }
        // 后续的朗读逻辑...
    }
    

内容的提问来源于stack exchange,提问作者SwiftNinja95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:56:29