概述
Sphinx4是一个纯Java语音识别库。它提供了一个快速、简单的 API,可借助 CMUSphinx 声学模型将语音记录转换为文本。它可以在服务器和桌面应用程序中使用。除了语音识别之外,Sphinx4 还有助于识别说话者、调整模型、将现有转录与音频对齐以设置时间戳等。
Sphinx4 支持美国英语和许多其他语言。
在您的项目中使用 sphinx4
与 Java 中的任何库一样,使用 sphinx4 所需要做的就是将 jar 添加到项目的依赖项中,然后就可以使用 API 编写代码。
使用 sphinx4 最简单的方法是使用现代构建工具,例如 Apache Maven或 Gradle。 Sphinx-4 在Sonatype OSS 存储库中作为 Maven 包提供。
在 gradle 中,您需要以下几行build.gradle
:
repositories {
mavenLocal()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
compile group: 'edu.cmu.sphinx', name: 'sphinx4-core', version:'5prealpha-SNAPSHOT'
compile group: 'edu.cmu.sphinx', name: 'sphinx4-data', version:'5prealpha-SNAPSHOT'
}
要在您的 Maven 项目中使用 sphinx4,请在您的以下位置指定此存储库pom.xml
:
<project>
...
<repositories>
<repository>
<id>snapshots-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
...
</project>
然后添加sphinx4-core
项目依赖:
<dependency>
<groupId>edu.cmu.sphinx</groupId>
<artifactId>sphinx4-core</artifactId>
<version>5prealpha-SNAPSHOT</version>
</dependency>
sphinx4-data
如果您想使用默认的美国英语声学和语言模型,也请添加到依赖项:
<dependency>
<groupId>edu.cmu.sphinx</groupId>
<artifactId>sphinx4-data</artifactId>
<version>5prealpha-SNAPSHOT</version>
</dependency>
许多 IDE(例如 Eclipse、Netbeans 或 Idea)都通过插件或内置功能支持 Gradle。在这种情况下,您可以在 IDE 的帮助下将 sphinx4 库包含到您的项目中。请检查 IDE 文档的相关部分,例如 Gradle 上的 IDEA 文档。
您还可以在非 Maven 项目中使用 Sphinx4。在这种情况下,您需要手动从存储库下载 jar 。您可能还需要下载依赖项(我们尽量保持较小的依赖项)并将它们包含在您的项目中。如果要使用美国英语声学模型,则需要sphinx4-core jar 和 sphinx4-data jar:
以下是如何在 Eclipse 中包含 jar 的示例:
基本用法
要快速开始使用 sphinx4,请如上所述创建一个 java 项目,添加所需的依赖项并键入以下简单代码:
package com.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import edu.cmu.sphinx.api.Configuration;
import edu.cmu.sphinx.api.SpeechResult;
import edu.cmu.sphinx.api.StreamSpeechRecognizer;
public class TranscriberDemo {
public static void main(String[] args) throws Exception {
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("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中有几个高级识别接口:
- 实时语音识别器
- 流语音识别器
- 语音对齐器
对于大多数语音识别工作来说,高级接口就足够了。基本上,您只需设置四个属性:
- 声学模型
- 字典
- 语法/语言模型
- 言语来源
前三个属性是使用对象设置的Configuration
,然后将其传递给识别器。连接到语音源的方式取决于您的具体识别器,通常作为方法参数传递。
配置
AConfiguration
用于向识别器提供必需的和可选的属性。
Configuration configuration = new Configuration();
// Set path to acoustic model.
configuration.setAcousticModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us");
// Set path to dictionary.
configuration.setDictionaryPath("resource:/edu/cmu/sphinx/models/en-us/cmudict-en-us.dict");
// Set language model.
configuration.setLanguageModelPath("resource:/edu/cmu/sphinx/models/en-us/en-us.lm.bin");
实时语音识别器
使用LiveSpeechRecognizer
麦克风作为语音源。
LiveSpeechRecognizer recognizer = new LiveSpeechRecognizer(configuration);
// Start recognition process pruning previously cached data.
recognizer.startRecognition(true);
SpeechResult result = recognizer.getResult();
// Pause recognition process. It can be resumed then with startRecognition(false).
recognizer.stopRecognition();
流语音识别器
使用StreamSpeechRecognizer
anInputStream
作为语音源。您可以从文件、网络套接字或现有字节数组传递数据。
StreamSpeechRecognizer recognizer = new StreamSpeechRecognizer(configuration);
recognizer.startRecognition(new FileInputStream("speech.wav"));
SpeechResult result = recognizer.getResult();
recognizer.stopRecognition();
请注意,此解码的音频必须具有以下格式之一:
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 16000 Hz
或者
RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 8000 Hz
该解码器不支持其他格式。如果音频格式不匹配,您将不会得到任何结果。这意味着,您需要在解码之前将音频转换为正确的格式。例如,如果您想以 8000 Hz 采样率解码电话质量的音频,您需要调用
configuration.setSampleRate(8000);
您可以检索多个结果,直到到达文件末尾:
while ((result = recognizer.getResult()) != null) {
System.out.println(result.getHypothesis());
}
语音对齐器
文本与音频语音的时间SpeechAligner
对齐。
SpeechAligner aligner = new SpeechAligner(configuration);
aligner.align(new URL("101-42.wav"), "one oh one four two");
演讲结果
ASpeechResult
提供对识别结果各个部分的访问,例如识别的话语、带有时间戳的单词列表、识别网格等:
// Print utterance string without filler words.
System.out.println(result.getHypothesis());
// Get individual words and their times.
for (WordResult r : result.getWords()) {
System.out.println(r);
}
// Save lattice in a graphviz format.
result.getLattice().dumpDot("lattice.dot", "lattice");
演示
sphinx4 源代码中包含许多示例演示,以便您了解如何运行 sphinx4。您可以从 sphinx4-samples jar 运行它们:
- 转录器- 演示如何转录文件
- 对话- 演示如何与用户进行对话
- peakerID——说话人识别
- Aligner - 音频到转录时间戳的演示
如果您打算从演示开始,请不要修改 sphinx4 源代码中的演示。相反,请将代码复制到您的项目中并在那里进行修改。
从源头构建
如果您想开发 sphinx4 本身,您可能需要从源代码构建它。
Sphinx4 使用Gradle构建系统。为了编译和安装所有内容(包括依赖项),只需在根目录中输入“gradle build”即可。
如果您打算使用 IDE,请确保它支持 Gradle 项目。然后只需导入 sphinx4 源代码树即可。
故障排除
您在使用 sphinx4 时可能会遇到这样或那样的问题。在论坛上提出任何新问题之前,请先查看常见问题解答。
如果您对准确性有疑问,您需要提供您尝试识别的音频录音以及您使用的所有模型。此外,您需要描述您的结果与您的期望有何不同。