1

当有人说话时,我正在使用 pocketsphinx 来识别 android 应用程序中的单词。我想实现功能以返回pocketsphinx记录的声音的最大幅度。如果我说任何单词,我需要得到一个声音级别作为回报(无论是从解码器识别还是不识别单词)。我做了什么:我查看了当前在源文件中注释的 pocketsphinx-->SpeechRecognizer 的代码:

 /*              while (!interrupted()
                && ((timeoutSamples == NO_TIMEOUT) || (remainingSamples > 0))) {
            int nread = recorder.read(buffer, 0, buffer.length);

            if (-1 == nread) {
                throw new RuntimeException("error reading audio buffer");
            } else if (nread > 0) {
                decoder.processRaw(buffer, nread, false, false);

                int max = 0;
                for (int i = 0; i < nread; i++) {
                    max = Math.max(max, Math.abs(buffer[i]));
                }....

我似乎是这个最大值是从缓冲区计算我如何从完整的记录中计算出来的。有人可以给我提示吗?

4

1 回答 1

0

就是这样,只需将 max 设置为 SpeechRecognizer 类的字段,并且不要每次都对其进行初始化,而仅在开始识别时进行:

class SpeechRecognizer() {

     double maxLevel;

     void startRecognition() {
         maxLevel = 0.0;
     }

     ....         
        @Override
        public void run() {
                decoder.processRaw(buffer, nread, false, false);

                double level = 0;
                for (int i = 0; i < nread; i++) {
                    level += buffer[i] * buffer[i];
                }
                level = sqrt(level / nread);
                if (maxLevel < level)
                    maxLevel = level
      ....

}

在这里,我建议您使用均方根 (RMS) 而不是简单的最大值,因为它是对最大幅度的更稳定估计,它可以抵抗简单的振幅突发,例如点击。

从每个缓冲区返回带有结果的 RMS 并在应用程序内而不是在识别器内更新 maxLevel 也是一个好主意。

于 2015-12-08T21:06:57.547 回答