Ubuntu20.04 使用Python实现全过程离线语音识别(包含语音唤醒,语音转文字,指令识别,文字转语音)_from . import snowboydecoder-程序员宅基地

技术标签: python  香橙派  ubuntu20.04  snowboy  语音识别  

一、简单说点

  因为手头有一个项目,该项目需要在香橙派上实现语音控制,并且带有语音唤醒功能。简单来说,就是通过唤醒词唤醒香橙派,然后说出相关指令,香橙派去执行指令。
  但是,在弄香橙派的时候,自带的麦克风不好使了,单独进行麦克风测试的时候是好使的,但是程序跑起来怎么说话都没反应了。买了个USB接口的麦克风,还没到,就先在ubuntu系统上先试试流程,跑通下,到时在香橙派上弄的时候心里也有个数了。
  这是这篇记录博客的由来了。开发语言使用的Python,不得不说,使用Python来进行语音识别,是真的方便,第三方库太强大了。基本上是把环境配置好,剩下简单写点流程逻辑代码就完成了。
  emmm,对了,为了防止在复现过程中出现一些莫名其妙的bug,每一个环境的配置,还有Python包我都会附上相应的版本号,理论上来说按照流程来走应该是没什么问题,中间的坑我都踩的差不多了。好了,闲话说到这,进入正文。

Ubuntu: 20.04
Python: 3.8

二、相关技术介绍

  • 语音唤醒使用的是Snowboy,这个官方已经不维护了,最后一个版本是1.3.0,官方的自定义语音唤醒词训练的网站已经停掉了,不过还有第三方的网站可以用。
  • 语音转文字使用的Speechbrain,这个可以自己训练自己的相关模型,为了提高自己指令识别精度可以这么做。要省事可以使用官方提供预先训练好的模型。
  • 文字转语音使用的Pyttsx3,这个怎么说,用来做demo程序是绝对够用了,但如果想要更好体验,需要解决下音色的问题。

三、语音唤醒

版本号:1.3.0
Snowboy的GitHub地址:

https://github.com/Kitt-AI/snowboy

如果在GitHub上下载压缩包的源码,那么我们需要先进行解压:

tar xvf snowboy-1.3.0.tar.gz

当然,我们也能直接使用git命令进行下载源码:

git clone https://github.com/Kitt-AI/snowboy.git

代码下载完成后,先留着备用,接下来我们配置代码所需要的环境,snowboy需要swig,alsa等等,直接看配置:

sudo apt-get install swig  版本号:4.0.1
sudo apt-get install libatlas-base-dev
sudo apt-get install sox  版本号:14.4.2
sudo apt-get install libasound2-dev

  这个里面,sox少了会怎么样,我没测试过,不知道sox会不会对snowboy的编译造成直接影响,起码可以通过 sox -d -d 命令来测试你的麦克风跟外放,执行命令之后,对着麦克风说话,你可以听到自己的声音。
  libasound2少了会出问题,这个我一开忘了安装,结果报错了。这个是snowboy的C++编译中下载portaudio这个库的时候会用到,如果执行下载portaudio的操作前没有安装libasound2,会报下面错误:"Fail to open PortAudio stream, error message is “Device unavailable”
  还有,需要注意的是,swig的版本号要大于3.10(没记错的话,不然就是3.12 <-_<- )

环境弄好之后,我们进入下载好的snowboy文件中,就可以进行相关编译工作了。
这里先说下,Snowboy的C++编译操作。
进入下面目录:

cd examples/C++/

然后,进行安装portaudio,还是当前路径下:

./install_portaudio.sh

安装完成之后,进行编译操作:

make

如果是在Ubuntu20.04的环境下,是没什么问题的。其他环境,可能会报一个如下错误:/usr/bin/ld: …/…//lib/ubuntu64/libsnowboy-detect.a:error adding symbols:file in wrong format
这个时候,我们只需找到当前目录下的demo.mk文件,修改如下内容(第37行):

修改前:
SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/ubuntu64/libsnowboy-detect.a
修改后:
SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/aarche64-ubuntu1604/libsnowboy-detect.a

修改完成后,在执行make。(可以在make之前,执行下make clean,清楚下上次编译文件)
  编译完成之后,我们就行执行demo程序了:

./demo

demo程序默认的唤醒词是snowboy。唤醒之后控制台会输出:Hotword 1 detected!。我们也可以对demo程序进行修改:在代码中打印前加上一句system(“play resources/ding.wav”),这样在识别到唤醒词时会自动播放一个叮的声音。

demo程序运行完之后,我们可以仿照demo程序,进行自己的二次开发,加入唤醒之后需要进行的操作。因为我用的Python语言,后面我会给出Python的相关需要修改得部分,这里的修改也可以参考Python部分的。

Snowboy的Python编译:
安装相关环境:

sudo apt-get install swig  版本:4.0.1
sudo apt-get install libatlas-base-dev

注意:这两个包如果在C++编译那里安装了,这里就不用重复安装了。
接下来安装pyaudio

sudo apt-get install portaudio19-dev python-all-dev python3-all-dev jackd1 portaudio19-doc jack-tools meterbridge liblo-dev
sudo apt-get install pyaudio

这里需要注意一个点,安装pyaudio之前一定要先安装前面那部分环境,因为pyaudio需要依赖portaudio,这里如果报错了,注意一下吧,亲身经历。
如果还报什么依赖问题,把下面这个执行一下(这里跟上面有些是重复的,删除重复的就行):

sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0

环境备好之后,进入:

cd swig/Python3

进入之后,编译:

./make

这里如果出现错误:/usr/bin/ld: …/…//lib/ubuntu64/libsnowboy-detect.a:error adding symbols:file in wrong format
我们打开当前路径下的makefile文件,进行如下修改:

修改前:
SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/ubuntu64/libsnowboy-detect.a
修改后:
SNOWBOYDETECTLIBFIE := $(TOPDIR)/lib/aarche64-ubuntu1604/libsnowboy-detect.a

如果没错误,就不用管了。编译完成之后,我们就可以进入目录:

cd examples/Python3

来运行官方demo了,不过运行之前,我们需要该一个文件:
打开当前路径snowboydecoder.py文件,将:

from * import snowboydetect 修改为import snowboydetect

修改完之后,我们运行:

python3 demo.py resources/models/snowboy.umdl

唤醒词为snowboy,唤醒之后会有叮的一声。

根据demo程序,来进行二次开发
接下来,创建一个python虚拟环境(最好这样,后面在安装一些python包的时候防止跟本地的一些包冲突)。我们snowboy编译之后的如下文件:

resources文件夹;demo.py ; snowboydecoder.py ;snowboydetect.py;
_snowboydetect.so (_snowboydetect.so 在swig/Python3的目录下)

将上面文件都放到我们新创建的目录下,运行demo.py没问题后,我们在来对创建自己的语音唤醒代码:

import snowboydecoder
import signal

interrupted = False

def signal_handler(signal, frame):
    global interrupted
    interrupted = True

def interrupt_callback():
    global interrupted
    return interrupted

# 语音唤醒之后播放的应答
model = 'resources/models/snowboy.umdl'

# 终止方法为ctrl+c
signal.signal(signal.SIGINT, signal_handler)

# 这里可以设置识别灵敏度
detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')

def callback():
    print("唤醒之后的回调函数")
    print("在这里实现唤醒之后需要进行的操作")

detector.start(detected_callback=callback, # 自定义回调函数
               interrupt_check=interrupt_callback,
               sleep_time=0.03)

# 释放资源
detector.terminate()

好了,这样就能把语音唤醒给运用起来了。snowboy的相关说明到这就结束。
哦,不对,差点忘了,如果想训练自己的唤醒词,可以在下面这个网站训练,上传三段自己录制的唤醒词语音就行,唤醒识别精度跟你上传的语音有很大关系:

https://snowboy.hahack.com/

四、语音转文字

获取语音

想要实现语音转文字,首先,我们得获取用户的语音输入。这里使用Python的speech_recognition包来进行语音获取,使用这个的好处是,他会在用户说话结束时,自动停止语音获取,这里我们就不用自己去写该什么停止语音获取的逻辑了,这点我认识是相当爽。
speech_recognition包的版本号:3.8.1
在安装speech_recognition包前我们还需要安装相应的依赖资源库:
PS. Python版本需为2.6或2.7或3.3+

pip install PyAudio  版本号:0.2.11
ps.这里跟上面使用apt-get安装的pyaudio是不一样的,这个安装是当前项目下

PS. PocketSphinx这个包可以暂时不安装,先看看能不能跑通,我安装这个是我一开始也试了使用
里面的recognition_sphinx()来进行语音识别,结果发现效果不太好,就放弃了。但我现在不清楚这个
有没有对后面安装产生什么影响,这个包我记得蛮大,可以暂时不安装,先试试后面流程再说。

pip install PocketSphinx  版本号:0.1.15
如果安装失败,那就是少了下面的一些依赖:
apt-get install libasound2-dev bison
sudo apt-get install pulseaudio
sudo apt-get install libpulse-dev
sudo apt-get install osspd

上面完成之后,安装:

pip install SpeechRecognition  版本号:3.8.1

然后,我们可以通过下面代码来验证语音的获取:

import speech_recognition as sr

#从系统麦克风拾取音频数据,采样率为 16000
def rec(rate=16000):
    r = sr.Recognizer()
    with sr.Microphone(sample_rate=rate) as source:
        print('正在获取声音中...')
        audio = r.listen(source)

    with open("recording.wav", "wb") as f:
        f.write(audio.get_wav_data())
        print('声音获取完成.')

    return 1

if __name__ == '__main__':
    rec()

如果在当前项目目录下得到了recording.wav文件,并且播放正常的话,那就没问题了。

语音转文字

语音转文字使用speechbrain
安装:

pip install speechbrain  版本号:0.5.11
pip install SoundFile  版本号:0.10.3.post1
pip install sox  版本号:1.4.1

这个识别默认是英文识别,我们可以使用官方的预先训练好的中文模型,官网地址:

官网地址:https://speechbrain.github.io/
GitHub仓库地址:https://github.com/speechbrain/speechbrain

我这里下载好了:

下载地址:https://download.csdn.net/download/qq_44323019/85399454

原来上传资源可以关闭自动调整积分。。。上面链接我设置的0积分,免费下载。
下载解压之后,会得到一个pretrained_models文件夹,把这个文件夹放到当前目录的根目录即可。
测试代码:

from speechbrain.pretrained import EncoderDecoderASR
import torch
import torchaudio

def voice_into_word():
    asr_model = EncoderDecoderASR.from_hparams(source="speechbrain/asr-transformer-aishell",
                                               savedir="pretrained_models/asr-transformer-aishell")

    audio_1 = r"./test.wav"
    ddd = torchaudio.list_audio_backends()

    print('start...')

    snt_1, fs = torchaudio.load(audio_1)
    wav_lens = torch.tensor([1.0])
    res = asr_model.transcribe_batch(snt_1, wav_lens)

    word = res[0][0].replace(' ', '')
    print(word)

    return word

if __name__ == '__main__':
    voice_into_word()

ok,到这里我们能将语音转文字,得到文字之后,那我们能操作的空间就大。

五、指令识别

这一部分其实没什么可说的,如果只是简单的指令识别,只要判断上一步我们得到的语音转成的文字部分有没有我们指令的关键字,然后再向用户确定一下就ok了。

其实这里我们还行实现语音聊天机器人功能。我们上一步不是得到了文字吗,这里只要我们能接一个聊天机器人接口就行了,比如图灵机器人。这里我没这个需求,有需求的可以自己去搜索,直接调用就行了。

六、文字转语音

要完成一个完整对话,当然少不了我们的终端也需要“说”了。这里我们使用pyttsx3来实现说的功能。
先安装:

sudo apt install libespeak1
pip install pyttsx3

PS.这里说一句,单纯安装pyttsx3大概率是不行的,我当时是莫名其妙报了一大堆错,都蒙了,后面是在一个论坛上面看到需要libspeak这个。

安装完成之后,测试代码:

import pyttsx3

def speakout(workText):
    engine = pyttsx3.init()

    # 获取发音人
    voices = engine.getProperty('voices') 
    #这里可以获取你设备当前支持的发音,可以配置下面代码使用,我这里使用zh偷懒了
    
    engine.setProperty('voice', 'zh')  # 开启支持中文

    rate = engine.getProperty('rate')
    engine.setProperty('rate', rate-40) #控制发音语速,可以自己调

    # 设置音量  范围为0.0-1.0  默认值为1.0
    engine.setProperty('volume', 0.7)

    engine.say(workText)
    engine.runAndWait()

speakout('你好哇')

七、其他一些

到这里应该是结束了,语音唤醒,语音识别,文字转语音都有了,整套流程是通了,更深入的就需要自己慢慢去琢磨了。我这里给出我整个项目安装过的包,防止上面我有漏写了的。其中一些包肯定是用不到的,因为中间我尝试了好几种方案,所以安装过其他一些包。只做参考。

Package            Version
------------------ ------------
certifi            2021.10.8
cffi               1.15.0
charset-normalizer 2.0.12
filelock           3.7.0
huggingface-hub    0.6.0
HyperPyYAML        1.0.1
idna               3.3
joblib             1.1.0
numpy              1.22.3
packaging          21.3
pip                22.1
pocketsphinx       0.1.15
PyAudio            0.2.11
pycparser          2.21
pyparsing          3.0.9
pyttsx3            2.71
PyYAML             6.0
requests           2.27.1
ruamel.yaml        0.17.21
ruamel.yaml.clib   0.2.6
scipy              1.8.0
sentencepiece      0.1.96
setuptools         62.2.0
SoundFile          0.10.3.post1
sox                1.4.1
speechbrain        0.5.11
SpeechRecognition  3.8.1
torch              1.11.0
torchaudio         0.11.0
tqdm               4.64.0
typing_extensions  4.2.0
urllib3            1.26.9
wheel              0.37.1

到这里了,如果对你有帮助,点个小小的赞吧。头一次一篇博客分了两天来写。
->_<-

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44323019/article/details/124808289

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan