树莓派如何实现语音播报,树莓派开发系列
树莓派如何实现语音播报,树莓派开发系列snowboy识别到热词$ python3 demo.py resources/models/snowboy.umdl然后对着麦克风清晰地讲出“snowboy”,如果可以听到“滴”的声音,则表示识别成功。命令行输出如下:在这套系统中,语音唤醒功能是一个比较重要的模块,简单来说它就是在后台静默地运行着一个占用较少系统资源的服务(语音识别组件),该组件一直处于监视麦克风输入的状态,如果有检测到特定的语音输入(即唤醒词或“热词”),则激活与之绑定的某个程序“开关”。相当于一个简化版的语音助手吧,只对某一个特定的词汇进行响应,识别后也只完成某一件指定的任务。如果说同语音助手的交互是一段持续的交流,那么语音唤醒即可作为这种连续交流的入口(打招呼)。我们使用开源的snowboy来实现语音唤醒的功能。安装步骤如下:sudo apt-get install pulseaudio sudo apt-get
在我们的生活中,智能音箱的应用铺天盖地,“小爱同学”、“天猫精灵”,每每呼唤着这些热词,就会给我们带来无限的乐趣,但是这背后蕴藏着怎么样的科学技术呢?又或者我们能不能自己动手来制作一个这样的智能音箱呢?答案当然是肯定的,而且利用树莓派,就可以完全地搭建一套智能音箱系统。当然搭建一套完整的智能音箱系统是要投入巨大精力的事情。我们为了说明原理和方法,就把目标简化一下:实现一套能通过语音唤醒,查询城市天气预报并语音播报的智能系统。功能虽然简单,但是它涵盖了智能音箱的几项关键技术。下面我们就来动手吧:)
智能音箱
硬件准备我们要准备好以下的材料,首先当然是树莓派的主板(含SD卡),系统最好能够SSH登录;然后为了采集语音,要准备一个USB的麦克风,关于树莓派麦克风的知识,可以参考我的前文《树莓派开发系列(六) 让我来教你听懂人话吧》;最后为了播报语音,需要准备一个3.5mm音频接口的小音箱,当然如果仅仅为了测试,用耳机替代也是可以的。
硬件材料
语音唤醒模块在这套系统中,语音唤醒功能是一个比较重要的模块,简单来说它就是在后台静默地运行着一个占用较少系统资源的服务(语音识别组件),该组件一直处于监视麦克风输入的状态,如果有检测到特定的语音输入(即唤醒词或“热词”),则激活与之绑定的某个程序“开关”。相当于一个简化版的语音助手吧,只对某一个特定的词汇进行响应,识别后也只完成某一件指定的任务。如果说同语音助手的交互是一段持续的交流,那么语音唤醒即可作为这种连续交流的入口(打招呼)。
我们使用开源的snowboy来实现语音唤醒的功能。安装步骤如下:
sudo apt-get install pulseaudio
sudo apt-get install python3-pyaudio
sudo apt-get install swig
sudo apt-get install libatlas-base-dev
$ git clone https://github.com/Kitt-AI/snowboy.git
$ cd snowboy/swig/Python3 && make
进入官方示例目录 snowboy/examples/Python3 并运行以下命令:
$ python3 demo.py resources/models/snowboy.umdl
然后对着麦克风清晰地讲出“snowboy”,如果可以听到“滴”的声音,则表示识别成功。命令行输出如下:
snowboy识别到热词
大部分情况下,我们都需要创建自己的热词,关于创建热词,我们可以将热词录音(需要三个)上传到snowboy的官网进行训练,训练后会得到一个umdl的模型文件,以后识别的时候就使用这个模型文件替换系统默认的文件就可以了。
天气预报数据获取关于城市实时天气预报的获取,我使用的是聚合网的免费接口。通过python的request库来调用接口,就能非常方便地获取到详细的实时天气数据。大家注意在调用接口前,需要先到聚合网注册账户,进行实名认证,最后开通天气预报的接口权限,拿到appkey就可以了,这一切都是免费的。最后贴上代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import requests
# 根据城市查询天气
def request1(appkey):
url = "http://apis.juhe.cn/simpleWeather/query"
params = {
"city": "上海" # 要查询的城市,如:温州、上海、北京
"key": appkey # 应用APPKEY(应用详细页查询)
"dtype": "json" # 返回数据的格式 xml或json,默认json
"format": 1
}
f = requests.get(url=url params=params)
res = f.json()
if res:
error_code = res["error_code"]
print(error_code)
if error_code == 0:
# 成功请求
print(res["result"])
result = res["result"]
str = "上海当前天气情况:" result["realtime"]["info"] "。气温:" result["realtime"]["temperature"] "摄氏度"
return str
else:
print("%s:%s" % (res["error_code"] res["reason"]))
else:
print("request api error")
if __name__ == '__main__':
request1('XXXXXX')
语音合成及播报
在获取到了天气预报的文字信息后,就需要将这段文字变为语音文件,这个过程叫做语音合成处理,我使用的的是百度的在线语音合成接口,关于这块详细的介绍请参考的我的前文《树莓派开发系列(三) 小派,先学会说话》,里面有详细的实现过程,在语音文件生成完成以后我们调用播放器播放文件就可以了。这块的详细代码如下:
from aip import AipSpeech
import os
""" 你的 APPID AK SK """
APP_ID = 'XXXXXXX'
API_KEY = 'XXXXXXXXXXXXXXXXX'
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXX'
def baidutts(info):
client = AipSpeech(APP_ID API_KEY SECRET_KEY)
result = client.synthesis(info 'zh' 1 {
'vol': 5
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result dict):
with open('audio.mp3' 'wb') as f:
f.write(result)
cmd = 'mpg123 audio.mp3'
d = os.system(cmd)
print(d)
if __name__ == '__main__':
baidutts('您好,我是百度')
至此我们的整个智能天气播报系统就搭建起来了,对着它说:“小派小派”,只听滴的一声,音箱里面就开始播报了上海的实时天气预报,是不是很简单呢:)有了这些技术,我们是不是能挖掘一些更有趣的应用呢,让我们一起开动脑筋吧。
天气预报