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/

总结:在小规模的语音识别场合,以上两个方案都可以作为一个零时替代方案来实现一些语言识别上的应用,但一旦对识别率,性能有高要求的时候,就只能期待整个识别引擎具备支持普通话的能力了。

更多相关文章

  1. [置顶] android 多媒体和相机详解三
  2. Android(安卓)gesture 原理
  3. Android(安卓)MediaRecorder录制音频的方法
  4. Android音频开发之使用OpenSL ES API
  5. Android智能识别 - 银行卡区域裁剪(原理篇)
  6. Android实现 广告识别之 广告库
  7. FFmpeg 音频编码(PCM数据编码成AAC android)
  8. android 端拍照并运用Tesseract OCR 识别图片中字符
  9. Android离线身份证等图片文字识别

随机推荐

  1. View常见XML属性及相关方法
  2. Android(安卓)源码编译make的错误处理
  3. Android(安卓)带图标的textview
  4. EditTextView 属性
  5. 相对布局 RelativeLayout 常用属性介绍
  6. Android伸手党系列之二:Android开发基础知
  7. 【边做项目边学Android】手机安全卫士05_
  8. android arm debug
  9. Android(安卓)融云SDK 集成
  10. 详解Android中的屏幕方向