python把PDF念给你听

举报
irrational 发表于 2022/01/25 00:43:35 2022/01/25
【摘要】 1. 转语音工具 微信读书有一个功能,可以将书里的文字转换为音频,而且声音优化的不错,比传统的机械朗读听起来舒服很多。 记得之前看到过Python有一个工具包,可以将文字转换为语音,支持英文和中文,而...

1. 转语音工具

微信读书有一个功能,可以将书里的文字转换为音频,而且声音优化的不错,比传统的机械朗读听起来舒服很多。

记得之前看到过Python有一个工具包,可以将文字转换为语音,支持英文和中文,而且可以调节语速语调、导出mp3等。

去Github查了下,这个库叫:pyttsx3

image-20220123174016616

简单来说,pyttsx3可以文字转语音,而且是离线工作的,这一点就很实用。

image-20220123174100939

安装比较容易,直接在命令行用pip安装:

pip install pyttsx3

  
 
  • 1

我准备动手试试,将PDF书籍转成音频。
我们任选一本pdf电子书。

2. PDF转文本

既然是把PDF转化成语音,肯定是需要先读取PDF中的文字,再利用pyttsx3转语音。

Python中操作PDF的工具库主要是PyPDF2,但发现编码实在有点繁琐,我就换了另一个库pdfplumber,与PyPDF2语法类似,用起来还算流畅。

pdfplumber可以处理PDF包括文本、表格、格式在内的各种信息,小而强大。

# 读取PDF文档
pdf = pdfplumber.open("价值.pdf")

# 获取页数
print("总页数:",len(pdf.pages))
print("-----------------------------------------")

# 读取第4页
first_page = pdf.pages[3]
print("本页:",first_page.page_number+1)
print("-----------------------------------------")

# 导出第4页文本
text = first_page.extract_text()
print(text)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出:

上面的代码做了几件事情: 「读取PDF文档、读取页数、读取第4页、输出第4页文本」

3. 文本转语音

接下来开始将第4页的文本转化为音频。

import pyttsx3

# 初始化来获取语音引擎
engine = pyttsx3.init()

# 去掉文本中的换行符
text = text.replace('\n','')

# 朗读文本
engine.say(text)
engine.runAndWait()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面代码使用pyttsx3将文本转化为音频,然后朗读出来。我是在jupyter notebook上做实验的,代码执行后,电脑会直接朗读。

也可以将生成的音频保存为mp3格式。

# 保存音频到本地,格式为mp3
engine.save_to_file(text, 'test.mp3')
engine.runAndWait()

  
 
  • 1
  • 2
  • 3

当然你还可以调整声音的类型、速度、大小。

# 调整人声类型
voices = engine.getProperty('voices')  
engine.setProperty('voice', voices[0].id)

# 调整语速,范围一般在0~500之间
rate = engine.getProperty('rate')                         
engine.setProperty('rate', 200)     

# 调整声量,范围在0~1之间
volume = engine.getProperty('volume')                         
engine.setProperty('volume',0.8) 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

整体还是比较流畅的,虽然不如微信读书语音听着那般舒服,但做做小工具还是不错的。

4. 文本转语音

从微信下载下来的语音是 mp3 格式的,想调用百度语音 api,发现不支持 mp3,支持 wav
准备
需要安装 pydub 库,直接pip install pydub就好了。
还需要安装 ffmpeg.exe 文件,然后再配置一下就好了,请看:
ffmpeg.exe 的安装及配置,与常见问题
原理
读取 mp3 音频的波形数据,然后再写入 wav 文件。

from pydub import AudioSegment
import wave

# 读取mp3的波形数据
sound = AudioSegment.from_file("666.mp3", format = 'MP3')

# 将读取的波形数据转化为wav
f = wave.open("777.wav", 'wb')
f.setnchannels(1)   # 频道数
f.setsampwidth(2)   # 量化位数
f.setframerate(16000)   # 取样频率
f.setnframes(len(sound._data))   # 取样点数,波形数据的长度
f.writeframes(sound._data)   # 写入波形数据
f.close()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行效果图
mp3 只有 2k 左右,转化后 31.5k,听着效果跟原音频没有差别,保真度很高!
在这里插入图片描述

文章来源: blog.csdn.net,作者:irrationality,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_54227557/article/details/122654886

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。