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