用python给自己做一款小说阅读器过程详解


Posted in Python onJuly 11, 2019

前言

前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命。听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费。一章两毛钱,本来是想要买一下,发现说的进度比较慢而且整本书要1300多张,算了一下,需要200大洋才行,而且等他说完,还不知道要到什么时候去。

所以就找文字版的来读,文字版又有它的缺点,你必须手眼联动才行。如果要忙别的事情,但是又抑制不住想看的冲动,就很纠结了。在网上找了一圈,没有其他的音频。而且以前用的那些有阅读功能的软件,比如微信阅读、追书神器也都开始收费了。

那怎么办呢?这能难倒一个学Python的程序员吗?必须滴、坚决滴不能。我用的可是世界上最好的编程语言-Python,很多伙伴也学了不少Python编程学习教程,不妨这里一起操练一下?

用python给自己做一款小说阅读器过程详解

自己动手丰衣足食,接下来就用我们学过的Python编程学习教程实现自己的小说阅读器吧。

语音合成选择

要想读文字,就必须要用到语音合成。现在这种语音合成的软件有很多,其中讯飞和百度是比较好的两种,我们这里就使用百度语音合成API来实现。

创建语音合成应用

首先注册百度账号,然后登录到百度AI开放平台,创建一个应用

用python给自己做一款小说阅读器过程详解

用python给自己做一款小说阅读器过程详解

填写应用名和描述信息提交

用python给自己做一款小说阅读器过程详解

记住AppID、API Key、Secret Key,在使用API的时候会用到,查看一下技术文档

),使用pip install baidu-aip安装完API,文档内有详细的示例代码,很容易就上手了。里面有各种参数解释,比如音量、语调、语速、发声人等。现在语音合成已经有了,已经有了阅读的前提,下面就是获取小说内容了。

获取小说内容

小说内容的获取我们从笔趣阁网站上获取,一方面免费,另一方面没有反爬,找到网站首页

https://www.biquge.info/40_40289/,使用requests大法就可以了。简单分析一下页面

用python给自己做一款小说阅读器过程详解

所有章节信息都在dd元素下,而且链接也是很有规律的,直接用xpath获取所有章节列表信息。

def get_chapters(self):
 url = "https://www.biquge.info/40_40289/"
 r = self.session.get(url)
 r.encoding = chardet.detect(r.content).get("encoding", "utf-8")
 html = etree.HTML(r.text)
 for item in html.xpath("//dl/dd/a"):
 yield item.attrib["title"], url + item.attrib["href"]

章节内容获取也非常简单,就不分析了

def get_content(self, url):
 r = self.session.get(url)
 r.encoding = chardet.detect(r.content).get("encoding", "utf-8")
 html = etree.HTML(r.text)
 title = html.xpath(r'//*[@class="bookname"]/h1')[0].text
 for info in html.xpath("//div[@id='content']"):
 text = info.xpath("string(.)")

这里有一点要注意的,获取的章节内容中有html元素,xpath为我们提供了string(.),提取多个子节点的文本,非常好用。

合成存储

小说内容获取成功了,与语音合成结合一下,小说阅读器的雏形就有了。简单实现如下:

import chardet
import requests
from lxml import etree
from aip import AipSpeech
class CollectNovels:
 def __init__(self):
 self.session = requests.session()
 self.session.headers["user-agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
 """ 你的 APPID AK SK """
 APP_ID = '16416498'
 API_KEY = 'oEWGafQkaUGqmsmPbfkE5OMx'
 SECRET_KEY = '6jdsUcH0PXz5TYoELU47u58W5vPV9lwf'
 self.client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
 def get_chapters(self, url):
 r = self.session.get(url)
 r.encoding = chardet.detect(r.content).get("encoding", "utf-8")
 html = etree.HTML(r.text)
 for item in html.xpath("//dl/dd/a"):
 yield item.attrib["title"], url + item.attrib["href"]
 def get_content(self, url):
 r = self.session.get(url)
 r.encoding = chardet.detect(r.content).get("encoding", "utf-8")
 html = etree.HTML(r.text)
 for info in html.xpath("//div[@id='content']"):
 text = info.xpath("string(.)")
 for line in text.split("。"):
 content = self.client.synthesis(line, 'zh', 1, {"per": 0})
 with open("auido.mp3", "rb") as fp:
 fp.write(content)
if __name__ == '__main__':
 novel = CollectNovels()
 home_url = "https://www.biquge.info/40_40289/"
 for title, url in novel.get_chapters(home_url):
 novel.get_content(url)

这里是生成了mp3文件,按行生成以后,再使用合成软件合成后,我们就可以放在任意地方去听了。但是这样也有缺陷,必须提前生成,然后才能使用播放器听,这样不是很方便。如果可以边生成边播放是不是更好呢?

播放合成语音

我们可以使用python的pygame库,其他的好几个库都不太好用,有些已经年久失修了,所以就不用了。

import time
import pygame
from io import BytesIO
pygame_mixer = pygame.mixer
pygame_mixer.init(frequency=frequency)
byte_obj = BytesIO()
byte_obj.write(content)
byte_obj.seek(0, 0)
pygame_mixer.music.load(byte_obj)
pygame_mixer.music.play()
while pygame_mixer.music.get_busy():
 time.sleep(0.1)
pygame_mixer.stop()

这里使用BytesIO将语音合成的二进制文件存储在内存中,就不需要再保存成本地mp3了。

有一个需要注意的地方pygame_mixer.init(frequency=frequency),这个frequency参数是音频频率,如果不设置的话默认是22050,播放出来的声音和mp3播放相差太大了,一直以为是这个库有问题,换了好几个,有的是用不了,有的有问题,后来我才发现需要设置这个参数,那么这个参数从哪里来呢?查看之前生成的mp3文件属性

用python给自己做一款小说阅读器过程详解

然后将频率设置为16000就可以了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python处理json数据中的中文
Mar 06 Python
简单谈谈Python中的闭包
Nov 30 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
Python 中pandas索引切片读取数据缺失数据处理问题
Oct 09 Python
YUV转为jpg图像的实现
Dec 09 Python
Python2与Python3的区别详解
Feb 09 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
Python 通过监听端口实现唯一脚本运行方式
May 05 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 #Python
ML神器:sklearn的快速使用及入门
Jul 11 #Python
python 随机森林算法及其优化详解
Jul 11 #Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 #Python
python常用库之NumPy和sklearn入门
Jul 11 #Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 #Python
Python实现K折交叉验证法的方法步骤
Jul 11 #Python
You might like
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
来自qq的javascript面试题
2010/07/24 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
浅析使用Python搭建http服务器
2019/10/27 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
python3 字符串知识点学习笔记
2020/02/08 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
工商学院毕业生自荐信
2013/11/12 职场文书
高级电工工作职责
2013/11/21 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
化工专业自荐书
2014/06/16 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
党小组意见范文
2015/06/08 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
python通配符之glob模块的使用详解
2021/04/24 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS