5

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

4

3 回答 3

5

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

iOS 10 引入了一个新的 API,它支持连续语音识别,并帮助您构建可以识别语音并将其转录为文本的应用程序。

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

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

惊人的!就是这样,轻松搜索。希望这对未来的一些人有所帮助,因为我相信有一天我们将不再需要用手指来使用手机。

于 2016-08-02T19:38:02.837 回答
2

我在这里找到了一个展示你演讲的教程。但是请看注释:

Apple 限制每台设备的识别。限制未知,但您可以联系 Apple 了解更多信息。Apple 限制每个应用程序的识别。

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

语音识别使用大量的能量和数据。

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

编辑

这个答案适用于 iOS 10。我预计 iOS 12 会在 2018 年 10 月发布,但苹果仍然表示:

计划将音频持续时间限制为一分钟。语音识别会给电池寿命和网络使用带来相对较高的负担。在 iOS 10 中,话语音频持续时间被限制为大约一分钟,这与键盘相关听写的限制类似。

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

SpeechiOS 11 和 12 的框架中没有 API 更改。请参阅Paul Hudson 的所有API 更改,尤其是 iOS 12 的详细信息: iOS 12 APIs Diffs

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

于 2017-02-06T20:35:51.827 回答
-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()


             }



    }
}
于 2020-02-07T13:39:57.640 回答