墙裂安利!用腾讯云AI语音合成打造自己的第一本有声书

本文介绍了如何利用腾讯云的语音合成服务打造个人有声书制作工具,包括电子书解析、语音合成和脚本可视化等步骤,帮助用户在碎片时间享受阅读乐趣。
摘要由CSDN通过智能技术生成

现代生活中,我们不可避免会遇到很多碎片时间,等公交、倒地铁、排核酸、买早点等等。这些时间累积起来,无疑是一笔很大的个人资源,而想利用这部分时间,听显然是最好的方式。

国内云计算语音合成服务已经非常成熟,基于开源工具整合 TTS PaaS 服务,可以非常方便地打造一款个人定制的有声书制作工具。

好了,需求有了,可行性也没问题,开始搞起!Get hands dirty!

一、分析调研

有声书需求,一句话来讲就是,把电子书制作成有声音音频,并提供下载链接。

先细化下需求,拆解成不同过程,以及看看都需要哪些能力来支持:

  1. 我们根据个人喜好,下载好电子书(商用务必确保已获授权)。由于我之前用 Kindle,手上有大量 mobi 的电子书。
  2. 打开制作工具,上传指定的 mobi 电子书。(调研 Web 交互库)
  3. 制作工具需要先解析 mobi,获取其中的文本内容。(调研 mobi 解析库)
  4. 基于文本内容,调用语音合成服务,获取有声书音频内容。(调研云计算语音合成 PaaS 服务)
  5. 提供有声书音频下载。

经过一番调研,准备使用工具栈如下。

二、代码开发

工具栈到位,开始编码。

第一步:电子书文件解析

解析模块,先引入外部库 mobi,通过 mobi.extract 函数读取电子书文件,解析为 html 格式的文件 tmp_html。

mobi 库使用可以参见文档 mobi - library for unpacking mobi files

import mobi
def load_file(self, file_name):
        logging.info('begin to parse file')
        start_t = time.time()
        tmp_dir, tmp_html = mobi.extract(file_name) # 解析 mobi 文件
        end_t = time.time()
        logging.info('extract {} to {}. cost {}ms'.format(file_name, tmp_html, int((end_t-start_t)*1000)))

        with open(tmp_html, 'r') as fp:
            lines = fp.readlines()
        self.html_content = ''.join(lines) # 读取 html 
        logging.info('load file total {} chars'.format(len(self.html_content)))

        shutil.rmtree(tmp_dir)
        logging.info('clean temp dir {}'.format(tmp_dir))

得到 html 文件后,通过 lxml.etree 将其解析为一棵 DOM 树,然后就可以通过 xpath 这个大杀器,可以得到其中想要的任意内容了。

比如特定属性的元素,特定位置的段落、标题等等,不了解的同学可以看下 XPath教程

from lxml import etree
def parse_html(self):
        logging.info('parse html')
        # pre process
        self.html_content = self.pre_process(self.html_content)
        
        # parse dom
        dom = etree.fromstring(self.html_content)
        plist = dom.xpath('//p/text()')
        audio_texts = []

		# 示例,比如从 1010 段开始,获取后面 10 个段落
        idx_start = 1010
        for p in plist[idx_start:idx_start+10]:
            #logging.info('{}'.format(p))
            audio_texts.append(p)
        
        self.text = ''.join(audio_texts)
        logging.info('content length {}'.format(len(self.text)))

以上就是电子书解析模块,封装在 AudioBookGenerator 类,详见

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值