基于百度AI语音合成,使用python编写的语音朗读工具

        最近要考研,要阅读大量的书籍,希望读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	合成后端错误

如果有人回复的话,就再详细写一写具体过程。

你可能感兴趣的:(python,人工智能)