当前位置:   article > 正文

如何用python做一个小工具:文字转语音_python文字转语音界面版exe

python文字转语音界面版exe

如何用python做一个小工具:文字转语音

思路:文字换语言的功能实现需要使用第三方的工具,在百度AI开放平台查找到语音技术的相关文档

这是官方指导的示例代码:

# coding=utf-8

import sys
import json

# 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode

# 替换你的 API_KEY
API_KEY = 'nu9r2plGFi3s1ugayDPSM6Mk'

# 替换你的 SECRET_KEY
SECRET_KEY = 'G62YGnq84eKTqu0mBgvdpmC6gNBzHdai'

# 大姚的订单信息内容文本
TEXT = "三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)"

TTS_URL = 'http://tsn.baidu.com/text2audio'

"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'

"""
    获取token
"""
def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()

    result = json.loads(result_str)

    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
        return result['access_token']
    else:
        print ('please overwrite the correct API_KEY and SECRET_KEY')
        exit()

"""  TOKEN end """

if __name__ == '__main__':

    token = fetch_token()

    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode

    params = {'tok': token, 'tex': tex, 'cuid': "quickstart",
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

    data = urlencode(params)

    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()

        headers = dict((name.lower(), value) for name, value in f.headers.items())

        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True

    save_file = "error.txt" if has_error else u'大姚的订单信息.mp3'

    with open(save_file, 'wb') as of:
        of.write(result_str)

    if has_error:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)

    print("file saved as : " + save_file)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105

代码运行效果如下:

在这里插入图片描述
直接运行保存了文件,没有输入的功能,也没有选择保存的功能。在此基础上,将它进行一个修改:

# 大姚的订单信息内容文本
TEXT = "三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)"
  • 1
  • 2

修改后:

TEXT = input('请输入转换的文本:')
  • 1

这样就实现了文本输入的功能:

在这里插入图片描述

再修改一下保存的选择:

save_file = "error.txt" if has_error else u'大姚的订单信息.mp3'
  • 1

修改一下:

name = input('保存为mp3:')
save_name = name + '.mp3'
save_file = "error.txt" if has_error else save_name
  • 1
  • 2
  • 3

运行一下 :

试听一下:

python/hello.mp3

内容输入和保存名字的功能已经实现,还需要加一个保存的路径,默认保存的路径是py文件的文件夹里面。我们可以输入一个:文件夹路径,以桌面为例。

# 添加一个路径
path = 'C:\Users\airmo\Desktop'

# 在打开将路径加入到打开文件里面
with open(path+'\\'+save_file,'wb') as of:
    of.write(result_str)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行效果如下:

在这里插入图片描述

在桌面也能找到这个文件:

在这里插入图片描述

然而,我们想把这个工具给别人(不会python)用的时候,需要打包成 .exe 文件,在这之前还需要做一个UI界面,便于操作。

Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)

这是用Tkinter做界面的详细介绍。

首先需要一个界面,要有两个输入框,和一个确认按钮:

import tkinter as tk # 导入Tkinter模块

window = tk.Tk() # 创建一个窗口
window.title('文字转语音v1.0') # 窗口的标题
window.geometry('400x150') # 窗口的初始大小

e1 = tk.Entry(window,show = None,font=('微软雅黑', 16)) # 创建一个文本框,收集输入的内容
e1.pack() # 封装在window上
e2 = tk.Entry(window,show = None,font=('微软雅黑', 16)) # 文件名
e2.pack() # 封装在window上
b1 = tk.Button(window,text='确定',font=('微软雅黑', 16),command=main) # 创建一个按钮,执行main函数
b1.pack()

window.mainloop() # 窗口刷新
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

效果就是这样:

在这里插入图片描述

然后将e1的值赋予给TEXT,e2的值赋予给name:

TEXT = str(e1.get())
name = str(e2.get())
  • 1
  • 2

在这里插入图片描述在这里插入图片描述

我们在桌面也能找到转换好的文件:

在这里插入图片描述

试听一下:

python/hello1.mp3

这样还是不完美,我们想实现选择文件保存的路径,可以用filedialog.askdirectory():

from tkinter import filedialog
path = filedialog.askdirectory()
  • 1
  • 2

点击运行:

在这里插入图片描述

点击”确定“:

在这里插入图片描述
在这里插入图片描述

然后去选择保存的文件夹查看:

在这里插入图片描述

我们想快捷到达保存的文件夹,需要用到os模块,前面的路径已经在赋予了path:

import os

save_path = path
os.startfile(save_path)
  • 1
  • 2
  • 3
  • 4

运行后就直接打开保存的文件夹了。

我们想在转换结束后增加一个tip,提示转换完成,就需要用到tk的messagebox:

from tkinter import messagebox
tip = messagebox.askyesno(title='提示',message='转换完成!是否查看文件')
if tip:
    save_path = path
    os.startfile(save_path)
  • 1
  • 2
  • 3
  • 4
  • 5

运行一下 :

在这里插入图片描述
在这里插入图片描述

附上完整代码:

# coding=utf-8

import sys
import os
import json
from tkinter import filedialog,messagebox

# 保证兼容python2以及python3
IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode

import tkinter as tk # 导入Tkinter模块

window = tk.Tk() # 创建一个窗口
window.title('文字转语音v1.0') # 窗口的标题
window.geometry('400x150') # 窗口的初始大小

e1 = tk.Entry(window,show = None,font=('微软雅黑', 16)) # 创建一个文本框,收集输入的内容
e1.pack() # 封装在window上
e2 = tk.Entry(window,show = None,font=('微软雅黑', 16)) # 文件名
e2.pack() # 封装在window上

# 替换你的 API_KEY
API_KEY = 'nu9r2plGFi3s1ugayDPSM6Mk'

# 替换你的 SECRET_KEY
SECRET_KEY = 'G62YGnq84eKTqu0mBgvdpmC6gNBzHdai'

TTS_URL = 'http://tsn.baidu.com/text2audio'

"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'

"""
    获取token
"""
def fetch_token():
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)
    if (IS_PY3):
        post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()
    if (IS_PY3):
        result_str = result_str.decode()

    result = json.loads(result_str)

    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
        return result['access_token']
    else:
        print ('please overwrite the correct API_KEY and SECRET_KEY')
        exit()

"""  TOKEN end """

def main():

    TEXT = str(e1.get())

    token = fetch_token()

    tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencode

    params = {'tok': token, 'tex': tex, 'cuid': "quickstart",
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

    data = urlencode(params)

    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()

        headers = dict((name.lower(), value) for name, value in f.headers.items())

        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True

    name = str(e2.get())
    save_name = name + '.mp3'
    save_file = "error.txt" if has_error else save_name

    # 添加一个路径
    path = filedialog.askdirectory()

    # 在打开将路径加入到打开文件里面
    with open(path+'\\'+save_file,'wb') as of:
        of.write(result_str)

    if has_error:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)

    tip = messagebox.askyesno(title='提示',message='转换完成!是否查看文件')
    if tip:
        save_path = path
        os.startfile(save_path)

b1 = tk.Button(window,text='确定',font=('微软雅黑', 16),command = main) # 创建一个按钮,执行main函数
b1.pack()

window.mainloop() # 窗口刷新
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131

代码和UI都做好了,然后就是封装成**.exe**文件了

python文件封装成*.exe文件(单文件和多文件)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/354985
推荐阅读
相关标签
  

闽ICP备14008679号