当前位置: 首页 > 知识库问答 >
问题:

非常小字典的Java语音识别

宰父飞白
2023-03-14

我有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转换文件的方法,如果找到,我会更新这篇文章。

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

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

4: 我生成了字典salesreport。dic,使用lmtool

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();
}

共有2个答案

贺山
2023-03-14

首先,Sphinx仅适用于WAVE文件。对于非常有限的词汇量,Sphinx在使用JSGF语法文件时应该会产生良好的结果(但在听写模式下没有那么好)。我发现的主要问题是它不提供置信度分数(它目前被窃听)。您可能需要检查其他三个替代方案:

  1. 来自Windows平台的语音识别器。它提供易于使用的识别与置信度分数和支持语法。这是C#,但您可以构建本机包装器或自定义服务器。
  2. Google Speech API是一个在线语音识别引擎,每天最多可提供50个请求。有几个API,但我喜欢JARVIS。不过要小心,因为没有官方支持或留档,Google可能会(并且过去已经)随时关闭此引擎。当然,您会遇到一些隐私问题(可以将此音频数据发送给第三方吗?)。
  3. 我最近通过ISpeech得到了很好的结果。它提供了自己的Java包装API,对移动应用程序免费。与Google API相同的隐私问题。

我自己选择使用第一个选项,并在自定义http服务器中构建语音识别服务。我发现在Sphinx评分问题得到解决之前,这是从Java处理语音识别的最有效方法。

笪煌
2023-03-14

此类任务的准确率必须达到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

 类似资料:
  • 我目前正在开发一个智能助手程序(基本上,它只是听用户说什么,然后根据用户说的内容对代码进行处理)。直到今天,当我切换到笔记本电脑时,它一直工作正常。程序不会打印出任何错误,但也不会打印出我说的话。我正在使用Python语音识别库3.8版。1.有人知道这个图书馆的替代品吗?如果是,请尝试解释我将如何“即时”使用它(无需先录制文件,然后将其发送到服务器,更像是实时语音)。 编辑:我忘了在帖子里说,我正

  • 问题内容: 我想开发一个基于 语音生物识别 的应用程序。 具体来说,我想开发一个应用程序,该应用程序将记录电话中的语音并确定讲话者。如果同一个人再次呼叫,它将识别语音。像其他生物识别应用程序一样,这里我需要做语音生物识别。是否有任何网址或示例对我有帮助。我搜索了但找不到解决方案。 我想在我的应用程序中实现上述一种FreeSpeech识别。 是否有可能通过使用任何开源做以下事情。 个人记录语音打印,

  • 我正在为嵌入式设备的语音相关语音识别解决方案寻找解决方案。我已经研究过Pocketsphinx,但由于我仍然不熟悉它,我想也许更有经验的人可能会知道。是否有可能使用Pocketsphinx来实现这样的语音识别。它应该记录音频,提取其特征,然后将其与所说的任何内容进行匹配,而不是使用声学和语言模型。是否有可能使用Pocketsphinx实现此流程?如果没有,有人能为这样的解决方案指出正确的方向吗?谢

  • 由于连接到不同的API,我目前正在开发一个工具,允许我阅读所有的通知。 它工作得很好,但现在我想用一些声音命令来做一些动作。 就像当软件说“一封来自Bob的邮件”时,我想说“阅读”或“存档”。 我的软件是通过一个节点服务器运行的,目前我没有任何浏览器实现,但它可以是一个计划。 在NodeJS中,启用语音到文本的最佳方式是什么? 我在它上面看到了很多线程,但主要是使用浏览器,如果可能的话,我希望在一

  • 语音识别是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语言。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。语音识别是一门涉及面很广的交叉学科,它与声学、语音学、语言学、信息理论、模式识别理论以及神经生物学等学科都有非常密切的关系。语音识别技术正逐步成为计算机信息处理技术中的关键技术,语音技术的应用已经成为一个具有竞争性的新兴高技术产

  • 识别简单的语句。