智能语音:好玩的语音控制是怎么实现的?学习笔记01


智能音箱的技术架构

智能音箱主要涉及拾音、前端信号处理、语音识别、自然语言处理语音合成等技术,现在一些产品甚至提供了声纹识别技术。
当然,智能音箱最重要的是提供各种功能,完成一些任务,比如控制电灯的开和关,这被称为技能
整体的技术架构如下图所示:

拾音

通过麦克风获取你的语音。智能音箱上一般采用麦克风阵列(Mic Array),也就是按照一定规则排列的多个麦克风,比如Amazon Echo由 7 个麦克风组成的阵列(绿色圆圈部分)。

前端语音信号处理

为了获取到相对干净的语音信号,提高后面的语音识别的准确率。相关技术如图。

语音唤醒

语音唤醒(Keyword Spotting,KWS):就是通过特定的唤醒词来激活智能音箱,以便进行后续的语音交互任务。如”小爱同学“。

语音识别

语音识别(Automatic Speech Recognition,ASR):就是将语音转换成文本,也被称为 STT(Speech to Text)。

自然语言理解

自然语言理解(Natural Language Understanding,NLU):是对语音识别生成的文本进行处理,识别用户的意图,并生产结构化的数据。

技能

技能(Skills):一般要借助后端云平台的强大能力,云平台可以提供知识图谱、家居设备远程控制和音频资源等能力。

自然语言生成

自然语言生成(Natural Language Generation,NLG):是将各种技能的响应结果组织成文本语言。比如当你询问天气时,根据获取的天气状况和温度等信息生成“北京今天晴,最高温度 5°,最低温度 -6°”这样的语句。自然语言生成和自然语言理解都属于自然语言处理(Natural Language Processing,NLP)的范畴。

语音合成

语音合成(Speech Synthesis):就是将自然语言生成的文本转换为语音的形式,提供给智能音箱播放出来,给人的感觉就像和音箱在对话。这个过程也叫做 TTS(Text to Speech)。

智能音箱的开发

麦克风阵列

麦克风阵列我使用的是 ReSpeaker 2-Mics Pi HAT,它的 2 个麦克风分布在模组的两边。我们现在来配置一下,让它可以在树莓派上正常工作。
你可以通过下面的命令安装它的驱动程序。首先,你最好切换一下树莓派的软件安装源,将它切换到国内的腾讯云安装源,这样下载安装的速度比较快。运行下面的命令修改配置文件:

$ sudo vim /etc/apt/sources.list

将文件修改为下面的内容:

deb https://mirrors.cloud.tencent.com/raspbian/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src https://mirrors.cloud.tencent.com/raspbian/raspbian/ buster main contrib non-free rpi

修改另一个软件安装源的配置文件,命令如下所示:

$ sudo vim /etc/apt/sources.list.d/raspi.list

修改后的文件内容如下:

deb https://mirrors.cloud.tencent.com/raspberrypi/ buster main
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
deb-src https://mirrors.cloud.tencent.com/raspberrypi/ buster main

然后,你需要运行下面的命令更新安装源:

$ sudo apt-get clean all
$ sudo apt-get update

现在,你可以运行下面命令安装麦克风阵列的驱动程序。因为这个驱动依赖的 wm8960 编解码器没有包含在树莓派系统的内核里面,需要重新加载内核,编译驱动,所以整个过程比较久。在等待的过程中,你可以先阅读这一讲的其他部分。

$ sudo apt-get install git
$ git clone --depth=1 https://github.com/respeaker/seeed-voicecard
$ cd seeed-voicecard
$ sudo ./install.sh
$ sudo reboot

树莓派重启之后,你可以在树莓派终端输入下面的命令,查看音频的输入和输出设备是否正常工作。

$ arecord -l
$ aplay -l


如果一切正常,我们就可以测试录音和播放功能了。在 ReSpeaker 2-Mics Pi HAT 的耳机插口上插入耳机或者扬声器,运行下面的命令,并说几句话。

$ arecord -d 5 test.wav
$ aplay test.wav

另外,你也可以通过软件 AlsaMixer(命令 alsamixer)来配置声音设置和调整音量,左、右箭头键用于选择通道或设备,向上、向下箭头控制当前所选设备的音量。退出程序使用 ALT + Q,或者按 Esc 键。
为了简化开发,也考虑到麦克风硬件的限制,我们这里就先不关注前端语音信号处理的相关开发了。接下来,我们直接来到实现语音唤醒的环节。

语音唤醒

为了实现语音唤醒,我们需要选择一个轻量级的、可以在树莓派上运行的唤醒词监测器软件。
我选择的是Mycroft Precise,它是一个基于 RNN 神经网络的语音唤醒工具。
接下来,我们在树莓派安装 Mycroft Precise。因为需要训练唤醒词模型,我们需要基于源代码来编译、安装。
首先,我们通过 git 命令把 Mycroft Precise 的源代码下载到树莓派的 /home/pi 目录:

$ cd ~
$ git clone https://github.com/mycroftai/mycroft-precise
$ cd mycroft-precise

在安装之前,把 pypi 的安装源修改到清华数据源,可以获得更快的下载速度。我们打开目录中的 setup.sh 文件:

$ vim setup.sh

将文件中的这行内容:

extra-index-url=https://www.piwheels.org/simple

替换成下面的内容:

index-url=https://pypi.tuna.tsinghua.edu.cn/simple
extra-index-url=https://www.piwheels.org/simple

然后,我们运行它自带的安装脚本,开始编译和安装。中间如果执行中断,可以重新执行这个命令,继续安装过程。(提示:有些 ARM 平台的库只有 piwheels 上有,所以这些库安装时速度还是很慢。这种情况下,可以电脑上使用下载工具获取这个模块的安装文件,然后上传到树莓派上,手动安装。)

$ ./setup.sh

安装完成后,我们开始使用 Mycroft Precise 来训练一个唤醒词模型,唤醒词可以根据喜好来选择,比如“极客时间”。
我们需要先激活 Python 的虚拟环境,因为 Mycroft Precise 在安装过程中创建了这个虚拟环境。

$ source .venv/bin/activate

接下来,我们通过工具 precise-collect 来收集语音模型训练的声音素材,运行后,根据提示录制 12 段声音。

$ precise-collect
Audio name (Ex. recording-##): geektime.##Press space to record (esc to exit)...
Recording...
Saved as geektime-00.wav
Press space to record (esc to exit)...

然后,我们需要将这些声音随机分为两份,一份是训练样本,包括 8 个声音文件,另一份是测试样本,包括 4 个声音文件,并且把这两份样本分别放到 geektime/wake-word/ 和 /geektime/test/wake-word/ 这两个目录下面。
接着,我们执行下面的命令,生成神经网络模型 geektime.net:

$ precise-train -e 60 geektime.net geektime/

最后,我们还需要将 geektime.net 的模型格式做一下转换,将它从 Keras 模型格式改为 TensorFlow 模型格式,因为 TensorFlow 模型更加通用。

$ precise-convert geektime.net

执行完成之后,我们会得到两个文件:
1.geektime.pb,TensorFlow 模型文件
2.geektime.pb,TensorFlow 模型文件
当然,为了提高模型的准确性,我们还可以使用 precise-train-incremental 工具来增加负样本,重新训练刚才的模型。如果环境复杂的话,你可以尝试一下。
然后,我们可以运行一段代码来测试这个唤醒词模型。不过,因为 portaudio 这个库在树莓派上运行有问题,我们需要先修复一下 portaudio 库。你可以运行下面的命令:

$ sudo apt-get remove libportaudio2
$ sudo apt-get install libasound2-dev
$ git clone -b alsapatch https://github.com/gglockner/portaudio
$ cd portaudio
$ ./configure && make
$ sudo make install
$ sudo ldconfig

测试程序的代码如下:

# File:kwsdemo.py
#!/usr/bin/env python3from precise_runner import PreciseEngine, PreciseRunnerengine = PreciseEngine('precise-engine/precise-engine', 'geektime.pb')
runner = PreciseRunner(engine, on_activation=lambda: print('hello'))
runner.start()# Sleep forever
from time import sleep
while True:sleep(10)

现在,我们把 kwsdemo.py 文件,还有两个 geektime.pb 模型相关的文件,都上传到树莓派的 Mycroft Precise 目录下,然后运行 kwsdemo.py 文件,说出“极客时间”几个字,就会看到终端显示出“hello”这个单词。

语音识别

对于语音识别,我们直接采用腾讯云提供的语音识别 SDK 来完成(你需要提前在腾讯云控制台开通这个服务)。它会将语音发送到云端,由云端服务器计算出文本信息。你可以通过下面命令来安装:

$ pip3 install tencentcloud-sdk-python

在开始使用之前,你需要访问这个链接创建一个密钥,然后记录下 SecretId 和 SecretKey 的信息。
你可以参考下面的代码,来完成一个录音文件的识别。

from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.asr.v20190614 import asr_client, models
import base64
import io
import sys SECRET_ID = "你的Secret ID"
SECRET_KEY = "你的Secret Key"try: cred = credential.Credential(SECRET_ID, SECRET_KEY) httpProfile = HttpProfile()httpProfile.endpoint = "asr.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclientProfile.signMethod = "TC3-HMAC-SHA256"  client = asr_client.AsrClient(cred, "ap-beijing", clientProfile) #读取文件以及 base64with open('./geektime-00.wav', "rb") as f:if sys.version_info[0] == 2:content = base64.b64encode(f.read())else:content = base64.b64encode(f.read()).decode('utf-8')f.close()#发送请求req = models.SentenceRecognitionRequest()params = {"ProjectId":0,"SubServiceType":2,"SourceType":1,"UsrAudioKey":"sessionid-geektime"}req._deserialize(params)req.DataLen = len(content)req.Data = contentreq.EngSerViceType = "16k_zh"req.VoiceFormat = "wav"resp = client.SentenceRecognition(req) print(resp.to_json_string()) except TencentCloudSDKException as err: print(err)

语音合成

接下来,我来介绍一下语音合成。
你可能会问,刚才介绍技术架构的时候,不是还讲了自然语言理解、技能和自然语言生成吗?这里怎么跳过去了呢?
首先,因为我们的任务很简单,只需要查询语音识别的文本中是否有“开”、“灯”,和“关”、“灯”就可以完成判断,所以自然语言理解直接判断字符串是否匹配即可。
其次,我们要实现控制智能电灯,这个技能我在后面会介绍。
最后,智能音箱只需要反馈执行开关灯的结果就可以,比如“我已经把灯打开了”或者“我已经把灯关了”,自然语言生成的部分按照固定的文本就可以了,不需要考虑动态生成的问题。
语音合成,就是我们希望把类似“我已经把灯关了”这样的文本信息,转换为音频,便于智能音箱播放出来。你可以基于离线的 TTS 引擎来实现,比如HanTTS这个项目。
当然,我们也可以使用腾讯云的语音合成服务(你需要提前在腾讯云控制台开通这个服务)。你可以参考下面的代码:

import json
import base64from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.tts.v20190823 import tts_client, modelsSECRET_ID = "你的Secret ID"
SECRET_KEY = "你的Secret Key"try: cred = credential.Credential(SECRET_ID, SECRET_KEY) httpProfile = HttpProfile()httpProfile.endpoint = "tts.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = tts_client.TtsClient(cred, "ap-beijing", clientProfile) req = models.TextToVoiceRequest()params = {"Text": "我已经把灯关了","SessionId": "sessionid-geektime","ModelType": 1,"ProjectId": 0,"VoiceType": 1002}req.from_json_string(json.dumps(params))resp = client.TextToVoice(req) print(resp.to_json_string()) if resp.Audio is not None:audio = resp.Audiodata = base64.b64decode(audio)wav_file = open("temp.wav", "wb")wav_file.write(data)wav_file.close()except TencentCloudSDKException as err: print(err)

通过智能音箱控制电灯

为了实现控制智能电灯的目的,我们需要借助物联网平台提供的开发接口。
首先,我们进入物联网开发平台,选择“智能家居”项目。

然后,点击左侧的“应用开发”,进入新建应用的界面,点击“新建应用”。

完成后,点击应用列表里面的应用名称,进入应用的详情页面。你可以看到应用的 SecretId 和 SecretKey 信息。这里,你需要将下面“关联产品”中的智能电灯勾选上。只有建立关联,应用才可以控制这个设备。

具体代码可以参考腾讯提供的开源实现,包括iOS、Android和小程序。
不过,这种方式需要用户账号的登录认证,在树莓派上不太方便。还有一个方式就是基于物联网开发平台提供的通用 API 接口。其中的“设备远程控制”接口可以满足我们的需求。
具体的控制方法,你可以参考下面的代码(注意,目前只支持 ap-guangzhou 区域)。

import json
from led2.main import PRODUCT_ID
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iotexplorer.v20190423 import iotexplorer_client, modelsSECRET_ID = "你的Secret ID"
SECRET_KEY = "你的Secret Key"
PRODUCT_ID = "你的ProductID"def Light_control(state):try: cred = credential.Credential(SECRET_ID, SECRET_KEY) httpProfile = HttpProfile()httpProfile.endpoint = "iotexplorer.tencentcloudapi.com"clientProfile = ClientProfile()clientProfile.httpProfile = httpProfileclient = iotexplorer_client.IotexplorerClient(cred, "ap-guangzhou", clientProfile) req = models.ControlDeviceDataRequest()data = {"power_switch": state}data_str = json.dumps(data)params = {"DeviceName": "Led_1","ProductId": PRODUCT_ID,"Data": data_str}req.from_json_string(json.dumps(params))resp = client.ControlDeviceData(req) print(resp.to_json_string()) except TencentCloudSDKException as err: print(err) Light_control(0)

小结

总结一下,在这一讲中,我介绍了智能音箱的技术架构,以及在树莓派上用于实现智能音箱的一些可选的技术方案,并且带你实现了语音控制智能电灯的目的。你需要重点关注的知识有:
1.智能音箱的实现,需要前端音箱本体和后端云平台上一系列技术的支持。这些技术有前端的拾音、语音信号处理、语音唤醒和播音,以及后端的语音识别、自然语言理解、技能、自然语言生成和语音合成。
2.在树莓派的实现上,拾音可以选择使用麦克风阵列,因为基于麦克风阵列可以更好地实现前端语音信号处理,比如声源定位和波束成型等。
3.语言唤醒需要在智能音箱本体上实现,所以需要一些轻量级的识别引擎和训练好的唤醒词模型。之前比较流行的 Snowboy 将要停止服务,这里我选择了 Mycroft Precise 这个开源方案。
4.语音识别、自然语言理解、技能、自然语言生成和语音合成等任务适合基于云平台的能力来实现,因为云平台的计算能力更强,有更好的性能和准确度。
智能音箱的技术也一直在发展,比如现在越来越多的智能音箱开始配备屏幕和摄像头,这为智能音箱引入了声音、UI 和视觉等多模态的交互方式,相应地,这也给声纹识别、人脸识别和动作识别等技术带来了新的应用场景。我相信智能音箱未来的产品形态和功能还会不断地进化和发展。

思考题

最后,我给你留一个思考题吧。
在这一讲中,我们是通过物联网平台提供的 API 接口来控制智能电灯的。除了这种方式,你还能想到其他的方法来远程控制智能电灯吗?你能实现一个虚拟的联网开关,基于场景联动来控制智能电灯的开和关吗?

注:学习笔记总结自‘物联网开发实战’–郭朝斌
–笔记只用于学习交流,请不要用于商业用途。

智能语音:好玩的语音控制是怎么实现的?学习笔记01相关推荐

  1. 《物联网开发实战》18 场景联动:智能电灯如何感知光线?(上)(学习笔记)

    仅作为本人学习<物联网开发实战>的学习笔记,原课程链接:极客时间<物联网开发实战>--郭朝斌 文章目录 第一步:通信技术 第二步:选择开发板 第三步:准备 MicroPytho ...

  2. 大数据与智能算法(二-应用级技术)-SMU在线学习笔记

    [课程来源]感谢B站Up主leonding1018的分享,老师的课程内容非常精彩. 本文是观看网络视频课程后的笔记,如涉及版权问题,请及时留言或私信与我联系. 上一篇讲述了一些基本算法,详见<大 ...

  3. 管理节点连接不上sql节点_华为云IEF智能边缘平台十万边缘节点管理技术深度解读学习笔记...

    华为云智能边缘平台IEF首席架构师张琦在3月27-28日举办的华为开发者大会2020(Cloud)上,深度解读了十万边缘节点的管理技术,以及如何通过云原生技术和边缘计算结合,构建边缘计算实战场景中所需 ...

  4. AI语音技能云开发(天猫精灵技能)学习笔记之一

    打开网址:天猫精灵开放平台首页天猫精灵开放平台基于天猫精灵的硬件和生态,提供一站式语音开发能力.IoT设备控制能力.AI集成算法集成能力.数字内容变现能力等.https://aligenie.com/ ...

  5. AI语音技能云开发(天猫精灵技能)学习笔记(结营)

    通过5天的学习,基本了解天猫精灵技能开发的流程,下面做一个小demo,作为结营作业 目标:购物清单中物品的价格查询 一.登录,进入控制台,创建新技能 天猫精灵开放平台首页 (aligenie.com) ...

  6. PMSM无感foc控制(传统SMO)学习笔记

    永磁同步电机无感控制学习 一.永磁同步电机无感控制主要方法概述 (一)基于永磁同步电机基本磁链关系的转速和位置估算方法 1.直接计算方法 可直接检测的量是定了三相电压和电流,利用它们计算出转了位置角和 ...

  7. 51单片机用电位器AD/DA控制舵机(SG090)------51单片机学习笔记(程序粗糙待优化)

    首先认识一下电位器和舵机如下图 如何通过电位器控制舵机,让舵机随着电位器的旋转而跟着转动呢,整个思路是这样的,先采集电位器的信号,然后通过类比信号输出PWM来控制舵机的转动,下面我们来进行第一步,采集 ...

  8. “物联网开发实战”学习笔记-(四)智能音箱制作和语音控制

    "物联网开发实战"学习笔记-(四)智能音箱制作和语音控制 这次来造一个属于自己的智能音箱,这里详细介绍了智能音箱的语音控制的实现. 智能音箱的技术架构 智能音箱主要涉及拾音.前端信 ...

  9. ESP-Skainet智能语音助手,智能物联网方案,语音唤醒识别准确率高

    消费级智能硬件是最早显示出市场潜力的赛道,市场各方都在瞄准消费级智能交互终端.而智能终端的背后还有广阔的生态,包括语音开放平台.语音操作系统.内容等等. 近年行业正在经历从单一商业模式向多元化商业模式 ...

最新文章

  1. python递归详解_python基于递归解决背包问题详解
  2. PostgreSQL新手入门教程
  3. 第一章 SDN介绍 (附件4)【 SDN的核心技术:【OpenFlow】】
  4. 单元测试: gmock
  5. 网络知识:宽带下载网速是30MB/s,经过路由器后仅10MB/s,看完你就懂了!
  6. Hbase二级索引 Solr 异常 The most likely cause is another Solr server (or another solr core in this server)
  7. linux 火锅平台,“定制版火锅”来袭,持续创新才能永葆活力
  8. 容器编排技术 -- Kubernetes kubectl create service clusterip 命令详解
  9. “常程跳槽小米”裁决出炉:常程继续履行竞业限制,还要赔500多万...
  10. 证书(3)如何在程序中使用数字证书
  11. 网站内容排版可用性分析
  12. QVector、QList、QLinkedList类用法区别
  13. C语言形参和实参以及C#中的ref
  14. 应如何取B/S的B端的IP
  15. 判断数据类型的几种方法
  16. 西门子smart200 圆弧插补 整合画图程序 2轴3轴
  17. VC之获取计算机网卡mac地址
  18. 山东大学项目实训-智能人物画像分析系统
  19. linux中ping命令停不下来解决方案
  20. c语言中百分号后面跟的数字_C语言中的各种百分号都代表什么意思? c语言中百分号后的数字是...

热门文章

  1. w10计算机怎么恢复出厂设置路由器,win10无线路由器设置步骤图_win10重置路由器后怎么设置...
  2. VC版DoEvents/处理事件
  3. V-SLAM重读(3):SVO代码阅读和调试修改
  4. MFC中在界面上添加背景图片的方法
  5. 用哪些特殊的字符方便作为分隔符
  6. 从苏宁电器到卡巴斯基(第二部)第02篇:我在卡巴的日子 II
  7. Android获取本机号码闪退,手机号码是移动的,现在手机已经停机,想充话费却不知道本机号码,肿么查询本机号码?()...
  8. Intel MIC (至强融核) 安装步骤
  9. Sentinel2 哨兵2数据下载方法
  10. 格理论与密码学(二)