天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看。这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 python 来朗读给你听吧。
网页转换成语音,步骤无外乎:
网页正文识别,获取到正文的文本内容;
文本转语音,通过接口将文本转换成语音文件;
语音文件的发声,即将语音文件读出;
1 网页正文识别
之所以用 python,就是因为 python 有着丰富的库,网页正文识别也不在话下。这里用
readability、goose3
1.1 readability
readability 支持 python3,使用 pip install readability-lxml 安装即可。
readability 使用起来也很方便:
1
2
3
4
5
|
import requests from readability import document response = requests.get( 'http://news.china.com/socialgd/10000169/20180616/32537640_all.html' ) doc = document(response.text) print (doc.title()) |
但是 readability 提取到的正文内容不是文本,里面仍包含 html 标签。
当然也可以结合其他组件再对 html 进行处理,如 html2text,我们这里就不再延伸,有兴趣的可以自行尝试。
1.2 goose3
goose 本来是一个用 java 编写的文章提取器,后来就有了 python 实现版: goose3 。
使用起来也很方便,同时对中文支持也不错。使用 pip install goose3 即可安装。
1
2
3
4
5
6
|
>>> from goose3 import goose >>> from goose3.text import stopwordschinese >>> url = 'http://news.china.com/socialgd/10000169/20180616/32537640_all.html' >>> g = goose({ 'stopwords_class' : stopwordschinese}) >>> article = g.extract(url = url) >>> print (article.cleaned_text[: 150 ]) |
北京时间6月15日23:00(圣彼得堡当地时间18:00),2018年世界杯b组一场比赛在圣彼得堡球场展开角逐,伊朗1比0险胜摩洛哥,伊朗前锋阿兹蒙半场结束前错过单刀机会,鲍哈杜兹第95分钟自摆乌
龙。这是伊朗20年来首度在世界杯决赛圈取胜。
本届世界杯,既相继出现替补便进球,贴补梅开二度以及东道主
可以看出网页正文提取效果还不错,基本满足我们的要求,可以使用!
注意:goose 还有另外一个 python2 的版本:python-goose,使用方法和 goose3 基本一样。
2 文本转语音
文本转语音,百度、阿里、腾讯、讯飞等都有提供 rest api 接口,阿里和腾讯的申请相对时间较长,阿里的貌似还要收费,百度和讯飞的在线申请后即可使用。
没办法,好的东西得来总是要曲折一些。其中百度的没有调用量的限制(其实默认是 200000 次/天),讯飞有每天 500 次的限制。
这里我们使用百度的 rest api 接口中的语言合成接口,一方面原因是百度的调用次数没有限制,另一方面,我大致看了下讯飞的接口文档,接口限制还是比较多的。还有就是百度提供了 rest api 的 python 封装,使用也更方便。
2.1 baidu-aip 的使用
百度提供了 python sdk,使用 pip install baidu-aip 可以直接安装。接口的使用可以参考接口文档:http://ai.baidu.com/docs#/tts-online-python-sdk/top。
使用示例如下:
1
2
|
from aip import aipspeech """ |
你的 appid ak sk
均可在服务控制台中的应用列表中查看。
1
2
3
4
5
6
7
8
9
10
11
12
|
""" app_id = '你的 app id' api_key = '你的 api key' secret_key = '你的 secret key' client = aipspeech(app_id, api_key, secret_key) result = client.synthesis( '你好,你在做什么' , 'zh' , 3 , { 'vol' : 5 , }) # 识别正确返回语音二进制 错误则返回dict 参照下面错误码 if not isinstance (result, dict ): with open ( 'auido.mp3' , 'wb' ) as f: f.write(result) |
接口参数:
接口对单次传入的文本进行了限制,合成文本长度必须小于 1024 字节,如果文本长度过长,就需要进行切割处理,采用多次请求的方式,分别转换成语音文件,最后再将多个语音文件合并成一个。
2.2 文本切割
可以使用如下代码将文本分割成多个长度为 500 的文本列表
1
2
|
# 将文本按 500 的长度分割成多个文本 text_list = [text[i:i + 500 ] for i in range ( 0 , len (text), 500 )] |
我们使用 pydub 来处理生成的音频文件。使用 pip install pydub 即可安装。
另外还 Ubuntu 环境需要安装依赖的,使用 sudo apt-get install libav-tools 安装即可,而在 Windows 环境需要到 https://ffmpeg.zeranoe.com/builds/ 下载 FFmpeg,并将其配置到环境变量中。
若还有问题,可以参考官网配置:https://github.com/jiaaro/pydub。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 合并音频文件 def merge_voice(file_list): voice_dict = {} song = none for i,f in enumerate (file_list): if i = = 0 : song = audiosegment.from_file(f, "mp3" ) else : # 拼接音频文件 song + = audiosegment.from_file(f, "mp3" ) # 删除临时音频 os.unlink(f) # 导出合并后的音频文件,格式为mp3格式 file_name = str (uuid.uuid1()) + ".mp3" song.export(file_name, format = "mp3" ) return file_name |
通过百度的接口,我们可以将文字转化成音频文件,下面的问题就是如何播放音频文件。
3 音频文件播放
网上获取到 python 播放 wav 文件的方式由好几种,包括 pyaudio、pygame、winsound、playsound。不过测试下来,只有 playsound 成功。其他方式有兴趣的可以试下,有问题可以留言交流。
使用 pip install playsound 安装后即可使用。
使用也很简单
1
2
|
>>> from playsound import playsound >>> playsound( '/path/to/a/sound/file/you/want/to/play.mp3' ) |
说明:音频的播放需要在图形化页面下运行,因为命令行模式下,没有播放声音的出口。
1
|
python page2voice.py - u https: / / so.gushiwen.org / shiwenv_c244fc77f6fb.aspx |
运行后,代码就会自动解析网页并进行朗读啦。
至此,网页到音频的转换就结束了,当然程序没有这么完美,比如中英文混合的网页解析和转换的结果就不怎么理想,但是纯中文的新闻页面效果还是不错的。
总结
以上所述是小编给大家介绍的python网页正文转换语音文件的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://www.jianshu.com/p/140198c09088