我正在对一种新的潜在产品进行初步研究。该产品的一部分要求 iPhone 和 iPad 上的 Speech-To-Text 保持打开状态,直到用户将其关闭。在我自己使用它时,我注意到它要么在 30 秒左右后自动关闭,无论用户是否停止说话,要么在说话者说出一定数量的可疑词后关闭。在任何情况下,该产品都要求它始终保持开启状态,直到明确告知停止。以前有人用过这个吗?是的,我已经尝试了很好的搜索,我似乎找不到任何实质内容,尤其是任何以正确语言编写的内容。谢谢朋友!
3 回答
最好的答案是谷歌更多!在尝试了几个不同的关键字之后,您会偶然发现这个文档,在此处找到。从阅读中可以看出,在语音识别部分,他们提到
iOS 10 引入了一个新的 API,它支持连续语音识别,并帮助您构建可以识别语音并将其转录为文本的应用程序。
更令人惊奇的是,它们甚至包含一些在定义新语音识别器时使用的代码,如下所示:
let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
print (result?.bestTranscription.formattedString)
})
惊人的!就是这样,轻松搜索。希望这对未来的一些人有所帮助,因为我相信有一天我们将不再需要用手指来使用手机。
我在这里找到了一个展示你演讲的教程。但是请看注释:
Apple 限制每台设备的识别。限制未知,但您可以联系 Apple 了解更多信息。Apple 限制每个应用程序的识别。
如果您经常遇到限制,请务必联系 Apple,他们可能会解决它。
语音识别使用大量的能量和数据。
语音识别一次只持续大约一分钟。
编辑
这个答案适用于 iOS 10。我预计 iOS 12 会在 2018 年 10 月发布,但苹果仍然表示:
计划将音频持续时间限制为一分钟。语音识别会给电池寿命和网络使用带来相对较高的负担。在 iOS 10 中,话语音频持续时间被限制为大约一分钟,这与键盘相关听写的限制类似。
请参阅:https ://developer.apple.com/documentation/speech
Speech
iOS 11 和 12 的框架中没有 API 更改。请参阅Paul Hudson 的所有API 更改,尤其是 iOS 12 的详细信息: iOS 12 APIs Diffs
所以我的回答应该仍然有效。
即使您不说话,这也将帮助您每 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()
}
}
}