下面就是Python3爬虫之自动查询天气并实现语音播报的完整攻略。
一、准备工作
1.安装依赖库
- requests:用于获取网页HTML内容
- lxml:用于解析HTML内容
- pyaudio:用于音频播放
- SpeechRecognition:用于语音识别
- gtts:Google Text-to-Speech,用于把文字转换成语音
安装命令如下:
pip3 install requests lxml pyaudio SpeechRecognition gtts
2.查找天气API
在开发前需要查找一个天气API来获取天气数据。这里我们使用的是阿里云天气API,其文档地址为:https://market.aliyun.com/products/57124001/cmapi011257.html
在进入文档后,我们可以看到该天气API有两个版本,我们选择RESTful版。
接下来,我们进入天气API的开通页面,并根据提示操作。开通成功后,记录access_key和app_code,即可使用该API。
二、代码实现
1.获取天气数据
首先,我们需要通过requests库获取天气数据。在这里,我们以北京市为例,获取其当天的天气数据。
import requests
import json
# 阿里云天气API的请求URL
url = "https://api.caiyunapp.com/v2.5/<access_key>/<longitude>,<latitude>/daily.json"
# 替换URL中的access_key和经纬度
url = url.replace("<access_key>", "access_key").replace("<longitude>", "116.407526").replace("<latitude>", "39.90403")
# 发起请求,并得到JSON格式的响应数据
response = requests.get(url)
data = json.loads(response.text)
# 解析JSON数据,获取当天天气数据
today = data["result"]["daily"]["temperature"][0]
temperatureMax = int(today["max"])
temperatureMin = int(today["min"])
precipitation = today.get("precipitation", 0)
2.语音播报天气数据
接下来,我们需要使用gtts库把获取到的天气数据转换成语音,以便于我们听到。
from gtts import gTTS
# 拼接出要播报的文本
text = "今天北京的最高气温为{}摄氏度,最低气温为{}摄氏度,降水量为{}毫米。".format(temperatureMax, temperatureMin, precipitation)
# 使用gtts库把文本转换成语音
tts = gTTS(text, lang="zh-cn")
tts.save("weather.mp3")
3.语音播放
最后,我们需要使用pyaudio库播放音频文件,以让我们听到播报出来的天气数据。
import pyaudio
import wave
# 定义音频播放函数
def play_audio(filename):
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True)
data = wf.readframes(1024)
while data:
stream.write(data)
data = wf.readframes(1024)
stream.stop_stream()
stream.close()
p.terminate()
# 播放语音
play_audio("weather.mp3")
三、完整代码
import requests
import json
from gtts import gTTS
import pyaudio
import wave
# 获取天气数据
url = "https://api.caiyunapp.com/v2.5/<access_key>/<longitude>,<latitude>/daily.json"
url = url.replace("<access_key>", "access_key").replace("<longitude>", "116.407526").replace("<latitude>", "39.90403")
response = requests.get(url)
data = json.loads(response.text)
today = data["result"]["daily"]["temperature"][0]
temperatureMax = int(today["max"])
temperatureMin = int(today["min"])
precipitation = today.get("precipitation", 0)
# 把天气数据转换成语音
text = "今天北京的最高气温为{}摄氏度,最低气温为{}摄氏度,降水量为{}毫米。".format(temperatureMax, temperatureMin, precipitation)
tts = gTTS(text, lang="zh-cn")
tts.save("weather.mp3")
# 播放语音
def play_audio(filename):
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True)
data = wf.readframes(1024)
while data:
stream.write(data)
data = wf.readframes(1024)
stream.stop_stream()
stream.close()
p.terminate()
play_audio("weather.mp3")
四、示例说明
示例一:自动查询天气并播报
在该示例中,我们编写一个自动查询天气并播报的程序。该程序每天定时运行一次,获取当天天气数据,并把数据转换成语音播报出来。
import requests
import json
from gtts import gTTS
import pyaudio
import wave
import schedule
import time
# 获取天气数据
def get_weather():
url = "https://api.caiyunapp.com/v2.5/<access_key>/<longitude>,<latitude>/daily.json"
url = url.replace("<access_key>", "access_key").replace("<longitude>", "116.407526").replace("<latitude>", "39.90403")
response = requests.get(url)
data = json.loads(response.text)
today = data["result"]["daily"]["temperature"][0]
temperatureMax = int(today["max"])
temperatureMin = int(today["min"])
precipitation = today.get("precipitation", 0)
# 把天气数据转换成语音
text = "今天北京的最高气温为{}摄氏度,最低气温为{}摄氏度,降水量为{}毫米。".format(temperatureMax, temperatureMin, precipitation)
tts = gTTS(text, lang="zh-cn")
tts.save("weather.mp3")
# 定义音频播放函数
def play_audio(filename):
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True)
data = wf.readframes(1024)
while data:
stream.write(data)
data = wf.readframes(1024)
stream.stop_stream()
stream.close()
p.terminate()
# 播放天气语音
def play_weather():
play_audio("weather.mp3")
# 定时查询并播报天气
def job():
get_weather()
play_weather()
schedule.every().day.at("10:30").do(job)
while True:
schedule.run_pending()
time.sleep(1)
示例二:语音查询天气
在该示例中,我们编写一个可以使用语音查询天气的程序。当用户说出“查询天气”时,程序自动获取当天天气数据,并把数据转换成语音播报出来。
import requests
import json
import pyaudio
import wave
import speech_recognition as sr
from gtts import gTTS
# 获取天气数据
def get_weather():
url = "https://api.caiyunapp.com/v2.5/<access_key>/<longitude>,<latitude>/daily.json"
url = url.replace("<access_key>", "access_key").replace("<longitude>", "116.407526").replace("<latitude>", "39.90403")
response = requests.get(url)
data = json.loads(response.text)
today = data["result"]["daily"]["temperature"][0]
temperatureMax = int(today["max"])
temperatureMin = int(today["min"])
precipitation = today.get("precipitation", 0)
# 把天气数据转换成语音
text = "今天北京的最高气温为{}摄氏度,最低气温为{}摄氏度,降水量为{}毫米。".format(temperatureMax, temperatureMin, precipitation)
tts = gTTS(text, lang="zh-cn")
tts.save("weather.mp3")
# 定义音频播放函数
def play_audio(filename):
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True)
data = wf.readframes(1024)
while data:
stream.write(data)
data = wf.readframes(1024)
stream.stop_stream()
stream.close()
p.terminate()
# 使用麦克风识别语音指令
def recognize_voice():
r = sr.Recognizer()
with sr.Microphone() as source:
audio = r.listen(source)
text = r.recognize_google(audio, language='zh-CN')
return text
# 播报天气语音
def play_weather():
play_audio("weather.mp3")
while True:
text = recognize_voice()
if "查询天气" in text:
get_weather()
play_weather()
以上就是Python3爬虫之自动查询天气并实现语音播报的完整攻略。希望对大家有帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3爬虫之自动查询天气并实现语音播报 - Python技术站