使用Sphinx4离线语音转文字质量问题

时间:2017-08-30 15:12:23

标签: speech-recognition voice-recognition speech-to-text cmusphinx sphinx4

我想对不断生成的大量.wav文件执行语音识别。

有越来越多的在线语音转文字API服务(例如Google Cloud SpeechAmazon LexTwilio Speech RecognitionNexmo Voice等等对于连接的应用程序,但由于成本和带宽而不适合此用例。

快速谷歌搜索建议CMUSphinx(CMU =卡内基梅隆大学)在语音识别方面很受欢迎。

我尝试了'hello world'示例:

import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.SpeechResult;
import edu.cmu.sphinx.api.StreamSpeechRecognizer;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Main {

    public static void main(String[] args) throws IOException {

        Configuration configuration = new Configuration();

        configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");
        configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");
        configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.bin");

        StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
        InputStream stream = new FileInputStream(new File("src/main/resources/test.wav"));

        recognizer.startRecognition(stream);
        SpeechResult result;
        while ((result = recognizer.getResult()) != null) {
            System.out.format("Hypothesis: %s\n", result.getHypothesis());
        }
        recognizer.stopRecognition();

    }
}

结果有点令人失望。 “test.wav”文件包含以下音频:

  

这是第一个发言间隔。在第一时间之后   沉默,这是说话的第二个间隔。第三次之后   沉默的时刻,这是说话的第三段和最后一段   之一。

这被解释为:

  

这是第一个间隔发言... ...的第一个时刻   沉默是所有发言中的第二个......对于当下而言   沉默这是最后几个发言中的几个。

大多数单词都已被捕获,但输出是乱码到意义丢失的程度。然后我下载了一个新闻报道,其中的发音清晰明了,转录完全是胡言乱语。它吸引了一个非常醉酒的人会听外语。

我很想知道是否有人成功使用Sphinx4,如果有的话,做了哪些调整才能使其正常工作?是否有其他声学/语言模型,词典等...表现更好?有关离线语音到文本的任何其他开源建议我应该考虑吗?

1 个答案:

答案 0 :(得分:0)

这在FAQ中记录了一个微不足道的问题:" Q: What is sample rate and how does it affect accuracy"

  

[...]我们还无法检测到采样率。所以在使用解码器之前你   需要确保解码器的两个采样率都匹配   输入音频的采样率和音频匹配的带宽   用于训练模型的带宽。导致不匹配   准确性很差。

新闻片段是BBC音频立体声,以44.1 khz录制。

$ soxi GlobalNewsPodcast-20170828-CatastrophicFloodsRisin.wav

Input File     : 'GlobalNewsPodcast-20170828-CatastrophicFloodsRisin.wav'
Channels       : 2
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:29:23.79 = 77783087 samples = 132284 CDDA sectors
File Size      : 311M
Bit Rate       : 1.41M
Sample Encoding: 16-bit Signed Integer PCM

我将它转换为单声道:

$ sox GlobalNewsPodcast-20170828-CatastrophicFloodsRisin.wav GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono.wav remix 1,2
$ soxi GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono.wav

Input File     : 'GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono.wav'
Channels       : 1
Sample Rate    : 44100
Precision      : 16-bit
Duration       : 00:29:23.79 = 77783087 samples = 132284 CDDA sectors
File Size      : 156M
Bit Rate       : 706k
Sample Encoding: 16-bit Signed Integer PCM

然后下采样到16khz:

$ sox GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono.wav -r 16k GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono16k.wav
$ soxi GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono16k.wav

Input File     : 'GlobalNewsPodcast-20170828-CatastrophicFloodsRisinMono16k.wav'
Channels       : 1
Sample Rate    : 16000
Precision      : 16-bit
Duration       : 00:29:23.79 = 28220621 samples ~ 132284 CDDA sectors
File Size      : 56.4M
Bit Rate       : 256k
Sample Encoding: 16-bit Signed Integer PCM

现在它工作得很好。这是来自新闻文章的转录音频片段:

  紧急情况官员表示,他们预计大厅将从万人到   寻求援助在得克萨斯州浮华的千万人已经存在   在临时避难所照顾的是发动机是一个很大的释放   来自两个保护休斯顿市的感觉的水......