树莓派的语音识别

树莓派的语音识别

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
posted @ 2020-10-10 00:52  callmelx  阅读(3687)  评论(1编辑  收藏  举报