2977浏览
查看: 2977|回复: 8

[pinpong 库控制硬件] 【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件

[复制链接]
本帖最后由 _木子_ 于 2020-9-8 14:53 编辑

LattePanda一代实现语音控制硬件

基础篇链接:https://mc.dfrobot.com.cn/thread-306946-1-1.html

衔接上一篇的学习基础上,我们这节课进行比较热门的语音控制硬件。大家想一下语音对于语音控制有什么了解,我们需要怎么实现呢?
在今年看的热播剧“向往的生活”中,有一个机器人名叫小度,他能通过何炅老师说的话,然后能自动播放音乐、自动搜索相关信息(菜谱的做法、人物信息)、家电的控制以及简单的问答功能。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图1

那么这一篇教程就教大家利用LattePanda一代,结合百度ai和我们的pinpong库,通过python编程来实现简单的语音控制开灯的效果。


一、实现原理
—————————————————————————————————————————

要达到语音控制硬件,那么我们比不可以少的就是语音识别技术了。语音识别技术,也被称为自动语音识别Automatic Speech Recognition,(ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图2

这里我们调用了百度ai的语音识别技术,通过录音中的特征提取,调用已有的识别引擎,识别所输入的语音,最终转化成字符序列让主板能够识别,当识别到正确的指令时,就可以实现相应功能的控制了。
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图3
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图4

二、环境准备
——————————————————————————————————————————

1、pinpong库(如一学习过上篇文章的内容则证明已经安装了pinpong库,无需再次安装)

2、Lp必须要联网

3、安装百度ai库
  • 可以直接“win+r”,搜索框中输入cmd按回车,之后输入“pip install baidu-aip”按回车键即可自行进行安装,此时如果安装提示安装超时,那么可能是网络问题,因为此命令默认调用国外的下载地址进行下载,为了较快下载安装百度ai,我们直接用“pip install baidu-aip -i https://pypi.doubanio.com/simple”即可调用国内的网址进行下载。

4、安装实现录音需要的PyAudio库
  • 如果是python3.6版本及以下版本,可以直接“win+r”,搜索框中输入cmd按回车,之后输入“pip install PyAudio”按回车键即可自行进行安装
  • 如果是3.7及以上版本,则需要下载相应的文件到本地,再进行指令安装。


注意:对于64位操作系统,Python 3.8下载PyAudio‑0.2.11‑cp38‑cp38‑win_amd64.whl,Python 3.7下载PyAudio‑0.2.11‑cp37‑cp37m‑win_amd64.whl。

下载地址为;
https://sn9.us/dir/13403389-37201167-ba08a5
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图6
  • 安装:

安装时记得指定一下whl文件所在的路径,另外还要有权限,最好以管理员身份运行cmd:

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图5

5、wav转化为pcm的工具
wav是我们录音是自动生成的一个可以直接用播放器播放的音频。而pcm是利用百度云进行识别时,识识别效果最为准确的一种格式,所以当我们录音成功时,需要转换成pcm格式再进行识别。

这种音频转换的工具有很多,这里我使用的是FFmpeg 这个工具,下载地址为:
https://pan.baidu.com/s/1xhCb8YuO9Q7YfHulxrsP7Q    提取码为:6s1w

FFmpeg 环境变量配置:
首先你要解压缩,然后找到bin目录,我解压在桌面文件ai中

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图7

然后配置环境变量:
1、找到This PC

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图8

2、右键选择最后一个选项

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图10
3、选择高级系统设置

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图9

4、选择环境变量

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图12


5、双击系统变量中的Path

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图13


6、点击新建进行新增

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图11

7、选择之前解压时bin的位置进行添加,之后点击ok确定添加。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图14
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图15

8、至此我们添加系统环境变量已经完成,然后通过cmd指令进行验证,输入ffmpeg,按回车键,出现以下内容说明我们设置成功。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图16

三、硬件准备
——————————————————————————————————————————————

1、LattePanda(拿铁熊猫)一代*1

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图18

2、LattePanda(拿铁熊猫)一代自带的天线*1

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图17

3、LED灯和配套的3pin线*1
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图19
4、按钮模块和配套的3pin线*1
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图20

其它配件如下:
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图21

四、硬件连接
———————————————————————————————————————————

注意:天线需要一直连接并处于联网状态,led灯接在数字引脚D9,按钮模块接在数字引脚D10,另外需要插上耳机在音频播放接口上。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图22

五、编程控制
———————————————————————————————————————————

5.1百度云上的设置操作
1、注册百度云账号,百度搜索百度云,点击进入第一词条,点击免费注册进行注册

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图24
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图23
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图25

2、注册完成后就可以登录了
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图26

3、登录成功后,在产品服务中找到我们需要的语音技术,并点击进入。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图27

4、进行应用的创建
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图29

5、可以简单的编辑自己新建的应用,然后点击立即创建即可创建成功

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图30

6、添加成功后点击返回列表
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图28

7、这样在列表中就可以看到我们新添加的应用了

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图31

8、点击概况进行功能的查看
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图32

9、这里我有一个小技巧,如果后面你需要用百度ai做其他好玩的功能时,这里我们可以把所以可以免费领取的功能都领取,方便后面使用。甚至可以点击语音合成的进行领取。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图34
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图33

10、都添加成功后,我们可以点击管理应用,回到我们的应用列表,找到我们需要的应用和对应的APPID、API Key、Secret Key,这三个中的关键参数都是我们代码中所需要的。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图35
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图36

5.2测试wav格式是否能成功转换成pcm格式

1、首先要打开windows的录音机,录制一段音频(说普通话),录音时需要用到我的的耳机,这时自动生成的是wav格式的音频。
找到录音,并点击打开
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图37

点击喇叭进行录音

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图39

录音成功后(可以自行发挥录制一段话),后面修改名称为audio,这里我另存到了桌面的ceshi文件夹中。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图38

2、我们通过cmd指令进行转换
输入命令 : ffmpeg -y -i audio.wav -acodec pcm_s16le -f s16le -ac 1 -ar 16000 audio.pcm,按回车键,即可进行转换。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图41

成功之后,可以看到同一个文件夹内多了一个audio.pcm文件。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图40

5.3利用百度语音识别的SDK应用
利用百度语音识别的功能,通过python代码实现语音识别。注意python代码文件和之前生成的audio.pcm一定要在同一个文件下才能进行识别。

5.3.1 代码编写
打开python的IDLE编译器

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图42

点击File-New File,即可新建python程序文档

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图43

[mw_shl_code=python,false]from aip import AipSpeech  #导入百度语音识别库

APP_ID = '22240549'   #和我们百度云中创建的应用的三个参数一致,按照自己所创建的应用参数对应进行替换

API_KEY = 'Px5NXYraIe9wIkCnvsba6y3c'

SECRET_KEY = 'dyFXnDy9RHmhgyoq20Y8W58xKKNpd2d4'

client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)

#读取文件

filePath="audio.pcm"

with open(filePath,'rb')as fp:

  file_context=fp.read()

#识别本地文件

res=client.asr(file_context,'pcm',16000,{

'dev_pid':1537,

      })

#打印初识别结果

print(res)[/mw_shl_code]

5.3.2 代码运行
点击Run运行程序,这是会提示保存文件到相应的位置,我们选择和audio.pcm在同以文件夹下

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图44

5.3.3 运程结果
【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图45

得到的结果让我们很开心,刚好是我们之前录制的声音。

5.3.4 asr函数解析
asr函数需要四个参数,第四个参数可以忽略,自有默认值,参照一下这些参数是做什么的

1、第一个参数: speech 音频文件流建立包含语音内容的Buffer对象, 语音文件的格式pcm 或者 wav 或者 amr。(虽说支持这么多格式,但是只有pcm的支持是最好的)
2、第二个参数: format 文件的格式,包括pcm(不压缩)、wav、amr(虽说支持这么多格式,但是只有pcm的支持是最好的)
3、第三个参数: rate 音频文件采样率 如果使用刚刚的FFmpeg的命令转换的,你的pcm文件就是16000
4、第四个参数: dev_pid 音频文件语言id 默认1537(普通话 输入法模型)

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图46

5.4利用PyAudio实现语音录制功能

5.4.1编写代码
新建新的python文件,然后进行代码的编写
[mw_shl_code=python,false]import pyaudio

import wave



CHUNK = 1024

FORMAT = pyaudio.paInt16

CHANNELS = 2

RATE = 16000

RECORD_SECONDS = 2

WAVE_OUTPUT_FILENAME = "1.wav"#自动生成文件的名称



p = pyaudio.PyAudio()



stream = p.open(format=FORMAT,

                channels=CHANNELS,

                rate=RATE,

                input=True,

                frames_per_buffer=CHUNK)



print("开始录音,请说话......")



frames = []



for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):

    data = stream.read(CHUNK)

    frames.append(data)



print("录音结束,请闭嘴!")



stream.stop_stream()

stream.close()

p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')

wf.setnchannels(CHANNELS)

wf.setsampwidth(p.get_sample_size(FORMAT))

wf.setframerate(RATE)

wf.writeframes(b''.join(frames))

wf.close()[/mw_shl_code]

5.4.2运行程序
点击Run运行程序

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图47

5.4.3运行结果
运行成功后,根据提示进行录音

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图49

可以看到文件夹中多了一个1.wav的录音文件

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图50

双击打开播放录音,发现就是刚刚我们所录的音,说明我们成功了。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图48

5.5把录音代码写到一个函数当中,方便我们后面的调用

接下来,我们将这段录音代码,写在一个函数里面,如果要录音的话就调用

代码编写
建立一个文件 pyrec.py 并将录音代码和函数写在内
[mw_shl_code=python,false]# pyrec.py 文件内容

import pyaudio

import wave

CHUNK = 1024

FORMAT = pyaudio.paInt16

CHANNELS = 2

RATE = 16000

RECORD_SECONDS = 2



def rec(file_name):

    p = pyaudio.PyAudio()



    stream = p.open(format=FORMAT,

                    channels=CHANNELS,

                    rate=RATE,

                    input=True,

                    frames_per_buffer=CHUNK)



    print("开始录音,请说话......")



    frames = []



    for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):

        data = stream.read(CHUNK)

        frames.append(data)



    print("录音结束,请闭嘴!")



    stream.stop_stream()

    stream.close()

    p.terminate()



    wf = wave.open(file_name, 'wb')

    wf.setnchannels(CHANNELS)

    wf.setsampwidth(p.get_sample_size(FORMAT))

    wf.setframerate(RATE)

    wf.writeframes(b''.join(frames))

    wf.close()[/mw_shl_code]

代码中的rec 函数就是我们调用的录音函数,并且给他一个文件名,他就会自动将声音写入到文件中了

5.6通过代码实现把wav的音频文件转换为pcm的文件

新建一个文件 wav2pcm.py,这个文件里面的函数是专门为我们转换wav文件的。

使用 os 模块中的 os.system()方法,这个方法是执行系统命令用的, 在windows系统中的命令就是 cmd 里面写的东西,如dir , cd 这类的命令。

代码编写
[mw_shl_code=python,false]# wav2pcm.py 文件内容

import os

def wav_to_pcm(wav_file):

    # 假设 wav_file = "音频文件.wav"

    # wav_file.split(".") 得到["音频文件","wav"] 拿出第一个结果"音频文件"  与 ".pcm" 拼接 得到结果 "音频文件.pcm"

    pcm_file = "%s.pcm" %(wav_file.split(".")[0])

    # 就是此前我们在cmd窗口中输入命令,这里面就是在让Python帮我们在cmd中执行命令

    os.system("ffmpeg -y  -i %s  -acodec pcm_s16le -f s16le -ac 1 -ar 16000 %s"%(wav_file,pcm_file))

    return pcm_file[/mw_shl_code]

5.7录音+语音识别

5.7.1代码编写
新建新的python文件,然后进行代码的编写

5.7.2运行程序
点击Run运行程序

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图51

5.7.2运行结果
按照打印的提示进行录音,最终可以看到我们识别到了正确的结果。此时也可以看到我们的文件夹中多了两个名为Oldboy.wav和Oldboy.pcm的音频文件。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图52

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图53


5.8加入pinpong库实现语音控制
前面我们已经实现语音识别了,这里我们只需要通过识别到的结果进行判断,是否是我们所需要的指令,这样我们就可以控制我们的硬件了。还有我们的录音都是程序运行的瞬间就会启动录音功能,但是当我们用来控制硬件时语音一个触发条件,这样才更加方便我们实现语音控制。否则你想象一下我们每次实现语音控制,都要重新运行一下程序是不是很麻烦。这里我选用的按钮来替代触发的条件开关(当然你也可以选择其他的触发条件)。

大家是不是已经摩拳擦掌了,那么接下来我们就来进行程序的设计吧!

5.8.1代码编写
[mw_shl_code=python,false]import pyrec  #录音函数文件
import wav2pcm   #wav转换成pcm函数文件
import time    #导入时间库
from aip import AipSpeech   #调用百度的语音识别库
from pinpong.board import Board,Pin #导入pinpong库的相关内容
Board("leonardo").begin()   # lp一代自带leonardo主板,所以这里选择leonardo
led=Pin(Pin.D9,Pin.OUT)   #初始化led灯引脚为D9
btn=Pin(Pin.D10,Pin.IN)    #初始化按钮的引脚为D10

APP_ID = '22240549'   #三个参数要与自己创建的应用对应的三个参数要一致
API_KEY = 'Px5NXYraIe9wIkCnvsba6y3c'
SECRET_KEY = 'dyFXnDy9RHmhgyoq20Y8W58xKKNpd2d4'

client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)
while True:       #循环执行
    b=btn.read_digital()    #读取D10号引脚的电平
    print(b)     #打印出D10引脚的电平状态
    time.sleep(1)    #等待1s
    if b==1:      #判断按钮状态是否等于1,如果等于则执行下面的代码
        pyrec.rec("Oldboy.wav")    #录音并自动生成文件,文件名为Oldboy.wav
        pcm_file=wav2pcm.wav_to_pcm("Oldboy.wav")  #自动转换成pcm文件
#读取得到的pcm文件
        with open(pcm_file,'rb')as fp:
          file_context=fp.read()
        #通过百度的语音识别进行识别
        res=client.asr(file_context,'pcm',16000,{
        'dev_pid':1537,

      })
#打印出识别到的结果
        print(res)
       #获得识别结果中的中文
        res_str=res.get("result")[0]
       #打印出识别的中文
        print(res_str)
        #判断识别结果中是否是开灯,如果是则执行开灯(给数字引脚D9高电平)
        if '开灯' in res_str:
            led.write_digital(1)
#判断识别结果中是否是关灯,如果是则执行关灯(给数字引脚D9低电平)
        if '关灯' in res_str:
            led.write_digital(0)

            time.sleep(0.5)    #消除抖动[/mw_shl_code]

5.8.2运行程序
点击Run运行程序

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图54

5.8.3运行结果

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图55

按下按钮即可进行录音,当录音内容为“开灯”时,我们可以看到D9号引脚的led灯被点亮。再次按下按钮进行录音,当录音内容为“关灯”时,我们可以看到D9号引脚的led灯熄灭了。

【pinpong库控制硬件】之 Latte Panda一代—语音控制硬件图56


六、能力扩展
————————————————————————————————————————

1、尝试利用不同指令去控制不同的硬件

2、本文中我们利用触发录音方式是按钮,可以选择其他的触发方式,有能力的人还可以尝试通过语音唤醒去制作,那样的话就和前文提到的“小度”功能一样了!





hnyzcj  版主

发表于 2020-9-9 08:06:57

优秀
回复

使用道具 举报

_木子_  管理员
 楼主|

发表于 2020-9-9 09:50:11

回复

使用道具 举报

IvanDMido  初级技师

发表于 2021-8-5 09:58:45

Although there are some errors in the code due to typography problems, it is still a valuable reference. Excellent !
回复

使用道具 举报

木子呢  管理员

发表于 2021-8-5 10:06:13

IvanDMido 发表于 2021-8-5 09:58
Although there are some errors in the code due to typography problems, it is still a valuable refere ...

                    
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-8-23 21:50:13

厉害厉害
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-8-23 21:51:45

不错不错!!
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-24 14:15:08

厉害厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-24 14:17:02

赞赞赞赞!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail