Python网页正文转换语音文件的操作方法


Posted in Python onDecember 09, 2018

天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看。这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 Python 来朗读给你听吧。

网页转换成语音,步骤无外乎:

网页正文识别,获取到正文的文本内容;

文本转语音,通过接口将文本转换成语音文件;

语音文件的发声,即将语音文件读出;

Python网页正文转换语音文件的操作方法

1 网页正文识别

之所以用 Python,就是因为 Python 有着丰富的库,网页正文识别也不在话下。这里用

readability、goose3

1.1 readability

readability 支持 Python3,使用 pip install readability-lxml 安装即可。

readability 使用起来也很方便:

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 即可安装。

>>> 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。

使用示例如下:

from aip import AipSpeech
"""

你的 APPID AK SK

均可在服务控制台中的应用列表中查看。

"""
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)

接口参数:

Python网页正文转换语音文件的操作方法

接口对单次传入的文本进行了限制,合成文本长度必须小于 1024 字节,如果文本长度过长,就需要进行切割处理,采用多次请求的方式,分别转换成语音文件,最后再将多个语音文件合并成一个。

2.2 文本切割

可以使用如下代码将文本分割成多个长度为 500 的文本列表

# 将文本按 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。

# 合并音频文件
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 安装后即可使用。

使用也很简单

>>> from playsound import playsound
>>> playsound('/path/to/a/sound/file/you/want/to/play.mp3')

说明:音频的播放需要在图形化页面下运行,因为命令行模式下,没有播放声音的出口。

python page2voice.py -u https://so.gushiwen.org/shiwenv_c244fc77f6fb.aspx

运行后,代码就会自动解析网页并进行朗读啦。

至此,网页到音频的转换就结束了,当然程序没有这么完美,比如中英文混合的网页解析和转换的结果就不怎么理想,但是纯中文的新闻页面效果还是不错的。

总结

以上所述是小编给大家介绍的Python网页正文转换语音文件的操作方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python使用装饰器和线程限制函数执行时间的方法
Apr 18 Python
python根据京东商品url获取产品价格
Aug 09 Python
利用python写个下载teahour音频的小脚本
May 08 Python
Python实现连接postgresql数据库的方法分析
Dec 27 Python
Python实现的个人所得税计算器示例
Jun 01 Python
python多进程实现文件下载传输功能
Jul 28 Python
Python对象与引用的介绍
Jan 24 Python
pyqt5中QThread在使用时出现重复emit的实例
Jun 21 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
python自定义函数def的应用详解
Jun 03 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
python实现的人脸识别打卡系统
May 08 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 #Python
Python实现八皇后问题示例代码
Dec 09 #Python
python中的tcp示例详解
Dec 09 #Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 #Python
Python发送邮件测试报告操作实例详解
Dec 08 #Python
Python自动发送邮件的方法实例总结
Dec 08 #Python
Python数据集切分实例
Dec 08 #Python
You might like
PHP正则替换函数preg_replace和preg_replace_callback使用总结
2014/09/22 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
python实现读取命令行参数的方法
2015/05/22 Python
Python解析json文件相关知识学习
2016/03/01 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
pygame实现飞机大战
2020/03/11 Python
PyTorch中的C++扩展实现
2020/04/02 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
Python识别验证码的实现示例
2020/09/30 Python
详解Python中的文件操作
2021/01/14 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
五水共治捐款倡议书
2014/05/14 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers
插件导致ECharts被全量引入的坑示例解析
2022/09/23 Javascript