4

我正在尝试语音识别示例。如果我开始通过麦克风识别我的讲话,那么我试图让iPhone听到那个可识别文本的声音。这是工作。但是,声音太低。你能指导我吗?斯威夫特:试图迅速改变语音到iPhone的语音时,iPhone的音量很低

而不是,如果我试图在简单的按钮操作,AVSpeechUtterance代码,音量是正常的。

之后,如果我采用startRecognise()方法,音量太低。

我的代码

func startRecognise() 
{ 
let audioSession = AVAudioSession.sharedInstance() //2 
    do 
    { 
     try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     try audioSession.setMode(AVAudioSessionModeDefault) 
     try audioSession.setMode(AVAudioSessionModeMeasurement) 
     try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
     try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) 
    } 
    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 
     if result != nil 
     { 
      let lastword = result?.bestTranscription.formattedString.components(separatedBy: " ").last 
      if lastword == "repeat" || lastword == "Repeat"{ 
       self.myUtterance2 = AVSpeechUtterance(string: "You have spoken repeat") 
       self.myUtterance2.rate = 0.4 
       self.myUtterance2.volume = 1.0 
       self.myUtterance2.pitchMultiplier = 1.0 
       self.synth1.speak(self.myUtterance2) 
       // HERE VOICE IS TOO LOW. 
      } 
     } 
    }) 
    let recordingFormat = inputNode.outputFormat(forBus: 0) //11 
    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.") 
    } 
} 

我的按钮操作

func buttonAction() 
{ 
    self.myUtterance2 = AVSpeechUtterance(string: "You are in button action") 
    self.myUtterance2.rate = 0.4 
    self.myUtterance2.volume = 1.0 
    self.myUtterance2.pitchMultiplier = 1.0 
    self.synth1.speak(self.myUtterance2) 
    // Before going for startRecognise() method, 
    //I tried with buttonAction(), 
    //this time volume is normal. 
    //After startRecognise() method call, volume is too low in both methods. 
} 
+0

AVAudioSessionCategoryOptionDefaultToSpeaker - 添加此项 – YaBoiSandeep

回答

9

最后,我得到了解决。

func startRecognise() 
{ 
let audioSession = AVAudioSession.sharedInstance() //2 
    do 
    { 
     try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     try audioSession.setMode(AVAudioSessionModeDefault) 
     //try audioSession.setMode(AVAudioSessionModeMeasurement) 
     try audioSession.setActive(true, with: .notifyOthersOnDeactivation) 
     try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker) 
    } 
    catch 
    { 
     print("audioSession properties weren't set because of an error.") 
    } 

    ... 
} 

一旦我评论此行,try audioSession.setMode(AVAudioSessionModeMeasurement),音量正常工作。