Ubuntu20.04 使用Python实现全过程离线语音识别(包含语音唤醒,语音转文字,指令识别,文字转语音)

这篇具有很好参考价值的文章主要介绍了Ubuntu20.04 使用Python实现全过程离线语音识别(包含语音唤醒,语音转文字,指令识别,文字转语音)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简单说点

  因为手头有一个项目,该项目需要在香橙派上实现语音控制,并且带有语音唤醒功能。简单来说,就是通过唤醒词唤醒香橙派,然后说出相关指令,香橙派去执行指令。
  但是,在弄香橙派的时候,自带的麦克风不好使了,单独进行麦克风测试的时候是好使的,但是程序跑起来怎么说话都没反应了。买了个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

到这里了,如果对你有帮助,点个小小的赞吧。头一次一篇博客分了两天来写。
->_<-文章来源地址https://www.toymoban.com/news/detail-449774.html

到了这里,关于Ubuntu20.04 使用Python实现全过程离线语音识别(包含语音唤醒,语音转文字,指令识别,文字转语音)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ubuntu20.04使用微软Azure Kinect DK 实现三维重建demo记录

    本文仅为在ubuntu20.04实现Azure Kinect DK 三维重建demo,此文记录实现过程仅供学习,同时为大家避坑,文中参考大量文章已列至末尾。 1 ros安装 2 安装微软 DK的sdk 3 ros之AzureKinect驱动 4 Azure Kinect DK 点云和RGBD图的获取 5 conda安装 6 Kinect DK 实现三维重建 1.1 安装源,添加sources.list 1

    2024年02月07日
    浏览(66)
  • OpenWRT LEDE在Ubuntu22.04 编译全过程记录

    注, feeds用法 查看更新的订阅源信息,index file feeds/packages.index 【问题1】m4 编译错误 解决,参考博文 【问题2】 freadahead 异常 解决,参考博文 注意 : 参考博文中的 _IO_IN_BAXKUP 应该为 _IO_IN_BACKUP ,否则会导致下述报错,此文为正确写法 【问题3】 bison-3.0.4 相关错误 解决,参考

    2024年02月12日
    浏览(116)
  • Ubuntu20.04下更新系统Python版本

    起因:写Python时报错: TypeError: unsupported operand type(s) for |=: ‘dict’ and ‘dict’ 原因:python3.9 支持对 dict 类型使用 |, 而较老的版本不支持 小编这个ubuntu20.04环境是在wsl2下的,本质上与纯linux环境配置是一样的 于是更新python,截止2023.3.29,Python稳定版是到10.10 下面记录操作:

    2024年02月05日
    浏览(58)
  • WSL ubuntu 20.04 安装python3

    直接通过命令行安装python sudo apt-get install python3 在/usr/bin目录下查看所有python版本 同时需要在系统路径中加入软链接,将默认的python定向到python3上: sudo ln -s /usr/bin/python3.6 /usr/bin/python

    2024年02月12日
    浏览(55)
  • Ubuntu22.04 Linux磁盘扩容/硬盘扩展全过程(包括踩坑过程)

    目录 一、 开机前设置:扩展(无坑) 二、  开机后设置:分区管理 1. (有坑)想通过gparted管理分区 2. (有坑)想通过  sudo fdisk /dev/sda  命令修改磁盘。 3. 有效做法。 虚拟机关机。打开虚拟机设置。     注意!!!  1、2是坑!!!  无坑直接看3!!! 下载gparted工具

    2024年02月09日
    浏览(48)
  • Neo4j在Ubuntu 20.04上安装、配置以及Python连接使用 - Neo4j

    1. 进入要安装neo4j的ubuntu环境。 2. 添加Debian资源库。 java 1.8.xx版本对应neo4j 3.xx版本(jdk 11版本对应neo4j 4.xx版本): (1)wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - (2)echo \\\'deb https://debian.neo4j.com stable 3.5\\\' | sudo tee /etc/apt/sources.list.d/neo4j.list(或者:echo \\\'deb

    2024年02月04日
    浏览(60)
  • Ubuntu:18.04/20.04使用netplan设置网络

    通常,Ubuntu的默认设置是通过DHCP服务器自动获取IP地址,这对台式机系统来说非常有用,因为它不需要任何更改。 但是,始终建议为Ubuntu服务器分配一个静态IP地址,因为该静态IP地址将在重新启动后保持不变。 Ubuntu 17.10及更高版本使用“Netplan”作为默认网络管理工具。因此

    2024年02月05日
    浏览(49)
  • 【Ubuntu20.04】使用 systemd 进行服务部署

    ExecStart,改成自己脚本的路径,比如程序启动脚本 Restart,异常重启 RestartSec,异常后多少秒后重启 StartLimitInterval,异常后重试多少次,0 一直重试 将上述文件命名为 your_app.serivce ,放入 /etc/systemd/system 目录下 比如,你的服务名称叫 your_app 服务启用 服务启动 服务重新启动

    2024年04月25日
    浏览(44)
  • Ubuntu 20.04 实时查看GPU使用情况

    使用两种方法,实时查看 GPU 使用情况;彻底杀死制定进程 使用终端命令 nvidia-smi 查看显卡信息 如果你想实时检测显卡使用情况,添加 watch -n 即可 其中,4 是指 4 秒刷新一次终端,可以根据自己的需求设置 安装过程很简单,直接 pip 即可(本人是这样),使用 gpustat --json 以

    2024年02月13日
    浏览(53)
  • Ubuntu 20.04 上安装和使用 Docker

    Ubuntu 20.04 上安装和使用 Docker 在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。 首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源: 使用下面的 curl 导入源仓库的 GPG key: 将 Docker APT 软件源添加到你的

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包