这就是 PocketSphinx,卡内基梅隆大学的开源大词汇量、与说话人无关的连续语音识别引擎之一。
尽管这曾经是一个研究系统,但积极的开发已基本停止,并且与最先进的水平相去甚远。 我正在发布一个版本,因为人们仍在使用它,并且构建系统和 API 中存在许多历史错误需要纠正。
版本号出奇地大,因为人们正在使用一个名为 5prealpha 的“版本”,从现在开始我们将使用正确的语义版本控制。
请参阅许可证文件了解使用条款。
我们现在使用 CMake 进行构建,这应该在 Linux 和 Windows 上给出合理的结果。 不确定 Mac OS X,因为我没有其中之一。 此外,从未在任何平台上真正构建或正常工作的音频库已被简单地删除。
不再有任何对 SphinxBase 的依赖。 不再有狮身人面像基地了。 这不是您要找的 SphinxBase。您所有的 SphinxBase 都属于我们。
要在虚拟环境中安装 Python 模块(将~/ve_pocketsphinx
替换为您要创建的虚拟环境),请从顶级目录:
python3 -m venv ~/ve_pocketsphinx . ~/ve_pocketsphinx/bin/activate pip install .
要安装 C 库和绑定(假设您有权访问 /usr/local - 如果没有,请使用-DCMAKE_INSTALL_PREFIX
在下面的第一个cmake
命令中设置不同的前缀):
cmake -S . -B build cmake --build build cmake --build build --target install
pocketsphinx
命令行程序从标准输入或一个或多个文件中读取单通道 16 位 PCM 音频,并尝试使用默认的声学和语言模型来识别其中的语音。它接受大量您可能不关心的选项,默认为live
的命令,以及一个或多个输入( align
模式除外),或者-
从标准输入读取。
如果你有一个名为“speech.wav”的单通道 WAV 文件并且你想识别其中的语音,你可以尝试这样做(结果可能不太好):
pocketsphinx single speech.wav
如果您的输入是其他格式,我建议使用sox
进行转换,如下所述。
命令如下:
help
:打印一长串您不关心的选项。
config
:将配置作为 JSON 转储到标准输出(可以使用-config
选项加载)。
live
:检测每个输入中的语音片段,对它们运行识别(使用您不关心的那些选项),并将结果以行分隔的 JSON 格式写入标准输出。 我意识到这不是最漂亮的格式,但它肯定胜过 XML。 每行都包含一个带有这些字段的 JSON 对象,这些字段具有短名称以使行更具可读性:
b
:从流开头开始的开始时间(以秒为单位)
d
:持续时间(以秒为单位)
p
:识别结果的估计概率,即0到1之间的数字,代表输入根据模型的可能性
t
: 识别结果全文
w
:段列表(通常是单词),每个段依次包含b
、 d
、 p
和t
字段,分别表示单词的开始、结束、概率和文本。 如果-phone_align yes
已传递,则将出现一个w
字段,其中包含相同格式的电话分段。
single
:将每个输入识别为单个话语,并以与上述相同的格式编写 JSON 对象。
align
:将单个输入文件(或-
对于标准输入)与单词序列对齐,并以与上述相同的格式写入 JSON 对象。 第一个位置参数是输入,所有后续位置参数都连接起来形成文本,以避免忘记引用它时出现意外。 您负责规范化文本以删除标点符号、大写字母、蜈蚣等。例如:
pocketsphinx align goforward.wav "go forward ten meters"
默认情况下,仅进行字级对齐。 要获取电话对齐,请在标志中传递-phone_align yes
,例如:
pocketsphinx -phone_align yes align audio.wav $text
这将产生不太可读的输出,但您可以使用 jq 来清理它。 例如,您可以仅获取单词名称和开始时间,如下所示:
pocketsphinx align audio.wav $text | jq '.w[]|[.t,.b]'
或者您可以获取电话名称和持续时间,如下所示:
pocketsphinx -phone_align yes align audio.wav $text | jq '.w[]|.w[]|[.t,.d]'
当然,还有很多很多其他的可能性。
soxflags
:将参数返回给sox
,这将创建适当的输入格式。 请注意,因为sox
命令行有点奇怪,所以它们必须始终位于文件名或-d
之后(告诉sox
从麦克风读取)。您可以像这样运行实时识别:
sox -d $(pocketsphinx soxflags) | pocketsphinx -
或从名为“audio.mp3”的文件中解码,如下所示:
sox audio.mp3 $(pocketsphinx soxflags) | pocketsphinx -
默认情况下,仅将错误打印到标准错误,但如果您想要更多信息,可以传递-loglevel INFO
。 部分结果不会打印出来,也许将来会打印出来,但不要屏住呼吸。
对于编程,请参阅示例目录,了解使用 C 和 Python 库的许多示例。 您还可以阅读 Python API 或 C API 的文档
PocketSphinx 最终基于Sphinx-II
而 Sphinx-II 又基于卡内基梅隆大学的一些旧系统,由于 Kevin Lenzo 的努力,这些系统在类似 BSD 的许可证下作为自由软件发布。 解码器的大部分内容是由 Ravishankar Mosur 编写的(在评论中查找“rkm”),但其他许多人也做出了贡献,请参阅作者文件以获取更多详细信息。
David Huggins-Daines(本文档的作者)负责创建PocketSphinx
,它添加了各种速度和内存优化、定点计算、JSGF 支持、各种平台的可移植性以及有些连贯的 API。 随后他消失了一段时间。
此后相当长一段时间由 Nickolay Shmyrev 接手维护,大量代码由 Alexander Solovets、Vyacheslav Klimkov 等人贡献。
目前,它再次由 David Huggins-Daines 维护。