目录
- 1. 问题报错
- 2. 解决方法
1. 问题报错
报错:
An overrun occurred, which means the RTF of the current model on your board is larger than 1. You can use ./bin/sherpa-ncnn to verify that. Please select a smaller model whose RTF is less than 1 for your board.
问题:
这个错误表明音频处理速度跟不上音频采集速度,导致缓冲区溢出。
-
具体是,调用sherpa-ncnn-alsa_Test时,音频是实时采集的,在采集到音频后会对音频数据进行额外处理。
-
例如:将音频转出来的文字,组成句子,传输给其他API调用。
-
在其他API处理这个句子时,语音还在实时采集,这是就会导致处理速度跟不上音频采集速度。
解决思路:
在音频额外处理期间,停止音频识别采集,在运行结束时恢复音频识别采集,以避免数据溢出。
2. 解决方法
音频处理速度跟不上音频采集速度时。在音频额外处理期间,停止音频识别采集,在运行结束时恢复音频识别采集。
- 以为调用
audio_op()
对音频进行处理为例;
(1)修改 sherpa-ncnn/csrc/alsa.h
:
-
在
Alsa
类中,添加暂停和恢复音频采集的功能,即Pause()
和Resume()
方法。 -
使用 ALSA 的
snd_pcm_pause
函数来正确暂停和恢复音频采集;
class Alsa {public:// ... code ...// 添加暂停和恢复方法// 使用 ALSA 的 snd_pcm_pause 函数来正确暂停和恢复音频采集void Pause() { snd_pcm_pause(capture_handle_, 1); }void Resume() { snd_pcm_pause(capture_handle_, 0); }// ... code ...
};
(2)修改 sherpa-ncnn/csrc/sherpa-ncnn-alsa.cc
:
- 使用暂停和恢复音频采集的功能
// ... code ...while (!stop) {// ... code ...if (is_endpoint) {if (!text.empty()) {++segment_index;alsa.Pause(); // 暂停音频采集audio_op(); // 音频处理操作alsa.Resume(); // 恢复音频采集}recognizer.Reset(s.get());}}
.
声明:资源可能存在第三方来源,若有侵权请联系删除!