树莓派的语音识别
树莓派的语音识别
1. 安装linux下的声音库
sudo apt-get install alsa-base
sudo apt-get install alsa-utils
sudo apt-get install libasound2-dev
可能遇到的问题:
E: Unable to locate package alsa-base
解决:更换系统的源
cd /etc/apt/
cp sources.list sources.list.bak
sudo apt-get install vim
sudo vim source.list
...中科大的软件源
deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
...
sudo apt-get update # 更新源
sudo apt-get -f install #修复损坏的软件包
sudo apt-get upgrade #更新软件
换源可能出现的问题:
Err:1 http://mirrors.aliyun.com/ubuntu xenial InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6ACC0B21F32
解决:
sudo gpg --keyserver keyserver.ubuntu.com --recv 3B4FE6ACC0B21F32 //(这个公钥根据提示来写的)
sudo gpg --export --armor 3B4FE6ACC0B21F32 | sudo apt-key add -
sudo apt-get update
输入alsamixer
2.声音的输入和输出
将usb声卡作为默认的声卡:
cd
vim .asoundrc
... 内容如下
pcm. !default sysdefault:Device
...
声音的输出: 挑选一个wav格式的音乐: 可以在这个网站下载示例 https://www.ape8.cn/
sudo aplay loveme.wav #开始播放音乐
声音输入:
sudo arecord -D hw:1,0 -c1 -r16000 -fS16_LE test.wav #对着话筒说话进行录制
参数说明:
-h,—help(帮助)
-V,–version(打印版本信息)
-l,–list-devices(列出全部声卡和数字音频设备)
-L,–list-pcms(列出全部PCM定义)
-D,–device(指定PCM设备名称)
-q,–quiet(安静模式)
-t,–file-type(文件类型voc,wav,raw或au)
-c,–channels(设置通道数)
-f,–format(设置格式)
-r,–rate(设置频率)
-d,–duration(设置持续时间,单位为秒)
-s,–sleep-min(设置最小休眠时间)
-M,–mmap(mmap流)
-N,–nonblock(设置为非块模式)
-B,–buffer-time(缓冲持续时长,单位为微秒)
-v,–verbose(显示PCM结构和设置)
-I,–separate-channels(设置为每个通道一个单独文件)
3. 语音识别
采用开源库: PocketShinx
下载安装:
#下载
wget https://sourceforge.net/projects/cmusphinx/files/sphinxbase/5prealpha/sphinxbase-5prealpha.tar.gz/download -O sphinxbase.tar.gz
wget https://sourceforge.net/projects/cmusphinx/files/pocketsphinx/5prealpha/pocketsphinx-5prealpha.tar.gz/download -O pocketsphinx.tar.gz
# 解压
tar -xzvf sphinxbase.tar.gz
tar -xzvf pocketsphinx.tar.gz
# 安装依赖
sudo apt-get install bison libasound2-dev swig
#先安装sphinxbase
cd sphinxbase-5prealpha
sudo ./configure --enable-fixed
sudo make
sudo make install
#安装pocketsphinx
cd pocketsphinx-5prealpha
sudo ./configure
sudo make
sudo make install
#让系统知道PocketPhinx库文件的位置
sudo vim /etc/ld.so.conf
...追加一行
/usr/local/lib
...
# 进入pocketPhinx下的src/programs
./pocketsphinx_continuous -inmic yes #这样就可以对着话筒说了,语音识别完成
4. 提高识别精度
通过上述的开源库,测试发现十分的不准确,提高准确率的方法有两种,一种是通过训练模型,过程很复杂,另一种是通过制定一些关键字进行范围限定.下面是第二种方法的操作步骤
创建字典
vim keyword.txt
...
up
down
left
right
light
hello
...
生成程序识别的文件:访问http://www.speech.cs.cmu.edu/tools
将字典文件上传,生成指定的.tgz压缩文件,点击下载
./pocketsphinx_continuous -lm 3253.lm -dict 3253.dic -inmic yes
发现识别精度直线上升
5.理解语音并发起动作
动作可以多种多样,他可以是触发一个脚本,可以是回复一句话,下面的实例,做一个简单回应,当我说出hello
, 他回复im okay
,这样的功能
让程序说话: 文本转语音: TTS(TextToSpeach)
sudo apt-get install espeak
修改pocketPhinx的程序
cp continuous.c continuous.c.bak # 做好备份
...修改如下
if (!in_speech && utt_started) {
/* speech -> silence transition, time to start new utterance */
ps_end_utt(ps);
hyp = ps_get_hyp(ps, NULL );
if (hyp != NULL) {
printf("开始识别了昂....");
if(strcmp(hyp,"HELLO")==0){
system("sudo espeak \"im okay\"");
}
printf("%s\n ", hyp);
fflush(stdout);
}
if (ps_start_utt(ps) < 0)
E_FATAL("Failed to start utterance\n");
utt_started = FALSE;
E_INFO("Ready....\n");
}
sudo make # 重新编译
./pocketsphinx_continuous -lm 3253.lm -dict 3253.dic -inmic yes