pocketSphinx Android 离线语音识别「终于解决」

Android (108) 2023-06-15 09:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说pocketSphinx Android 离线语音识别「终于解决」,希望能够帮助你!!!。

前几天有个朋友找到我说是否有非第三方(讯飞、百度)的语音识别方案,之前对这块的了解是语音识别基本都是调用这种第三方的方案。听完之后,谷歌发下有两种方案。

调用Android本地

具体就是使用原生的SpeechRecognizer来调用,但是这种目前的国内环境是需要修改的,但是不能保证修改后各个机型是否能够使用,按照这种方法,试了在小米手机上,基本是无法识别的,具体可以看下这篇文章的介绍:
https://juejin.cn/post/6844903861405089799

使用开源的pocketSphinx方案

在github上发现pocketSphinx可以满足目前的要求,开源地址 : https://github.com/cmusphinx/pocketsphinx

由于是在android 设备上运行的,所以可以直接使用Android开源方案:
https://github.com/cmusphinx/pocketsphinx-android

按照这个教程添加依赖库

dependencies {
    implementation 'edu.cmu.pocketsphinx.android:pocketsphinx-android:5prealpha@aar'
}

dependencies {
    compile (name:'pocketsphinx-android-debug', ext:'aar')
}

repositories {
    flatDir {
        dirs 'libs'
    }
}

或者也可以参考github上给出的 Android demo
https://github.com/cmusphinx/pocketsphinx-android-demo

由于是使用离线的方案,所以需要我们先训练好字典的模型,生成需要的语音模型,访问这个网址 http://www.speech.cs.cmu.edu/tools/lmtool-new.html点击选择文件,选择刚才编写的命令集文件 command.txt,然后点击COMPILE KNOWLEDGE BASE按钮就可以生成语言模型,如图:

pocketSphinx Android 离线语音识别「终于解决」_https://bianchenghao6.com/blog_Android_第1张

这里生成了好几个文件,我们可以把整个 .tgz 文件下载下来解压缩,其中得到的 .lm 文件就是我们需要的语言模型。

语言模型在这一步已经完成了,接下来需要添加字典模型,在这个网址下载我们需要的模型:https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Mandarin/
解压后,里面有一个.dic文件,然后参考这个 .dic 文件的格式,在上一步获取到的 .lm 语言模型文件中还有一个 .dic 文件,补充完整这个 .dic 文件的发音,如图所示:

pocketSphinx Android 离线语音识别「终于解决」_https://bianchenghao6.com/blog_Android_第2张

字典模型就这样完成了,接下来添加 声学模型

同样是在资源网盘的 Mandarin 文件夹下,下载 .tar.bz2 的压缩文件解压后,得到如下声学模型文件:

pocketSphinx Android 离线语音识别「终于解决」_https://bianchenghao6.com/blog_Android_第3张

按照一般的流程,到这里,再根据文档,就可以完成了,但是在开发的过程中 发现按照以上方法,运行都是报错的。
目前官网的字典模型是

pocketSphinx Android 离线语音识别「终于解决」_https://bianchenghao6.com/blog_Android_第4张

该版本是比较新的,另外训练好的语音模型,在官网的demo版本中没有看到是在那个地方加载,基于这两个疑问,试了很多次,发现都不知道怎么解决,后面看到一个 pocketSphinx 旧的版本的使用方法,https://blog.csdn.net/Crystal_xing/article/details/84957466

按照这个教程和对应的开源代码:
发现里面有使用到 .lm 文件的训练好的模型,然后根据上面提到的,训练了对应的关键字语音模型,发现还是无法识别,最后通过反复对比,发现是使用的字典模型版本不一致导致的。

于是使用了 PocketSphinx 0.7 https://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.7/ 版本的字典模型,解压后在pocketsphinx-0.7\model\lm\zh_CN/mandarin_notone.dic 去找实际的拼音,然后运行发现能够正常的识别出来,完美解决了。

发表回复