首页 文章

使用Sphinx4离线语音到文本的质量问题

提问于
浏览
1

我想对不断生成的大量 .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

    事实证明这是一个微不足道的问题,在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
    

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

    紧急事务官员表示,他们预计大厅将有数百万人在德克萨斯寻求援助博尔顿华丽的千人已经在临时避难所被关注在发动机上是一个很大的关于释放水从两个保护休斯顿市的意识...

相关问题