AVSpeechSynthesizer音量太低

时间:2018-12-04 18:08:08

标签: ios swift

我正在尝试使用Swift创建一个应用。

我正确集成了语音到文本和文本到语音:我的应用程序运行完美。您可以找到我的项目here

语音转文本后,该应用向服务器发出一个http请求(发送已识别的文本),然后以语音方式复制响应(它是一个字符串,即:“好,我会告诉你一些东西”)从文字到语音。但是,有一个大问题,我无法解决。

当应用程序以语音方式复制文本时,声音太慢了,好像它在背景中一样,好像有什么东西要比声音更重要(实际上什么都没有)。

调试时,我发现问题开始使用函数recordAndRecognizeSpeech()中的audioEngine(AVAudioEngine)。在不使用此功能的情况下运行该应用程序并播放随机文本,它的工作原理就像一个超级按钮。

所以,我认为当应用程序以语音方式复制文本时,它认为仍然有活动的音频引擎,因此音量非常慢。

但是,在复制文本之前,我调用了这些函数(在ac函数的内部,第96行):

  audioEngine.stop()
  audioEngine.reset()

我该如何解决这个问题?

编辑:
我找到了部分解决方案。现在,在应用程序大声播放文本之前,我的代码是:

   audioEngine.inputNode.removeTap(onBus: 0)
    audioEngine.stop()
    audioEngine.reset()
    recognitionTask?.cancel()
    isRecording = false
    microphoneButton.setTitle("Avvia..", for: UIControl.State.normal);
    do {
        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(AVAudioSession.Category.ambient)
        try audioSession.setActive(false, options: .notifyOthersOnDeactivation)     
    } catch {
        print(error)

    }
    make_request(msg: self.speech_result.text!)

.setCategory函数可以正常工作,其音量类似于默认音量。当我尝试调用recordAndRecognizeSpeech()函数时,该应用程序给了我以下异常:

VAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioIONodeImpl.mm:910:SetOutputFormat: (IsFormatSampleRateAndChannelCountValid(hwFormat))] 此异常是由.setCategory(AVAudioSession.Category.ambient)引起的,应为.playAndRecord,但使用此值,音量将恢复为较低。

2 个答案:

答案 0 :(得分:0)

尝试一下。 设置播放速度

 var speedd = AVSpeechSynthesizer()
 var voicert = AVSpeechUtterance()
 voicert = AVSpeechUtterance(string: "Your post appears to contain code that is not properly formatted as code. Please indent all code by 4 spaces using the code toolbar button or the CTRL+K keyboard shortcut. For more editing help, click the [?] toolbar icon")
 voicert.voice = AVSpeechSynthesisVoice(language: "en-US")
 voicert.rate = 0.5
 speedd.speak(voicert)

答案 1 :(得分:0)

尝试这个。

let speaker = AVSpeechSynthesizer()

func say(text: String, language: String) {
    // Start audio session
    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(AVAudioSession.Category.playAndRecord)
        try audioSession.setMode(AVAudioSession.Mode.default)
        try audioSession.setActive(true)
        try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
    } catch {
        return
    }
    
    if speaker.isSpeaking {
        speaker.stopSpeaking(at: .immediate)
    } else {
        myUtterance = AVSpeechUtterance(string: text)
        myUtterance.rate = AVSpeechUtteranceDefaultSpeechRate
        myUtterance.voice = AVSpeechSynthesisVoice(language: language)
        myUtterance.pitchMultiplier = 1
        myUtterance.volume = 2
        DispatchQueue.main.async {
            self.speaker.speak(myUtterance)
        }
    }
}