2017-03-13 33 views
0

我试图用演辞运行文本到语音(AVSpeechSynthesizer)从Siri的工具包文本,但我坚持了它。Siri的工具包(语音到文本)禁用我的TTS(文本到语音)的iOS

我的TTS完美的工作,直到我运行代码来执行STT,之后,我的TTS不再工作。我调试了代码,在代码执行期间,没有发生错误,但是我的文本没有转化为语音。我想不知道我的STT是否禁用了输出麦克风,这就是为什么TTS不能将文本转换为语音,嗯,这只是一个理论。 OPS:我的TTS停止工作,但是我的STT完美地工作

任何提示?

这里是我的viewController代码:

@IBOutlet weak var microphoneButton: UIButton!

//text to speech 
let speechSynthesizer = AVSpeechSynthesizer() 

//speech to text 
private var speechRecognizer: SFSpeechRecognizer! 

private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest? 
private var recognitionTask: SFSpeechRecognitionTask? 
private var audioEngine = AVAudioEngine() 

@IBAction func textToSpeech(_ sender: Any) { 

    if let word = wordTextField.text{ 

     if !speechSynthesizer.isSpeaking { 


      //get current dictionary 
      let dictionary = fetchSelectedDictionary() 

      //get current language 
      let language = languagesWithCodes[(dictionary?.language)!] 

      let speechUtterance = AVSpeechUtterance(string: word) 
       speechUtterance.voice = AVSpeechSynthesisVoice(language: language) 
       speechUtterance.rate = 0.4 
      //speechUtterance.pitchMultiplier = pitch 
      //speechUtterance.volume = volume 
       speechSynthesizer.speak(speechUtterance) 

     } 
     else{ 
      speechSynthesizer.continueSpeaking() 
     } 

    } 
} 

@IBAction func speechToText(_ sender: Any) { 

    if audioEngine.isRunning { 
     audioEngine.stop() 
     recognitionRequest?.endAudio() 
     microphoneButton.isEnabled = false 
     microphoneButton.setTitle("Start Recording", for: .normal) 
    } else { 
     startRecording() 
     microphoneButton.setTitle("Stop Recording", for: .normal) 
    } 

} 

func startRecording() { 

    if recognitionTask != nil { 
     recognitionTask?.cancel() 
     recognitionTask = nil 
    } 

    let audioSession = AVAudioSession.sharedInstance() 
    do { 
     try audioSession.setCategory(AVAudioSessionCategoryRecord) 
     try audioSession.setMode(AVAudioSessionModeMeasurement) 
     try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
    } catch { 
     print("audioSession properties weren't set because of an error.") 
    } 

    recognitionRequest = SFSpeechAudioBufferRecognitionRequest() 

    guard let inputNode = audioEngine.inputNode else { 
     fatalError("Audio engine has no input node") 
    } 

    guard let recognitionRequest = recognitionRequest else { 
     fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object") 
    } 

    recognitionRequest.shouldReportPartialResults = true 

    recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in 

     var isFinal = false 

     if result != nil { 

      self.wordTextField.text = result?.bestTranscription.formattedString 
      isFinal = (result?.isFinal)! 
     } 

     if error != nil || isFinal { 
      self.audioEngine.stop() 
      inputNode.removeTap(onBus: 0) 

      self.recognitionRequest = nil 
      self.recognitionTask = nil 

      self.microphoneButton.isEnabled = true 
     } 
    }) 

    let recordingFormat = inputNode.outputFormat(forBus: 0) 
    inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in 
     self.recognitionRequest?.append(buffer) 
    } 

    audioEngine.prepare() 

    do { 
     try audioEngine.start() 
    } catch { 
     print("audioEngine couldn't start because of an error.") 
    } 

    wordTextField.text = "Say something, I'm listening!" 
} 

}

回答

1

可能是因为您的audiosession在拍摄模式下,你有2个解决方案,首先是设置你试试audioSession.setCategory (AVAudioSessionCategoryRecord)到AVAudioSessionCategoryPlayAndRecord(这将工作),但一个更清晰的方法是获得一个单独的函数来说一些东西,然后将您的AVAudioSessionCategory设置为AVAudioSessionCategoryP卧底

希望这对我有所帮助。

+0

兄弟,你刚刚救了我的命!非常感谢你,像魅力一样工作! –

+0

兄弟,只是别的..你知道我该如何让我的iPhone的扬声器恢复到正常音量?我的意思是,在将演讲稿运行到文本之前,我的iPhone音量很高,但在运行代码并修复问题之后,我的文本到语音的音量非常低。非常感谢你对我的帮助了:) –

+0

烨尝试做这{ 尝试AVAudioSession.sharedInstance()。overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) }赶上_ {} –

0

这条线:

try audioSession.setMode(AVAudioSessionModeMeasurement) 

可能就是这个道理。它会导致音量被抑制得太低,听起来像是关闭了。尝试:

try audioSession.setMode(AVAudioSessionModeDefault) 

并查看它是否有效。