最近要考研,要阅读大量的书籍,希望读PDF文档的时候,能滑动一段文字后,电脑能自动读出声,这样就懒得自己读了。
因为电脑上的各种软件太过拉胯,所以自己写了一个在电脑上滑动取词的有声阅读。
如果需要的话,可以自取使用。
三四年没有写python了,语法全都忘完了,渣代码勿怪。
import os
import time
# import pyautogui
import playsound
import pyperclip
import threading
# from pydub import AudioSegment
from aip import AipSpeech
# from ffmpeg import audio
print("""
###############################################################
# 目前已知bug #
# (1)程序目前存在一些bug,比如单独读一个符号,就会崩溃。 #
# (2)以及程序如果没有正常结束(崩溃),程序的目录下会留存 #
# 一些音频文件,如果不将它们清除,下一次程序运行时,就会出 #
# 现错误结果。 #
# (3)如果没能从百度API下载到音频文件时,程序有可能会崩溃 #
# 这点尚不确定。 #
###############################################################""")
print("""
####################################################################
# 程序使用方法 #
# (1)双击运行本程序之后,选择语音播放速度,数值越高速度越快。 #
# (2)运行之后,可以不用理会黑色窗口。最小化即可。此时,将你想 #
# 阅读的文本进行复制,程序即可自动朗读复制内容。 #
# → P.S. 可通过ctrl+c键实现快速复制。 #
# (3)因为本程序是调用百度语音合成API,程序需在联网的环境下运 #
# 行,否则将会出错。 #
####################################################################
""")
# 这里填你从百度AI语音合成那里拿过来的三个参数。
# 至于如何从百度AI语音合成,可以点击下面这个链接
# https://ai.baidu.com/tech/speech/tts
# 或者你也可以百度一下,如何申请百度AI语音合成。
UserAppId = ""
UserLogin = ""
UserPaswd = ""
mlgbd = 0
client = AipSpeech(UserAppId, UserLogin, UserPaswd)
speed_mp3 = int(input("输入语音播放,播放速度1-9:"))
os.system("set path=\"" + os.getcwd() + "\"")
mlgb = 1
class ThreadingPrc(threading.Thread):
def run(self):
global mlgb
while True:
time.sleep(0.01)
if os.path.exists(os.getcwd() + "\\" + str(mlgb) + "audio.mp3"):
playsound.playsound(str(mlgb) + "audio.mp3")
os.remove(os.getcwd() + "\\" + str(mlgb) + "audio.mp3")
mlgb += 1
def run_init_speaker():
global speed_mp3
global mlgbd
set_text = pyperclip.paste()
set_text = set_text.replace("\r", "")
set_text = set_text.replace("\n", "")
set_text = set_text.replace("\t", "")
set_text_u = []
# 将其切片成每份300个字的数组,或者按照句号分割
if set_text.find("。") != -1:
while set_text.find("。") != -1:
set_text_u.append(set_text[0:set_text.find("。") + 1])
set_text = set_text[set_text.find("。") + 1:len(set_text)]
set_text_u.append(set_text[0:len(set_text)])
elif len(set_text) > 300:
while len(set_text) != 0:
set_text_u.append(set_text[0:300])
set_text = set_text[300:len(set_text)]
else:
set_text_u.append(set_text)
# sound = []
for set_next in set_text_u:
mlgbd += 1
# 输入百度API接口
# 将数据获取进来,具体配置信息可在下面查看
if set_next != '':
result = client.synthesis(
text=set_next,
lang="zh",
ctp=1,
options={
'spd': speed_mp3,
'pit': 5,
'vol': 5,
'per': 5003
})
else:
mlgbd -= 1
break
# 将获取的音频文件,写进磁盘里
if not isinstance(result, dict):
with open(str(mlgbd) + 'audio.mp3', 'wb') as f:
f.write(result)
else:
# pyautogui.alert("错误!!!\n" + str(result.items())) # 把错误信息显示出来
print("出错啦!")
print(str(result.items()))
f.close()
# 设置2倍速
# audio.a_speed(str(mlgbd) + "audio.mp3", "1.5", "set" + str(mlgbd) + "audio.mp3")
# os.remove(str(mlgbd) + "audio.mp3")
# os.rename("set" + str(mlgbd) + "audio.mp3", str(mlgbd) + "audio.mp3")
# 将对象添加到列表,方便后续合成一个语音
# sound.append(AudioSegment.from_mp3(str(mlgbd) + "audio.mp3"))
# 初始化一个对象
# sum_sound = sound[0]
# del sound[0]
# 如果还有的话,那么就把列表取到空
# while len(sound) != 0:
# sum_sound += sound[0]
# del sound[0]
# 将合成的文件写入到硬盘中
# sum_sound.export(str(mlgbd) + "saudio.mp3", format="mp3")
# playsound.playsound(str(mlgbd) + "saudio.mp3")
new_thread = ThreadingPrc()
new_thread.start()
# 从剪切板循环判断,是否存在更改的现象,如果存在就调用speaker的功能
paste_string = pyperclip.paste()
while True:
time.sleep(0.05)
if paste_string != pyperclip.paste():
run_init_speaker()
paste_string = pyperclip.paste()
# 参数 类型 描述 是否必须
# tex String 合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节 是
# cuid String 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内 否
# spd String 语速,取值0-9,默认为5中语速 否
# pit String 音调,取值0-9,默认为5中语调 否
# vol String 音量,取值0-15,默认为5中音量 否
# per String 普通发音人选择:度小美=0(默认),度小宇=1,,度逍遥(基础)=3,度丫丫=4 否
# per String 精品发音人选择:度逍遥(精品)=5003,度小鹿=5118,度博文=106,度小童=110,度小萌=111,度米朵=103,度小娇=5 否
# 错误信息
# 错误返回格式
# 若请求错误,服务器将返回的JSON文本包含以下参数:
# error_code:错误码。
# error_msg:错误描述信息,帮助理解和解决发生的错误。
# 错误码
# 错误码 含义 其他
# 500 不支持的输入
# 501 输入参数不正确
# 502 token验证失败 16 "Open api characters limit reached" 字数超限,没有对应的接口额度
# 503 合成后端错误
如果有人回复的话,就再详细写一写具体过程。