zoukankan      html  css  js  c++  java
  • 树莓派的语音识别

    树莓派的语音识别

    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
     ", hyp);
                    fflush(stdout);
                }
    
                if (ps_start_utt(ps) < 0)
                    E_FATAL("Failed to start utterance
    ");
                utt_started = FALSE;
                E_INFO("Ready....
    ");
            }
    
    sudo make # 重新编译
    ./pocketsphinx_continuous -lm 3253.lm -dict 3253.dic -inmic yes
    
  • 相关阅读:
    set bootarges
    UI 中的 结构体 字符串的 初始化
    putchar 代替printf
    石家庄 工作
    What's the value of i++ + i++?
    printf 打印 指定长度 字符串
    UI 点滴 积累
    static 关键字
    sdk
    隐式类型转换
  • 原文地址:https://www.cnblogs.com/callmelx/p/13789766.html
Copyright © 2011-2022 走看看