我想对不断生成的大量.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,如果有的话,做了哪些调整才能使其正常工作?是否有其他声学/语言模型,词典等...表现更好?有关离线语音到文本的任何其他开源建议我应该考虑吗?
答案 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
现在它工作得很好。这是来自新闻文章的转录音频片段:
紧急情况官员表示,他们预计大厅将从万人到 寻求援助在得克萨斯州浮华的千万人已经存在 在临时避难所照顾的是发动机是一个很大的释放 来自两个保护休斯顿市的感觉的水......