我在iOS语音识别中遇到了一个奇怪的行为。它暂停了一段时间的转录,并在一段时间后恢复它,而不做任何从应用程序方面(字面上我只是一直等待拿着我的iPhone,它突然恢复)。它并不总是发生,但有时会发生。
我通过将requiresOnDeviceRecognition
设置为true来使用设备上模式,因此,从我的理解来看,不应该像网络模式那样有一分钟的限制。
到目前为止,我观察到两件事。
首先,我查看了Xcode中的能源报告,它显示了一些线索。当它暂停转录时,它似乎完全停止了它的活动。
- 当它工作时:* x1c 0d1x
- 暂停时:*
- 恢复时:*
其次,下面是恢复转录时的Xcode控制台日志。不知道这是否与问题有关,但只是FYI。
2023-07-25 17:54:25.249013+0900 ***[2968:837713] [tcp] tcp_input [C87.1.1.1:3] flags=[R] seq=3535393450, ack=0, win=0 state=LAST_ACK rcv_nxt=3535393450, snd_una=907886974
2023-07-25 17:54:25.251148+0900 ***[2968:837713] [tcp] tcp_input [C87.1.1.1:3] flags=[R] seq=3535393450, ack=0, win=0 state=CLOSED rcv_nxt=3535393450, snd_una=907886974
字符串
这是一种Speech框架要求吗?如果有必要,我很乐意分享实现。- 谢谢-谢谢
[更新]
另一个观察结果是,当它不工作时,一些线程似乎很忙碌。似乎存在约40-50秒的不活动模式。
的
有趣的是,当我在转录工作时继续说话时,这个忙碌时期不会出现。然后在我停止说话后,不活动模式又开始了。
x1c4d 1x的
[更新2]
即使转录不工作,安装到AVAudioEngine的inputNode的tapBlock
也会被回调。self.recognitionRequest
也不是nil。
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
self.recognitionRequest?.append(buffer)
}
型
1条答案
按热度按时间ep6jt1vc1#
我找到了原因和解决办法。
我使用的是AVAudioSession的
.voiceChat
模式。但是在我把它换成.default
之后,这个问题就不再出现了!根据Apple document,它说它以某种方式优化了
.voiceChat
模式下设备的I/O,所以我猜它可能与SpeechRecognizer不兼容。此模式适用于使用playAndRecord类别的IP语音(VoIP)应用。设置此模式时,会话将优化设备的语音音调均衡,并将允许的音频路由集减少为仅适用于语音聊天的路由。
不确定细节,但无论如何,发现SpeechRecognizer在使用
.voiceChat
AVAudioSession模式沉默一段时间后停止转录。