srec 是放置在 android 源码库的 /extlibs 目录里面,是由 Nuance 公司提供的开源连续非特定人语音识别,其优异的性能早已被大家所熟知,可是在众多 android 版本中,始终未见到我们所期望的普通话语音识别库,那我们又如何利用现有的识别引擎实现普通话识别呢?
利用 srec 里面的动态插入语音标签功能( Voice Enrollment ) , 添加事先录好的普通话短语,之后就可以对其做语音识别了,
优点:识别率高,因为直接的普通话语言信息加入识别库内,在识别过程中匹配度是最高的。
缺点:动态添加会加大系统负担,故只能实现小规模的短语识别,如数字,地名等,而无法实现全词汇识别。
试验步骤如下:
事先录制好普通话的 0 到 9 数字放入 C:/asr/srec-rc3/sreclib/config/en.us /data/vmandarin 里,再录制普通话 911 作为测试音频,这些文件均采用 NIST 格式(头部有 1K 的空间用来描述音频信息,后面则是音频的原始数据),录制时的音频格式为: 11025Hz, 16 位,单声道。
编辑mand arin1.tcp, 内容如下:
context_load grammars/bothtags5.g2g BothTags trash not_ve
context_load grammars/enroll.g2g VoiceEnroll ROOT ve
context_use VoiceEnroll
recognize_nist vmandarin/0.nwv 0 0 zero
context_free VoiceEnroll
context_use BothTags
addword_from_last_nametag @Names zero 0
context_free BothTags
context_use VoiceEnroll
recognize_nist vmandarin/1.nwv 0 0 one
context_free VoiceEnroll
context_use BothTags
addword_from_last_nametag @Names one 0
context_free BothTags
# 此处省略其它数字添加命令 …
context_use VoiceEnroll
recognize_nist vmandarin/9.nwv 0 0 nine
context_free VoiceEnroll
context_use BothTags
addword_from_last_nametag @Names nine 0
context_free BothTags
context_compile
# 进行测试
recognize_nist vmandarin /911.nwv 0 0 phone nine one one
# 释放资源,结束
acousticstate_reset
context_free BothTags
context_unload VoiceEnroll
context_unload BothTags
执行命令即可看到测试结果:
C:/asr/srec-rc3/sreclib/config/en.us >SRecTest.exe -parfile baseline11k.par -tcp mandarin1.tcp -datapath data/
考虑到识别引擎是工作在音节一层,故可以将普通话用这些音节描述出来,进行扩充字典,重新编译后就具备了普通话的识别能力。
优点:如同给普通话标注了英语音标,理论上任何发音均可标注出来,扩充能力无限,
缺点:如同让说惯英语的人学说普通话,没有了升降调,断句也不自然,识别效果大打折扣。
试验步骤如下:
修改 dictionary/ large.ok 文件如下:
在正确的位置插入如下内容(关键字是升序排列)
0 liN
1 y/
2 V
3 san
4 si
5 v
6 lE]
7 CE
8 b)r
9 j]
编辑mandarin2.tcp, 内容如下:
context_load grammars/digits.g2g Digits trash not_ve
context_use Digits
acousticstate_reset
# 进行测试
recognize_nist vmandarin /911.nwv 0 0 phone nine one one
# 释放资源,结束
ontext_free Digits
context_unload Digits
C:/asr/srec-rc3/sreclib/config/en.us >SRecTest.exe -parfile baseline11k.par -tcp mandarin2.tcp -datapath data/
总结:在小规模的语音识别场合,以上两个方案都可以作为一个零时替代方案来实现一些语言识别上的应用,但一旦对识别率,性能有高要求的时候,就只能期待整个识别引擎具备支持普通话的能力了。