如何使iOS语音到文本持久化

时间:2016-08-02 19:38:03

标签: ios swift speech-to-text speech-recognition-api

我正在对一种新的潜在产品进行初步研究。该产品的一部分要求iPhone和iPad上的语音到文本保持打开,直到用户将其关闭。在我自己使用它时,我注意到它会在30秒左右后自动关闭,无论用户是否已停止说话,或者在扬声器发出一定数量的可疑字后它会关闭。在任何情况下,该产品都要求它一直保持开启状态,直到明确告知停止为止。以前有人有过这个吗?是的,我尝试过很好的搜索,我似乎无法找到任何实质内容,特别是用正确语言编写的内容。谢谢朋友们!

3 个答案:

答案 0 :(得分:4)

对此最好的答案是谷歌更多!在尝试了几个不同的关键字后,您会发现这个文档,找到了here。从阅读中可以看出,在语音识别部分,他们提到了

  

iOS 10推出了支持连续语音识别的新API,可帮助您构建可识别语音并将其转录为文本的应用。

更令人惊讶的是,它们甚至包含了一些在定义新语音识别器时使用的代码,如下所示:

let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
 print (result?.bestTranscription.formattedString)
})

真棒!那就是那时,轻松搜索。希望这可以帮助一些人在将来,因为我相信这一天将来我们不再需要用手指来使用手机。

答案 1 :(得分:2)

我找到here一个教程来展示你的演讲。但请参阅说明:

  

Apple限制每台设备的识别。该限制尚不清楚,但您可以与Apple联系以获取更多信息。   Apple限制每个应用的识别。

     

如果您经常达到限制,请务必联系Apple,他们可能会解决它。

     

语音识别使用大量功率和数据。

     

语音识别一次只能持续一分钟。

修改

这个答案适用于iOS 10.我期望在2018年10月发布iOS 12,但Apple仍然说:

  

计划对音频持续时间的一分钟限制。语音识别可以   对电池寿命和网络使用造成相对较高的负担。在   iOS 10,话语音频持续时间限制在一分钟左右   类似于与键盘相关的听写限制。

请参阅:https://developer.apple.com/documentation/speech

iOS 11和12的Speech框架中没有API更改。请参阅Paul Hudson的所有API changes,尤其是iOS 12,iOS 12 APIs Diffs

所以我的答案应该仍然有效。

答案 2 :(得分:-1)

这将帮助您每40秒自动开始录制,即使您什么也不说。如果您说了什么,然后沉默了2秒钟,它将停止并调用didfinishtalk函数。

@objc  func startRecording() {


    self.fullsTring = ""
    audioEngine.reset()

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

    }



    let audioSession = AVAudioSession.sharedInstance()
    do {
        try audioSession.setCategory(.record)
        try audioSession.setMode(.measurement)
        try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        try audioSession.setPreferredSampleRate(44100.0)

        if audioSession.isInputGainSettable {
            let error : NSErrorPointer = nil

            let success = try? audioSession.setInputGain(1.0)

            guard success != nil else {
                print ("audio error")
                return
            }
            if (success != nil) {
                print("\(String(describing: error))")
            }
        }
        else {
            print("Cannot set input gain")
        }
    } catch {
        print("audioSession properties weren't set because of an error.")
    }
    recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

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

    recognitionRequest.shouldReportPartialResults = true 
    self.timer4 = Timer.scheduledTimer(timeInterval: TimeInterval(40), target: self, selector: #selector(againStartRec), userInfo: nil, repeats: false)

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

        var isFinal = false  //8

        if result != nil {
            self.timer.invalidate()
            self.timer = Timer.scheduledTimer(timeInterval: TimeInterval(2.0), target: self, selector: #selector(self.didFinishTalk), userInfo: nil, repeats: false)

            let bestString = result?.bestTranscription.formattedString
            self.fullsTring = bestString!

     self.inputContainerView.inputTextField.text = result?.bestTranscription.formattedString

           isFinal = result!.isFinal

        }
        if error == nil{

        }
        if  isFinal {

            self.audioEngine.stop()
            inputNode.removeTap(onBus: 0)

            self.recognitionRequest = nil
            self.recognitionTask = nil
            isFinal = false

        }
        if error != nil{
            URLCache.shared.removeAllCachedResponses()



            self.audioEngine.stop()
                           inputNode.removeTap(onBus: 0)

                                    guard let task = self.recognitionTask else {
                                                      return
                                                  }
                                                  task.cancel()
                                                  task.finish()



        }
    })
    audioEngine.reset()
    inputNode.removeTap(onBus: 0)

  let recordingFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 1)
    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.")
    }


    self.hasrecorded = true



}


@objc func againStartRec(){

    self.inputContainerView.uploadImageView.setBackgroundImage( #imageLiteral(resourceName: "microphone") , for: .normal)
      self.inputContainerView.uploadImageView.alpha = 1.0
            self.timer4.invalidate()
    timer.invalidate()
           self.timer.invalidate()

            if ((self.audioEngine.isRunning)){

                self.audioEngine.stop()
                self.recognitionRequest?.endAudio()
                self.recognitionTask?.finish()


            }
   self.timer2 = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(startRecording), userInfo: nil, repeats: false)

}


@objc func didFinishTalk(){


    if self.fullsTring != ""{

     self.timer4.invalidate()
     self.timer.invalidate()
     self.timer2.invalidate()


          if ((self.audioEngine.isRunning)){

                 self.audioEngine.stop()
                 guard let task = self.recognitionTask else {
                    return
                 }
                 task.cancel()
                 task.finish()


             }



    }
}