天气真的是越来越冷啦, 有时候我们想翻看网页新闻, 但是又冷的不想把手拿出来, 移动鼠标翻看. 这时候, 是不是特别想电脑像讲故事一样, 给我们念出来呢? 人生苦短, 我有 python 啊, 试试用 Python 来朗读给你听吧.
网页转换成语音, 步骤无外乎:
网页正文识别, 获取到正文的文本内容;
文本转语音, 通过接口将文本转换成语音文件;
语音文件的发声, 即将语音文件读出;
361.jpg
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 可以直接安装. 接口的使用可以参考接口文档:.
使用示例如下:
- 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)
接口参数:
image.PNG
接口对单次传入的文本进行了限制, 合成文本长度必须小于 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 学习交流群 [ 784758214 ] 内有安装包和学习视频资料免费分享, 好友都会在里面交流, 分享一些学习的方法和需要注意的小细节, 每天也会准时的讲一些项目实战案例. 希望可以帮助你快速了解 Python, 学习 python
来源: http://www.jianshu.com/p/140198c09088