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

使用Sphinx4的脱机语音到文本的质量问题

唐利
2023-03-14

我想对大量不断生成的. wav文件执行语音识别。

越来越多的在线语音到文本API服务(例如Google Cloud Speech、Amazon Lex、Twilio语音识别、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();

    }
}

结果有点令人失望。“测试”。wav文件包含以下音频:

这是说话的第一个间歇,在第一个沉默时刻之后,这是说话的第二个间歇,在第三个沉默时刻之后,这是说话的第三个间歇,也是最后一个。

这被解释为:

这是发言的第一个间歇因为第一个沉默时刻是所有发言的第二个因为沉默时刻这是最后几个发言

大多数单词都被捕获了,但输出的内容被篡改到了失去意义的程度。然后我下载了一篇新闻报道,其中的发音非常清晰,抄本完全是胡言乱语。它捕捉到了一个醉汉听外语时所能捕捉到的信息。

我很想知道是否有人成功地使用了狮身人面像,如果是的话,我们做了哪些调整来让它发挥作用?是否有其他声学/语言模型、词典等。。。表现更好?我应该考虑其他关于离线演讲到文本的开源建议吗?

共有1个答案

贺宜修
2023-03-14

事实证明,这是FAQ中记录的一个微不足道的问题:“Q:什么是采样率以及它如何影响准确性”

[…]我们还不能检测采样率。因此,在使用解码器之前,您需要确保解码器的采样率与输入音频的采样率相匹配,并且音频的带宽与用于训练模型的带宽相匹配。不匹配会导致非常差的精度。

新闻片段是英国广播公司的立体声音响,录制速度为44.1千赫。

$ 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

现在它运行得很好。以下是新闻文章中转录的音频片段:

紧急事务官员表示,他们预计德克萨斯州博尔顿市将有数百万人前往大厅寻求援助。目前,已有数千人正在临时避难所中接受照顾。引擎正在启动,这是一次大规模的泄水行动,旨在保护休斯顿市的安全感。。。

 类似资料:
  • 我正在iOS应用程序中使用进行文本到语音转换。 语音合成器在所有设备上都运行良好,除了运行iOS9.0.2的iPad 2(型号A1395)。我使用Xcode 7.0.1。 问题是,在播放文本时说"希望"字母"p"要么真的很安静,要么不播放,用户只能听到"ho"。如果文本是“希望”,那么它播放正确。 有没有办法解决这个问题?

  • 有人能帮我吗? 我正在开发一个通过RecognizerIntent进行语音识别的应用程序。 哪一个Android版本正式带来了API对应用程序的离线识别?有什么声明吗 据我所知,如果语音识别将通过在线服务或离线词典完成,开发人员无法选择。我说得对吗?或者是否有任何记录在案的API可以脱机设置 谢谢

  • Android 4.1包括离线语音输入。当您单击弹出键盘上的麦克风时,您可以看到这一点,如果您没有网络连接,它仍然可以工作。但是,当您想从您的应用程序中进行语音识别时,API似乎最终仍然需要网络连接。 是否有API可用于从我的应用程序访问Android中的新脱机语音输入功能?

  • 有没有任何开源项目或库(在java或c),我可以用来将文本转换为用户语音。

  • 我已经在Python语音识别方面工作了一个多月,制作了一个类似JARVIS的助手。我将语音识别模块与Google语音API和Pocketsphinx一起使用,并且直接使用了Pocketsphinx,没有使用其他模块。虽然识别是准确的,但我很难处理这些软件包处理语音所需的大量时间。它们的工作方式似乎是从一个静默点记录到另一个静默点,然后将记录传递到STT引擎。在录制过程中,无法录制其他声音以进行识别

  • 带有en-us语音的AVSpeechsynthesizer是“A”的发音,是“大写字母A”,但只想要“A”,怎么能做到呢?