我想对不断生成的大量 .wav
文件执行语音识别 .
有越来越多的在线语音到文本API服务(例如Google Cloud Speech,Amazon Lex,Twilio Speech Recognition,Nexmo 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 回答
事实证明这是一个微不足道的问题,在FAQ中记录:“Q: What is sample rate and how does it affect accuracy”
新闻片段是BBC音频立体声,以44.1 khz录制 .
我将它转换成单声道:
然后下采样到16khz:
现在它运作得很好 . 这是来自新闻文章的转录音频片段: