Hockel 发表于 2022-4-11 16:46:40

【行空板教程】语音识别助手

本帖最后由 Hockel 于 2022-4-18 19:50 编辑




## 前言

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165208np6xnfvfn074nvpq.png)

过去五年,受到智能音箱,车载助手,手机语音小助手等设备及消费和互联网增值服务的影响,中国智能语音识别技术需求不断增长。语音识别貌似再也不是什么神秘的东西,深深的融入到我们的生活中来。那么我们是不是可以从零开始搭建我们的语音识别助手呢?好了,废话不多说,就让我们用行空板来完成的需求吧。

## 项目原理

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165221g9bw3t9txdiupw0i.png)


本项目进行语音识别主要调用了百度的语音识别接口进行完成的:

- 首先,行空板将板载录入的语音文件通过网络上传到百度的服务器上。
- 服务器接收到数据后,进行语音识别。然后将识别到的结果发到行空板上。
- 最后行空板把接受到的结果显示在屏幕上

## 课前准备

### 1、百度语音API接口的申请

打开百度的语音识别网站(https://ai.baidu.com/tech/speech) 进行语音识别的申请,登录账户后,没有应用的读者,可以点击创建应用。进行应用的创建。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165234r71zofalolzkjos7.png)


对我们的应用进行命名,步骤如下:

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165320l76eplgppu7beup7.png)


点击创建完成后,点击查看应用详情。
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165338rfsucdpyworb8yb4.png)


就可以看到我们应用(APPID,APIKEY,SECRET KEY)等信息,这个要留着我们后面会用到

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165349khpruuosza2x0s2b.png)

**注意:如果是新用户一定要领取一下我们语音识别的额度啊,不领取没有办法调用**
### 2、行空板设置

#### 2.1行空板的进行联网设置

我们用电脑来连接行空板,然后打开浏览器输入:10.1.2.3,来到行空板的网页菜单。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165404k8dbgr0btieiue8i.png)


点击网络设置,然后扫描附近的WiFi ,选择你要用的WiFi输入密码,进行连接

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165437lz228b6qmu9quubb.png)


#### 2.2 打开Jupyter服务

程序的编写,使用的是jupyter notebook,一个非常好用的编译器,所以我们要确保自己的应用是否打开此项服务。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165522l0q4ijs4e6ichqy4.png)


同样我们可以在行空板上,进行打开此服务。
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165542wcrwzw7c8sow7zkp.png)


### 3、安装baidu-aip的python 版本的sdk

我们需要启用终端来进行安排,这里我用jupyter的终端进行,首先在行空板的应用开关界面打开页面。
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165604wbubm76run3qhfgf.png)


在新建下拉框中找到终端选项,进行安装。


![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165612y0o9cz9o436ibob9.png)


终端第一次登录的读者,需要输入账号:```root```密码 :```dfrobot```

然后在终端输入:

```pip install baidu-aip```
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165621cd9tg1wddr9ehrw4.png)

(PS:因为我这边已经安装了,所以提示安装文件已存在。)

### 4、上传素材文件到行空板

你们看到我们界面的按钮,背景,实际上是图像素材,在使用它之前我们需要他们导入到我们的行空板上,如何把素材上传到我们的板子上呢?这里我使用的是行空板菜单界面进行传输,当然还有些其他方法,我这里就不一一赘述。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165637ng13x526npnxpxk1.png)


选择我们上传的文件上传到root/目录下面,

(PS:当然你也可以闲着其他目录下,但是我们调用的时候,路径一定要对哈)
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/165652m7u0zk1dd15nr3r3.png)


好了,至此我们的所有准备工作已经完成。能坚持看到这里的读者,给你点个赞。

## 相关知识点学习

行空板屏幕分辨率为240**320,因此unihiker库分辨率也为240*320,坐标原点为屏幕左上角,向右为x轴正方向,向下为y轴正方向。
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/170736apwmtbtspq4pl2rq.png)

#### 1-文字 draw_text

**语法:**`控件对象名 = GUI对象.draw_text(x, y, w, text, color, origin, onclick, font_family,font_size)`

- **返回值:**文字对象

- 输入参数:
- x : 横坐标
- y : 纵坐标
- w : 长度,如果超出长度则自动换行,此参数可省略。
- text : 要显示的文字
- color : 文字颜色
- origin : 对齐位置,默认左上角
- onclick : 当被点击时触发的回调函数
- font_family : 指定字体
- font_size : 文字大小

- **用法举例:**

```python
import time
from unihiker import GUI   #导入包
gui=GUI()#实例化GUI类
def info_text_on_click():
    print("文字被点击")

info_text = gui.draw_text(x=120, y=320, text='你好',origin='bottom' ,onclick=info_text_on_click)

info_text2 = gui.draw_text(x=0, y=100, text='1234567890')
info_text3 = gui.draw_text(x=0, y=150, w=50, text='1234567890')#换行演示

#font_family = gui.load_font('Segment7-4Gml.otf') #读取本地字库
#gui.draw_text(x=20, y=80, text='13:11', font_size=40, font_family=font_family) #使用字库显示

while True:
    #增加等待,防止程序退出和卡住
    time.sleep(1)
```

#### 2-图片 draw_image

**语法:**`控件对象名 = GUI对象.draw_image(x, y, w, h, image,origin,onclick)`

- **返回值:**文字对象
- 输入参数:
- x : 横坐标
- y : 纵坐标
- w : 图片的宽度。按照长宽最小边等比例缩放,可省略,宽高参数都省略则保持原图分辨率。
- h : 图片的高度。按照长宽最小边等比例缩放,可省略,宽高参数都省略则保持原图分辨率。
- image : 图片源,可以传入路径或image对象
- origin : 对齐位置,默认左上角
- onclick : 当被点击时触发的回调函数
- **用法举例:**

```python
from unihiker import GUI   #导入包
gui=GUI()#实例化GUI类
# 传入图片文件路径的方式
img_image = gui.draw_image(x=120, y=0, w=80, h=50,image='logo.png', origin='center', onclick=lambda: print("image clicked"))
img_image2 = gui.draw_image(x=0, y=100, image='logo.png')
# 传入图片对象的方式
from PIL import Image
img_image3 = gui.draw_image(x=10, y=200, image= Image.open('logo.png'))

import time
while True:
    #增加等待,防止程序退出和卡住
    time.sleep(1)
```

#### 3-按钮 add_button

**语法:**`控件对象名 = GUI对象.add_button(x, y, w, h, text, origin, state,onclick)`

- **返回值:**文字对象
- 输入参数:
- x : 横坐标
- y : 纵坐标
- w : 图片的宽度
- h : 图片的高度
- text : 按钮上显示的文字
- origin : 对齐位置,默认左上角
- state : 按钮使能,设置为 `disabled` 时按钮无法点击,设置为 `normal` 则回复到正常可点击状态
- onclick : 当被点击时触发的回调函数
- **用法举例:**

```python
from unihiker import GUI   #导入包
gui=GUI()#实例化GUI类
gui.add_button(x=120, y=110, w=100, h=30, text="按钮", origin='center', onclick=lambda: print("button clicked"))
gui.add_button(x=120, y=210, w=100, h=30, text="按钮", origin='center', onclick=lambda: print("button clicked"),state="disabled")

import time
while True:
    #增加等待,防止程序退出和卡住
    time.sleep(1)
```

### 程序编写

### 1、布局我们的UI界面

```python
from unihiker import GUI   #导入包

gui=GUI()#实例化GUI类

#gui 添加文本标题
gui.draw_text(x=60, y=20,color="#4169E1", font_size=18,text="语音识别助手")

# gui 添加按钮信息
gui.add_button(x=120, y=110, w=100, h=30, text="录音", origin='center', onclick=lambda: print("开始录音") )

gui.add_button(x=120, y=210, w=100, h=30, text="识别", origin='center', onclick=lambda: prnt("开始识别") )

```

**效果:**
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/170802nmiy6bm50smbftqi.png)


### 2、添加相应事件

```python
from unihiker import GUI,Audio#导入包
from aip import AipSpeech

gui=GUI()#实例化GUI类
audio = Audio() # 实例化Audio类

#gui 添加文本标题
gui.draw_text(x=60, y=20,color="#4169E1", font_size=18,text="语音识别助手")

# gui 添加按钮信息
gui.add_button(x=120, y=110, w=100, h=30, text="录音", origin='center', onclick=lambda:Record() )

gui.add_button(x=120, y=210, w=100, h=30, text="识别", origin='center', onclick=lambda: Recognition() )
# 识别显示信息
info_text2 = gui.draw_text(x=0, y=60,color="black",text="")

""" 你的 APPID AK SK """
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件(固定代码)
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
      return fp.read()

# 识别本地文件
def voiceToText():
    res = client.asr(get_file_content('3s.wav'), 'wav', 16000, {
            'dev_pid': 1537,
      })
    return res.get('result')


def Record():
    print("开始进行录音")
    audio.record('3s.wav', 3) #录音3S
    print("录音结束")
    info_text2.config(x=0, y=60, text="")# 清空识别信息显示栏

def Recognition():
    print("开始进行语音识别")
    msg = voiceToText()
    print(msg)
    info_text2.config(x=0, y=60, text=msg) #更新识别显示的信息
    time.sleep(1)

import time
while True:

    #增加等待,防止程序退出和卡住
    time.sleep(1)
```

**效果:**
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/170812vgb1b117gljo91ff.png)


### 3、美化界面

```python
from unihiker import GUI,Audio#导入包
from aip import AipSpeech

gui=GUI()#实例化GUI类
audio = Audio() # 实例化Audio类

""" 你的 APPID AK SK """
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# gui 添加背景图片
gui.draw_image(x=0, y=0, w=240, h=320,image='3.png')

# gui 按钮图片
gui.draw_image(x=0, y=0, w=240, h=320,image='3.png')
gui.draw_image(x=10, y=15, w=40, h=40,image='4.png')
gui.draw_image(x=120, y=120, w=80, h=50,image='1.png', origin='center', onclick=lambda: Record())
gui.draw_image(x=120, y=210, w=80, h=50,image='2.png', origin='center', onclick=lambda: Recognition())

#gui 添加文本标题
gui.draw_text(x=60, y=20,color="#4169E1", font_size=18,text="语音识别助手")
# 识别信息显示栏
info_text2 = gui.draw_text(x=0, y=60,color="white",text="")

# 读取文件(固定代码)
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
      return fp.read()

# 识别本地文件
def voiceToText():
    res = client.asr(get_file_content('3s.wav'), 'wav', 16000, {
            'dev_pid': 1537,
      })
    return res.get('result')


def Record():
    print("开始进行录音")
    audio.record('3s.wav', 3)
    print("录音结束")
    info_text2.config(x=0, y=60, text="")

def Recognition():
    print("开始进行语音识别")
    msg = voiceToText()
    print(msg)

    info_text2.config(x=0, y=60, text=msg)
    time.sleep(1)

import time
while True:
    #增加等待,防止程序退出和卡住
    time.sleep(1)
```

**效果**
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202204/11/170843x3zpj8rqj4pdr3q6.png)





## 总结

ok!到这里我们本次的行空板教程:语音识别助手就结束了,我们通过此教程学会了:行空板的基础空间的使用,相关环境的安装,百度api接口的调用,文件的上传等操作。不知道屏幕前的读者学会了吗?相关素材和源码。关注公众号:跟着hockel玩科创,回复”语音助手“即可获得哈。

DFH1yWH3rSv 发表于 2023-10-28 13:10:06

错误提示:Exception in Tkinter callback Traceback (most recent call last):   File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 175, in _new_conn   (self._dns_host, self.port), self.timeout, **extra_kw   File "/usr/local/lib/python3.7/dist-packages/urllib3/util/connection.py", line 72, in create_connection   for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):   File "/usr/lib/python3.7/socket.py", line 748, in getaddrinfo   for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: Temporary failure in name resolutionDuring handling of the above exception, another exception occurred:Traceback (most recent call last):   File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 710, in urlopen   chunked=chunked,   File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 386, in _make_request   self._validate_conn(conn)   File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 1040, in _validate_conn   conn.connect()   File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 358, in connect   conn = self._new_conn()   File "/usr/local/lib/python3.7/dist-packages/urllib3/connection.py", line 187, in _new_conn   self, "Failed to establish a new connection: %s" % e urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7f921d1080>: Failed to establish a new connection: Temporary failure in name resolutionDuring handling of the above exception, another exception occurred:Traceback (most recent call last):   File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 450, in send   timeout=timeout   File "/usr/local/lib/python3.7/dist-packages/urllib3/connectionpool.py", line 786, in urlopen   method, url, error=e, _pool=self, _stacktrace=sys.exc_info()   File "/usr/local/lib/python3.7/dist-packages/urllib3/util/retry.py", line 592, in increment   raise MaxRetryError(_pool, url, error or ResponseError(cause)) urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='aip.baidubce.com', port=443): Max retries exceeded with url: /oauth/2.0/token?grant_type=client_credentials&client_id=nsog0FXfPV8SI7fO4rajQdyN&client_secret=CSWcIau1IzrTIfOuxXerFzuiG5jclc0M (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f921d1080>: Failed to establish a new connection: Temporary failure in name resolution'))During handling of the above exception, another exception occurred:Traceback (most recent call last):   File "/usr/lib/python3.7/tkinter/__init__.py", line 1705, in __call__   return self.func(*args)   File "/root/ctuy/cut.py", line 14, in <lambda>   gui.add_button(text="按钮",origin='center',onclick=lambda:Record(),x=120,y=110,w=100,h=30)   File "/root/ctuy/cut.py", line 42, in Record   msg = voiceToText()   File "/root/ctuy/cut.py", line 33, in voiceToText   'dev_pid': 1537,   File "/usr/local/lib/python3.7/dist-packages/aip/speech.py", line 78, in asr   return self._request(self.__asrUrl, data)   File "/usr/local/lib/python3.7/dist-packages/aip/base.py", line 89, in _request   authObj = self._auth()   File "/usr/local/lib/python3.7/dist-packages/aip/base.py", line 168, in _auth   ), proxies=self._proxies).json()   File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 75, in get   return request('get', url, params=params, **kwargs)   File "/usr/local/lib/python3.7/dist-packages/requests/api.py", line 61, in request   return session.request(method=method, url=url, **kwargs)   File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 529, in request   resp = self.send(prep, **send_kwargs)   File "/usr/local/lib/python3.7/dist-packages/requests/sessions.py", line 645, in send   r = adapter.send(request, **kwargs)   File "/usr/local/lib/python3.7/dist-packages/requests/adapters.py", line 519, in send   raise ConnectionError(e, request=request) requests.exceptions.ConnectionError: HTTPSConnectionPool(host='aip.baidubce.com', port=443): Max retries exceeded with url: /oauth/2.0/token?grant_type=client_credentials&client_id=nsog0FXfPV8SI7fO4rajQdyN&client_secret=CSWcIau1IzrTIfOuxXerFzuiG5jclc0M (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f921d1080>: Failed to establish a new connection: Temporary failure in name resolution'))怎么办,求大佬

米饭二两 发表于 2023-12-29 22:17:16

   
>>> /Users/xiaoling/Documents/mindplus-py/environment/Python3.8.5-64/lib/python3.8/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
Traceback (most recent call last):
File "/Users/xiaoling/Documents/mindplus-py/user/2023-12-29-21-11-20/baidu-ai.py", line 1, in <module>
    from unihiker import GUI,Audio#导入包
File "/Users/xiaoling/Documents/mindplus-py/environment/Python3.8.5-64/lib/python3.8/site-packages/unihiker/__init__.py", line 2, in <module>
    from unihiker.Audio import Audio
File "/Users/xiaoling/Documents/mindplus-py/environment/Python3.8.5-64/lib/python3.8/site-packages/unihiker/Audio.py", line 22, in <module>
    c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
MemoryError

运行的时候提示这个,跑不起来,请问啥原因

yusunm 发表于 2022-4-15 12:30:43

提示错误:File "/usr/local/mindplus/cache/新建项目-2022-4-15-11-12-57/YUNXING.py", line 15, in <module>
    gui.draw_image(x=0, y=0, w=240, h=320,image='beijing.png')
File "/usr/local/lib/python3.7/dist-packages/unihiker/GUI.py", line 444, in draw_image
    return GUI.CanvasImage(self, **kw)
File "/usr/local/lib/python3.7/dist-packages/unihiker/GUI.py", line 426, in __init__
    self.preprocess(kw)
File "/usr/local/lib/python3.7/dist-packages/unihiker/GUI.py", line 408, in preprocess
    image = Image.open(image)
File "/usr/local/lib/python3.7/dist-packages/PIL/Image.py", line 2953, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: No such file or directory: 'beijing.png'
root@unihiker:/usr/local/mindplus/cache/新建项目-2022-4-15-11-12-57#

Forgotten 发表于 2022-4-12 14:50:20

教程依然是非常详细{:5_190:}

lyh1301 发表于 2022-4-12 22:00:51

我第一次登录不用帐号和密码的,不知道对不对?

Hockel 发表于 2022-4-12 22:25:24

lyh1301 发表于 2022-4-12 22:00
我第一次登录不用帐号和密码的,不知道对不对?

能用就行{:7_216:}

发表于 2022-4-13 12:54:11

第一次体会到了行空板的强大,顶一个。

Hockel 发表于 2022-4-15 14:10:41

yusunm 发表于 2022-4-15 12:30
提示错误:File "/usr/local/mindplus/cache/新建项目-2022-4-15-11-12-57/YUNXING.py", line 15, in
   ...

没有把背景图片上传到行空板上

IvanDMido 发表于 2022-4-15 15:29:51

接口额度没有领取。

Hockel 发表于 2022-4-15 16:03:52

IvanDMido 发表于 2022-4-15 15:29
接口额度没有领取。

钞能力{:7_216:}

IvanDMido 发表于 2022-4-15 19:24:46

Hockel 发表于 2022-4-15 16:03
钞能力

我是说你的教程中少了这一步,记录完接口参数后还要领下免费额度的,不然用不了。他确诊查询器那篇也是同样的问题。

Hockel 发表于 2022-4-15 21:14:34

IvanDMido 发表于 2022-4-15 19:24
我是说你的教程中少了这一步,记录完接口参数后还要领下免费额度的,不然用不了。他确诊查询器那篇也是同 ...

好的,谢谢提醒

赤星三春牛! 发表于 2022-4-17 21:54:47

6666666666666

赤星三春牛! 发表于 2022-4-17 21:55:52

赞赞赞赞赞

赤星三春牛! 发表于 2022-4-17 21:56:57

厉害厉害

赤星三春牛! 发表于 2022-4-17 21:57:59

呵呵呵呵

赤星三春牛! 发表于 2022-4-17 21:58:59

哈哈哈哈

赤星三春牛! 发表于 2022-4-17 22:00:37

谢谢分享

赤星三春牛! 发表于 2022-4-17 22:01:38

学习了!!

赤星三春牛! 发表于 2022-4-17 22:02:41

好好好好好

赤星三春牛! 发表于 2022-4-17 22:03:42

非常好!

赤星三春牛! 发表于 2022-4-17 22:04:50

实用实用
页: [1] 2
查看完整版本: 【行空板教程】语音识别助手