基于树莓派的语音识别和语音合成

基于树莓派的语音识别和语音合成基于树莓派的语音识别和语音合成摘要语音识别技术即AutomaticSpeechRecognition(简称ASR),是指将人说话的语音信号转换为可被计算机程序所识别的信息,从而识别说话人的语音指令及文字内容的技术。目前语音识别被广泛的应用于客服质检,导航,智能家居等领域。树莓派自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功…

大家好,又见面了,我是你们的朋友全栈君。

基于树莓派的语音识别和语音合成

摘要

语音识别技术即Automatic Speech Recognition(简称ASR),是指将人说话的语音信号转换为可被计算机程序所识别的信息,从而识别说话人的语音指令及文字内容的技术。目前语音识别被广泛的应用于客服质检,导航,智能家居等领域。树莓派自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。本文采用百度云语音识别API接口,在树莓派上实现低于60s音频的语音识别,也可以用于合成文本长度小于1024字节的音频。
此外,若能够结合snowboy离线语音唤醒引擎可实现离线语音唤醒,实现语音交互。

材料:

树莓派3B+ ×1
USB声卡 ×1
麦克风 ×1
PC ×1
音视频线材若干

树莓派3B+

实现过程:

一、 百度云语音识别 python-SDK的安装

  1. 为了能够调用百度云语音识别API接口,需要申请属于自己的百度AI开发者账号,安装SDK(Software Development Kit,软件开发工具包)。
    申请属于自己的百度AI开发者账号

  2. 进入百度云平台,进入百度语音控制台后,创建自己的应用,获取属于你的ID号和密钥。
    创建应用获取ID号和密钥

  3. Python-SDK的下载与安装

    将下载的SDK包拷贝到树莓派pi目录下,终端界面解压安装,安装过程如下:
    解压包:unzip aip-python-sdk-2.0.0.zip
    安装SDK包: sudo pip install baidu-aip
    指令代码

二.修改编辑官方python测试程序

  1. 语音识别程序:
#_*_ coding:UTF-8 _*_
# @author: zdl 
# 百度云语音识别Demo,实现对本地语音文件的识别。
# 需安装好python-SDK,录音文件不不超过60s,文件类型为wav格式。
# 音频参数需设置为 单通道 采样频率为16K PCM格式 可以先采用官方音频进行测试

# 导入AipSpeech AipSpeech是语音识别的Python SDK客户端
from aip import AipSpeech
import os

''' 你的APPID AK SK 参数在申请的百度云语音服务的控制台查看'''
APP_ID = '17xxxx11'
API_KEY = 'QZhVe5xxxxxvhYVA'
SECRET_KEY = 'bGlGGxbWLxxxxxxxxA8tshAGA'

# 新建一个AipSpeech
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)


# 读取文件
def get_file_content(test):   #filePath 待读取文件名
    with open(test, 'rb') as fp:
        return fp.read()

        
def stt(test):         # 语音识别
    # 识别本地文件
    result = client.asr(get_file_content(test),
                        'wav',
                        16000,
                        { 
   'dev_pid': 1536,}      # dev_pid参数表示识别的语言类型 1536表示普通话
                        )
    print (result)


    # 解析返回值,打印语音识别的结果
    if result['err_msg']=='success.':
        word = result['result'][0].encode('utf-8')       # utf-8编码
        if word!='':
            if word[len(word)-3:len(word)]==',':
                print (word[0:len(word)-3])
                with open('demo.txt','wb+') as f:
                    f.write(word[0:len(word)-3])
                f.close()
            else:
                print (word.decode('utf-8').encode('gbk'))
                with open('demo.txt','wb+') as f:
                    f.write(word)
                f.close()
        else:
            print ("音频文件不存在或格式错误")
    else:
        print ("错误")

# main函数 识别本地录音文件yahboom.wav
if __name__ == '__main__':
    
    stt('test.wav')

  1. 语音合成程序:
#_*_ coding:UTF-8 _*_
# @author: zdl 
# 百度云语音合成Demo,实现对本地文本的语音合成。
# 需安装好python-SDK,待合成文本不超过1024个字节
# 合成成功返回audio.mp3 否则返回错误代码

# 导入AipSpeech AipSpeech是语音识别的Python SDK客户端
from aip import AipSpeech
import os

''' 你的APPID AK SK 参数在申请的百度云语音服务的控制台查看'''
APP_ID = '17xxxx1'
API_KEY = 'QZhVxxxxxxxxxxxhYVA'
SECRET_KEY = 'bGlGGxxxxxxxxxxxxPGP8A8tshAGA'

# 新建一个AipSpeech
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 将本地文件进行语音合成
def tts(demo):
    f = open(demo,'r')
    command = f.read()
    if len(command) != 0:
        word = command
    f.close()
    result  = client.synthesis(word,'zh',1, { 
   
        'vol': 5,'per':0,
    })
    
# 合成正确返回audio.mp3,错误则返回dict 
    if not isinstance(result, dict):
        with open('audio.mp3', 'wb') as f:
            f.write(result)
        f.close()
        print ('tts successful')

# main

if __name__ == '__main__':

tts('demo.txt')

测试和分析:

测试过程中,我对此功能进行三次测试,测试用例分别为:

  1. 短句“北京理工大学”
  2. 短句“智能语音交互技术”
  3. 绕口令
    “刘奶奶找牛奶奶买牛奶,牛奶奶给刘奶奶拿牛奶,刘奶奶说牛奶奶的牛奶不如柳奶奶的牛奶,牛奶奶说柳奶奶的牛奶会流奶,柳奶奶听见了大骂牛奶奶你的才会流奶,柳奶奶和牛奶奶泼牛奶吓坏了刘奶奶,大骂再也不买柳奶奶和牛奶奶的牛奶”

此三条测试用例,分别从长句和短句,简单含义和复杂含义,是否有易混音三个方面对比进行测试,对百度语音技术的准确性提出了较高的要求。

测试前,需要提前用录音软件录制好三段音频,然后用Adobe Audition软件对音频格式化处理,因为百度智能云语音识别技术支持原始 PCM 的录音参数必须符合 16k 采样率、16bit 位深、单声道,支持的格式有:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)。

结果及结论:

测试一:短句“北京理工大学”
短句“北京理工大学”

测试二:短句“智能语音交互技术”
短句“智能语音交互技术”

测试三:绕口令
绕口令

三个测试均成功运行。

语音识别方面,此程序成功运行后,会在python-IDE中产生返回值结果,并会在路径/home/pi内产生一个demo.txt文件,文件内容即为输入音频文件的文字识别结果。百度在语音识别方面做出的努力可见一斑,通过调整程序中的参数,可以识别除普通话以外其他语言的音频文件(如英语),而且准确度较高,尤其是短句识别甚高,在易混淆字音重复出现的绕口令中,仅将其中一个“柳”字错误识别为“牛”。
在这里插入图片描述

语音合成方面,程序以上述的demo.txt为输入,将文字上传到百度云数据库,转换成功后反馈“successful”到IDE界面,并在目录/home/pi文件夹下生成audio.wav音频文件,此文件即为由文字合成的语音。测试发现,次音频信号在生活中较为熟悉的停顿处有较为明显的顿挫感,但是在长难句中,无法做到顿挫处的智能识别。

遇到的问题:

在整个编程过程中,可以说是举步维艰,由于自身能力有限,初学python和Linux,导致在系统操作和规范方面有很多的盲区,导致犯了很多诸如Linux系统授权、python缩进、命令行书写等十分低级的错误,一度陷入程序不断报错却不知错在何处的尴尬境地。同时,由于百度语音识别技术对于上传的音频有着较为苛刻的要求,必须符合 16k 采样率、16bit 位深、单声道等,对于这些内容的不熟悉也走了很多弯路。
最令我惊艳的是,百度智能云计算AI开放平台为程序员搭建了一个十分全面,而且性能强悍的平台,从语音到图像,再到智能数据,涉猎了我们所熟知的绝大多数AI领域,其中对不同实现方式进行了细致的备注和说明,为我实现此项目扫清了障碍。
错误码

深入开发的设想:

在完成上述功能的实现之后,我尝试让树莓派实现类似与智能音箱的人机交互功能(全网已有大神实现),实现过程中无疑要用到snowboy引擎,它一款高度可定制的唤醒词检测引擎,可以用于实时嵌入式系统,并且始终监听(即使离线)。当前,它可以运行在 Raspberry Pi、(Ubuntu)Linux 和 Mac OS X 系统上。在一些棘手的解决方案中,它可以运行完整的自动语音识别(ASR,Automatic Speech Recognition)来执行热词检测。但是,我在尝试实现过程中遇到了几个无法解决的问题:

  1. 由于树莓派内置声卡没有麦克风,需要利用外接声卡执行热词唤醒,但是在Linux系统中更改声卡驱动成了我越不去的坎儿,尝试了网络上更改驱动的多种方式后,无一能更够成功更改,我仍需继续在Linux方向深入学习。
  2. 在树莓派上下载好portaudio后,编译过程中频繁报错,涉及到gcc相关内容,我在这方面仍需继续努力。

致谢:

感谢百度智能云提供的云计算支持

参考文献:

  1. https://ai.baidu.com/docs#/ASR-Online-Python-SDK/f55e8c00
  2. https://www.cnblogs.com/rnckty/p/8067115.html
  3. https://blog.csdn.net/sinat_35162460/article/details/86544772
  4. https://snowboy.kitt.ai/
  5. https://blog.csdn.net/sinat_35162460/article/details/86547013

成果
作者:Boyle Zhao
2019年11月于北京理工大学

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153143.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月26日 下午4:16
下一篇 2022年6月26日 下午4:16


相关推荐

  • matlab函数plot函数_动态变量

    matlab函数plot函数_动态变量引子对于真实系统或者仿真平台,数据是增量式的产生的。Matlab除了强大的矩阵运算外,还具有强大的数据可视化库。由于静态画图的方法较多,本文只针对增量式数据流的动态显示。本文主要介绍几种Matlab实现数据的动态显示方法。方法主要有两种:holdonset函数与drawnow函数组合holdon方法1.方法介绍此种方法比较原始,适合于即时数据,原理是先画上一帧,接着保留原始图像,

    2022年10月10日
    4
  • 图像处理之gamma校正

    图像处理之gamma校正图像处理之gamma校正

    2022年6月16日
    35
  • 分治算法详解_算法的优劣通常用什么来衡量

    分治算法详解_算法的优劣通常用什么来衡量分治算法详解 一、基本概念  在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……   任何一个可以用计算机求解的问

    2025年8月14日
    4
  • 采用springboot+flowable快速实现工作流

    采用springboot+flowable快速实现工作流前言工作流框架大家一定不陌生,各种OA系统里我们常常用到。对于JAVA领域来说一说起工作流框架第一浮现我在脑海中的便是大名鼎鼎的Activiti了。很久以前学习Activiti框架时我也曾记录过一篇文章。见链接:工作流框架Activiti常用功能初探尽管当时只是学习了一下在之后的相关工作和项目中并没有用到,通过学习后了解了下,仅对于知识广度进行了扩宽。…

    2022年6月12日
    31
  • idea2021.3.2 激活码 激活licens sever(JetBrains全家桶)

    (idea2021.3.2 激活码 激活licens sever)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    1.1K
  • 扣子空间如何创建智能体

    扣子空间如何创建智能体

    2026年3月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号