树莓派文字转语音 python_利用爬虫和树莓派3打造自己的语音天气闹钟

翻出吃灰很久的树莓派,又把这个语音天气闹钟的程序优化了一下。

---------------------------分割线2017.07.15---------------------------

终于挤出时间修复了一个大bug,竟然没有一个人说程序运行不正常。看来大家都是只收藏不行动啊。现在最新版直接把代码拷走,安装好依赖库,本地运行就可以实现每天定时播报语音天气了!( 逃

---------------------------分割线2017.02.22---------------------------

前言

前不久又一次一个人在他乡过了生日,悄悄买了一台树莓派3送给自己做生日礼物。终于算是实现了大学以来一直的一个小愿望。买回来之后当然不能让他落灰,于是就利用自己的爬虫技术+树莓派+小音箱实现了一个定时闹钟外加语音天气播报功能。

准备树莓派3

小音箱

环境

python 3.4

获取所在位置天气

这里选择墨迹天气获取实时天气信息,地址: 墨迹天气

进入墨迹天气的页面,墨迹天气会根据你的ip加载相应地区的天气。 这次我们主要抓取温度、天气、湿度、风力、空气质量和天气提示这几个数据。

这种小爬虫我们就不用Scrap那种重型武器啦,使用requests和BeautifulSoup这两个超级好用的库可以快速实现(Ps:这两个库是Python的第三方库,需要自己安装。pip install requests、pip install BeautifulSoup4分别使用这两条命令安装。)。

import re

import requests

from datetime import datetime

from bs4 import BeautifulSoup

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'

'/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'

'i/537.36',

}

res2 = requests.get('http://tianqi.moji.com/', headers=headers)

soup = BeautifulSoup(res2.text, "html.parser")

temp = soup.find('div', attrs={'class': 'wea_weather clearfix'}).em.getText()

weather = soup.find('div', attrs={'class': 'wea_weather clearfix'}).b.getText()

sd = soup.find('div', attrs={'class': 'wea_about clearfix'}).span.getText()

sd_num = re.search(r'\d+', sd).group()

sd = sd.replace(sd_num, sd_num_zh)

wind = soup.find('div', attrs={'class': 'wea_about clearfix'}).em.getText()

aqi = soup.find('div', attrs={'class': 'wea_alert clearfix'}).em.getText()

aqi_num = re.search(r'\d+', aqi).group()

aqi = aqi.replace(aqi_num, aqi_num_zh)

info = soup.find('div', attrs={'class': 'wea_tips clearfix'}).em.getText()

sd = sd.replace(' ', '百分之').replace('%', '')

aqi = 'aqi' + aqi

today = datetime.now().date().strftime('%Y年%m月%d日')

text = '早上好!今天是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s' % \

(today, weather, temp, sd, wind, aqi, info)

至于Requests和Beautiful Soup的用法这里就先不多说了,大家可以去看他们的中文文档。

命令行播放语音

使用mplayer实现语音播放,通过以下命令安装mplayer:

sudo apt-get install mplayer

用法很简单输入以下命令即可播放本地音乐:

mplayer \xxx\xxx\xxx.mp3(绝对地址)

如果是在线音乐也可以用mplayer直接通过URL播放:

mplayer "URL"(URL外面一定要用双引号圈起来)

文字转语音

刚开始想通过 python 的库实现本地文字转语音,在 windows 系统下没有问题,但树莓派3上中文无法转换。后来就找到了百度的文字转换语音API,地址:http://yuyin.baidu.com/#try

还可以选各种声音,调节语速。虽然它没有给出直接的api接口,但是我们利用Chrome浏览器的开发者模式可以找到api。

import os

url = u'http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_' \

u'demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5'.format(text)

os.system('mplayer "%s"' % url)

实现定时播放语音

我们使用crontab来实现每天定时启动程序。

30 07 * * * /usr/bin/python3 /home/pi/Documens/Python/weather_voice.py

Ps:注意crontab中的路径要使用绝对路径。

具体的crontab用法就不在这里一一讲解了,大家随便搜索一下就有很多。

结尾

中间还遇到了一些小bug,比如说语音转文字的过程中数字只能一个一个的念出来,做为一个完美主义者肯定不能忍受这个,12摄氏度给我播报成一二摄氏度怎么行!!!所以就写了一个小函数专门转换数字为中文。最后所有的代码整合起来就是这样啦。

# -*- coding: utf-8 -*-

# @Time : 2017/1/15 15:16

# @Author : woodenrobot

import os

import re

import time

import requests

from datetime import datetime, timedelta

from bs4 import BeautifulSoup

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit'

'/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar'

'i/537.36',

}

def numtozh(num):

num_dict = {1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七',

8: '八', 9: '九', 0: '零'}

num = int(num)

if 100 <= num < 1000:

b_num = num // 100

s_num = (num-b_num*100) // 10

g_num = (num-b_num*100) % 10

if g_num == 0 and s_num == 0:

num = '%s百' % (num_dict[b_num])

elif s_num == 0:

num = '%s百%s%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))

elif g_num == 0:

num = '%s百%s十' % (num_dict[b_num], num_dict.get(s_num, ''))

else:

num = '%s百%s十%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))

elif 10 <= num < 100:

s_num = num // 10

g_num = (num-s_num*10) % 10

if g_num == 0:

g_num = ''

num = '%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))

elif 0 <= num < 10:

g_num = num

num = '%s' % (num_dict[g_num])

elif -10 < num < 0:

g_num = -num

num = '零下%s' % (num_dict[g_num])

elif -100 < num <= -10:

num = -num

s_num = num // 10

g_num = (num-s_num*10) % 10

if g_num == 0:

g_num = ''

num = '零下%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))

return num

def get_weather():

# 下载墨迹天气主页源码

res = requests.get('http://tianqi.moji.com/', headers=headers)

# 用BeautifulSoup获取所需信息

soup = BeautifulSoup(res.text, "html.parser")

temp = soup.find('div', attrs={'class': 'wea_weather clearfix'}).em.getText()

temp = numtozh(int(temp))

weather = soup.find('div', attrs={'class': 'wea_weather clearfix'}).b.getText()

sd = soup.find('div', attrs={'class': 'wea_about clearfix'}).span.getText()

sd_num = re.search(r'\d+', sd).group()

sd_num_zh = numtozh(int(sd_num))

sd = sd.replace(sd_num, sd_num_zh)

wind = soup.find('div', attrs={'class': 'wea_about clearfix'}).em.getText()

aqi = soup.find('div', attrs={'class': 'wea_alert clearfix'}).em.getText()

aqi_num = re.search(r'\d+', aqi).group()

aqi_num_zh = numtozh(int(aqi_num))

aqi = aqi.replace(aqi_num, aqi_num_zh).replace(' ', ',空气质量')

info = soup.find('div', attrs={'class': 'wea_tips clearfix'}).em.getText()

sd = sd.replace(' ', '百分之').replace('%', '')

aqi = 'aqi' + aqi

info = info.replace(',', ',')

# 获取今天的日期

today = datetime.now().date().strftime('%Y年%m月%d日')

# 将获取的信息拼接成一句话

text = '早上好!今天是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s' % \

(today, weather, temp, sd, wind, aqi, info)

return text

def text2voice(text):

url = 'http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_' \

'demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5'.format(text)

# 直接播放语音

os.system('mplayer "%s"' % url)

def main():

# 获取需要转换语音的文字

text = get_weather()

print(text)

# 获取音乐文件绝对地址

mp3path2 = os.path.join(os.path.dirname(__file__), '2.mp3')

# 先播放一首音乐做闹钟

os.system('mplayer%s' % mp3path2)

# 播报语音天气

text2voice(text)

if __name__ == '__main__':

main()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值