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());
    }
  }

.


声明:资源可能存在第三方来源,若有侵权请联系删除!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐