高血压专题网,内容丰富有趣,生活中的好帮手!
高血压专题网 > Python | 教你用 Python 来朗读网页

Python | 教你用 Python 来朗读网页

时间:2023-05-14 03:41:11

相关推荐

Python | 教你用 Python 来朗读网页

是不是有的时候懒得自己看新闻?那么不妨试试用 Python 来朗读给你听吧。

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

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

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

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

1 网页正文识别

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

1.1 readability

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

readability 使用起来也很方便:

importrequestsfromreadabilityimportDocumentresponse=requests.get('/socialgd/10000169/0616/32537640_all.html')doc=Document(response.text)print(doc.title())

但是 readability 提取到的正文内容不是文本,里面仍包含 HTML 标签。

当然也可以结合其他组件再对 HTML 进行处理,如html2text,我们这里就不再延伸,有兴趣的可以自行尝试。

1.2 goose3

Goose 本来是一个用 Java 编写的文章提取器,后来就有了 Python 实现版: goose3 。

使用起来也很方便,同时对中文支持也不错。使用pip install goose3即可安装。

>>>fromgoose3importGoose>>>fromgoose3.textimportStopWordsChinese>>>url='/socialgd/10000169/0616/32537640_all.html'>>>g=Goose({'stopwords_class':StopWordsChinese})>>>article=g.extract(url=url)>>>print(article.cleaned_text[:150])北京时间6月15日23:00(圣彼得堡当地时间18:00),世界杯B组一场比赛在圣彼得堡球场展开角逐,伊朗1比0险胜摩洛哥,伊朗前锋阿兹蒙半场结束前错过单刀机会,鲍哈杜兹第95分钟自摆乌龙。这是伊朗来首度在世界杯决赛圈取胜。本届世界杯,既相继出现替补便进球,贴补梅开二度以及东道主

可以看出网页正文提取效果还不错,基本满足我们的要求,可以使用!

注意: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可以直接安装。接口的使用可以参考接口文档:/docs#/TTS-Online-Python-SDK/top。

使用示例如下:

fromaipimportAipSpeech"""你的APPIDAKSK均可在服务控制台中的应用列表中查看。"""APP_ID='你的AppID'API_KEY='你的ApiKey'SECRET_KEY='你的SecretKey'client=AipSpeech(APP_ID,API_KEY,SECRET_KEY)result=client.synthesis('你好,你在做什么','zh',3,{'vol':5,})#识别正确返回语音二进制错误则返回dict参照下面错误码ifnotisinstance(result,dict):withopen('auido.mp3','wb')asf:f.write(result)

接口参数:

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

2.2 文本切割

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

#将文本按500的长度分割成多个文本text_list=[text[i:i+500]foriinrange(0,len(text),500)]

2.3 语言文件合并

我们使用 pydub 来处理生成的音频文件。使用pip install pydub即可安装。

另外还 Ubuntu 环境需要安装依赖的,使用sudo apt-get install libav-tools安装即可,而在 Windows 环境需要到 /builds/ 下载FFmpeg,并将其配置到环境变量中。

若还有问题,可以参考官网配置:/jiaaro/pydub。

#合并音频文件defmerge_voice(file_list):voice_dict={}song=Nonefori,finenumerate(file_list):ifi==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")returnfile_name

通过百度的接口,我们可以将文字转化成音频文件,下面的问题就是如何播放音频文件。

3 音频文件播放

网上获取到 Python 播放 wav 文件的方式由好几种,包括 pyaudio、pygame、winsound、playsound。不过测试下来,只有 playsound 成功。其他方式有兴趣的可以试下,有问题可以留言交流。

使用pip install playsound安装后即可使用。

使用也很简单:

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

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

pythonpage2voice.py-u"/shiwenv_c244fc77f6fb.aspx"

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

4 总结

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

推荐阅读:

能者多劳,等待上帝的眷顾,若是个坑,我宁愿跳进去再爬上来

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。