【TTS】文本转语音?如何不调用第三方api来实现,使用pyttsx3

@

前言

本次的实现需求有点困难,所以也就记录下来,别到时候都忘了。

在这里插入图片描述
首先先不说正题,有兴趣的可以看一看
1、目标是实现一个可以传一个文本就返回一个语音的接口..

2、开始的时候,以为可以直接在java后台直接集成就好了,结果找了半天,找到最多的还是jacob实现文本转语音,虽然感觉可行,但是我的这个项目原本就是需要部署到liunx系统上的,可这个jacob貌似只能在window系统上可行,在liunx系统上不行,所以不能因小失大啊。...

3、所以就想找一个大公司的语言合成的sdk,看行不行...结果像百度、讯飞、华为、阿里等产品,大部分都是在线接口服务,当我满怀喜悦的心情看到了一个叫java SDK的时候,然后兴冲冲的看文档,然后兴冲冲的仰天长望...,后来就是知道了,这个sdk还是去连接第三方api的,只不过可以集成到java中而已。

4、接下来,我又讯飞的产品中找到了有关离线SDK的信息,只不过还是没得java,只有window、liunx、ios、安卓的一些离线SDK。哎,罢了,罢了,就试一试把,我尝试了liunx系统的SDK,结果还行,只不过得运行shell脚本之类的编译操作(可行)。

5、最后,决定彻底改变思路,不用java方式集成进原先的项目中了,直接新开辟一个python项目得了。然后就找啊,找啊,结果python使用pyttsx3实现文本转语音还是挺简单的。(可行)

6、不过,还是那样,因为好像使用的是window中的语言播报功能,所以无法部署到Liunx服务器上,如果实在要部署的话是需要往服务器上部署好一个叫espeak的语言播报驱动,只不过我暂时不在这里说了,因为我暂时也没搞,不过通过查找到了大量资料,安装espeak 的最锲合的系统是"乌班图"的系统,像centos7之类的就很麻烦!(我就是)

7、为什么说centos7的很麻烦呢,其实跟apt 命令有关,centos7无法使用apt命令,而通过我找到的资料来说espeak 的快捷安装又跟apt有关,如果没有apt的话,像centos7就只能通过手动编译来按照espeak(:因为centos不属于debian系列,所以不能使用,只有乌邦图才能使用。),然后就...所以如果大家有需要可以去尝试,centos7和“乌班图”系统的安装espeak不太一样。

后面应该还会写如何使用centos7来实现语言播报的吧,要不然我就会之前使用window算了。
在这里插入图片描述


安装pyttsx3

为了给你们省事,源都给你们备好了
在这里插入图片描述

pip install pyttsx3 -i http://pypi.douban.com/simple

其实,python下载模块贼简单,他报个啥 啥模块找不到,那找不到就找不到呗,那就install下不就o了
在这里插入图片描述


实现TTS接口

别说了,上代码
在这里插入图片描述

from flask import Flask

import pyttsx3
import time
from flask import Flask, render_template, redirect, jsonify, send_file,request

app = Flask(__name__)


@app.route('/voice')
def Text_To_Speek():
    str =  request.args['str'];
    t = time.time()

    engine = pyttsx3.init()

    # 设置新的语音速率
    engine.setProperty('rate', 200)

    # 设置新的语音音量,音量最小为 0,最大为 1
    engine.setProperty('volume', 1.0)
    # 获取当前语音声音的详细信息
    voices = engine.getProperty('voices')

    print(f'语音声音详细信息:{voices}')
    # # 设置当前语音声音为女性,当前声音不能读中文
    # engine.setProperty('voice', voices[1].id)
    # 设置当前语音声音为男性,当前声音可以读中文
    engine.setProperty('voice', voices[0].id)

    # 语音播报内容
    content = str
    # 输出文件格式
    outFile = f'./static/{t}.mp3'
    print(outFile)

    engine.save_to_file(content, outFile)
    engine.runAndWait()
    engine.stop()

    return send_file(f"./static/{t}.mp3");

@app.route('/')
def hello_world():

    return "hello world";

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug='true')

接口参照以下代码:
参照https://www.cnblogs.com/liumengsong/p/12199017.html


import pyttsx3
# 创建对象
engine = pyttsx3.init()
# 获取当前语音速率
rate = engine.getProperty('rate')
print(f'语音速率:{rate}')
# 设置新的语音速率
engine.setProperty('rate', 200)
# 获取当前语音音量
volume = engine.getProperty('volume')
print(f'语音音量:{volume}')
# 设置新的语音音量,音量最小为 0,最大为 1
engine.setProperty('volume', 1.0)
# 获取当前语音声音的详细信息
voices = engine.getProperty('voices')

print(f'语音声音详细信息:{voices}')
# 设置当前语音声音为女性,当前声音不能读中文
engine.setProperty('voice', voices[1].id)
# 设置当前语音声音为男性,当前声音可以读中文
engine.setProperty('voice', voices[0].id)
# 获取当前语音声音
voice = engine.getProperty('voice')
print(f'语音声音:{voice}')

# 语音播报内容
content = "你好亚"
# 输出文件格式
outFile = './out.mp3'

# # 语音文本
# path = 'test.txt'
# with open(path, encoding='utf-8') as f_name:
#     words = str(f_name.readlines()).replace(r'\n', '')
# 将语音文本说出来
engine.save_to_file(content, outFile)
engine.say(content)
engine.runAndWait()
# 将文字输出为 aiff 格式的文件
engine.stop()

后言

在这里插入图片描述
ok,pyttsx3的使用就结束了,只不过不知道大家有没有发现我的重点嘛~

我这篇博客也只是把我一路的解决方法记录下来的

其实现在这个项目确实是可以跑起来的,只不过后续部署上没什么更好的想法。
一路下来,也翻了很多博客,以后有进展了再写其他的吧。

不过,如果有更厉害的大佬的话,不妨给我指教指教呗.0-0

在这里插入图片描述

posted @ 2020-08-18 10:35  陌陌卡上  阅读(568)  评论(0编辑  收藏  举报