gpt4 book ai didi

非常小的字典的Java语音识别

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:36:04 27 4
gpt4 key购买 nike

我有 MP3 音频文件,其中包含计算机留下的语音邮件。

消息内容始终采用相同的格式,由相同的计算机语音留下,只是内容略有不同:

“您今天卖出了 4 辆汽车”(其中 4 可以是 0 到 9 之间的任何数字)。

我一直在尝试设置 Sphinx,但开箱即用的模型效果不是很好。

然后我尝试编写自己的声学模型,但还没有取得更好的成功(30% 无法识别是我最好的)。

我想知道语音识别对于这项任务是否有点矫枉过正,因为我只有一个声音、一个预期的音频模式和需要识别的非常有限的字典。

我可以访问我需要在消息中搜索的十种声音(语音数字)中的每一种。

是否有一种非 VR 方法可以在音频文件中查找声音(如有必要,我可以将 MP3 转换为另一种格式)。

更新:我对此任务的解决方案如下

在直接与 Nikolay 合作后,我了解到我原来的问题的答案是无关紧要的,因为使用 Sphinx4 和 JSGF 语法可以达到预期的结果(准确率为 100%)。

1: 由于我的audo文件中的语音非常有限,我创建了一个JSGF语法(salesreport.gram)来描述它。我需要创建以下语法的所有信息都可以在这个 JSpeech Grammar Format 上找到页面。

#JSGF V1.0;

grammar salesreport;

public <salesreport> = (<intro> | <sales> | <closing>)+;

<intro> = this is your automated automobile sales report;

<sales> = you sold <digit> cars today;

<closing> = thank you for using this system;

<digit> = zero | one | two | three | four | five | six | seven | eight | nine;

注意:Sphinx 在语法中不支持 JSGF 标签。如有必要,可以使用正则表达式来提取特定信息(在我的例子中是销售数量)。

2:您的音频文件格式正确非常重要。 Sphinx 的默认采样率为 16Khz(16Khz 意味着每秒收集 16000 个样本)。我使用 FFmpeg 将我的 MP3 音频文件转换为 WAV 格式.

ffmpeg -i input.mp3 -acodec pcm_s16le -ac 1 -ar 16000 output.wav

不幸的是,FFmpeg 使该解决方案依赖于操作系统。我仍在寻找一种使用 Java 转换文件的方法,如果/当我找到它时,我会更新这篇文章。

虽然不需要完成这个任务,但我找到了Audacity有助于处理音频文件。它包括许多用于处理音频文件的实用程序(检查采样率和带宽、文件格式转换等)。

3:由于电话音频的最大带宽(音频中包含的频率范围)为 8kHz,因此我使用了 Sphinx en-us-8khz声学模型。

4:我使用 lmtool 生成了我的字典 salesreport.dic

5:使用前面步骤中提到的文件和以下代码(Nikolay 示例的修改版本),我的语音每次都以 100% 的准确率被识别。

public String parseAudio(File voiceFile) throws FileNotFoundException, IOException
{
String retVal = null;
StringBuilder resultSB = new StringBuilder();

Configuration configuration = new Configuration();

configuration.setAcousticModelPath("file:acoustic_models/en-us-8khz");
configuration.setDictionaryPath("file:salesreport.dic");
configuration.setGrammarPath("file:salesreportResources/")
configuration.setGrammarName("salesreport");
configuration.setUseGrammar(true);

StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
try (InputStream stream = new FileInputStream(voiceFile))
{
recognizer.startRecognition(stream);

SpeechResult result;

while ((result = recognizer.getResult()) != null)
{
System.out.format("Hypothesis: %s\n", result.getHypothesis());
resultSB.append(result.getHypothesis()
+ " ");
}

recognizer.stopRecognition();
}

return resultSB.toString().trim();
}

最佳答案

此类任务的准确率必须为 100%。这是与语法一起使用的代码示例:

public class TranscriberDemoGrammar {

public static void main(String[] args) throws Exception {
System.out.println("Loading models...");

Configuration configuration = new Configuration();

configuration.setAcousticModelPath("file:en-us-8khz");
configuration.setDictionaryPath("cmu07a.dic");
configuration.setGrammarPath("file:./");
configuration.setGrammarName("digits");
configuration.setUseGrammar(true);

StreamSpeechRecognizer recognizer =
new StreamSpeechRecognizer(configuration);
InputStream stream = new FileInputStream(new File("file.wav"));
recognizer.startRecognition(stream);

SpeechResult result;

while ((result = recognizer.getResult()) != null) {

System.out.format("Hypothesis: %s\n",
result.getHypothesis());
}

recognizer.stopRecognition();
}
}

您还需要确保采样率和音频带宽都与解码器配置匹配

http://cmusphinx.sourceforge.net/wiki/faq#qwhat_is_sample_rate_and_how_does_it_affect_accuracy

关于非常小的字典的Java语音识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507189/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com