Python Web版语音合成实例详解


Posted in Python onJuly 16, 2019

前言

语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速、音调、音量设置,打破传统文字式人机交互的方式,让人机沟通更自然。

应用场景

将游戏场景中的公告、任务或派单信息通过语音播报,让玩家玩游戏或配送员送货的同时,也可接听新任务。

文学小说类软件,可以利用百度语音合成技术将文学小说作品进行高质量的朗读,流畅清晰,解放双眼,畅听世界。

软件架构

Python3.7.2、Django2.1.7、baidu-aip(百度语音API)

案例

这里只展示部分代码,有兴趣的同学可以自行下载源码安装调试。

import os
import time
import codecs
from aip import AipSpeech
from django.shortcuts import render
from django.http import HttpResponse


'''
pip install --upgrade pip
pip install django
pip install baidu-aip
'''


def main(request):
 return render(request, 'index.html')


def m_main(request):
 return render(request, 'm_index.html')


def convert(request):
 message = request.POST.get("message")
 switch = request.POST.get("switch")
 mp3 = du_say(message, switch)
 return HttpResponse(mp3)


def du_say(message, switch):
 write_txt(message)
 app_id = '*****'
 api_key = '*****'
 secret_key = '*****'
 client = AipSpeech(app_id, api_key, secret_key)
 if switch == "true":
  switch = 3
 else:
  switch = 4
 result = client.synthesis(message, 'zh', 1, {
  'vol': 5, 'per': switch,
 })
 t = time.time()
 now_time = lambda: int(round(t * 1000))
 path = os.getcwd() + os.path.sep + "static" + os.path.sep + "audio"+os.path.sep
 audio = path+str(now_time())+'.mp3'
 # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
 if not isinstance(result, dict):
  with open(audio, 'wb') as f:
   f.write(result)
 return str(now_time())+'.mp3'


def write_txt(message):
 t = time.time()
 now_time = lambda: int(round(t * 1000))
 path = os.getcwd() + os.path.sep + "static" + os.path.sep + "text"+os.path.sep
 text = path+str(now_time())+'.txt'
 with codecs.open(text, 'a', encoding='utf8')as f:
  f.write(message)

本地部署

从码云拉取项目到本地:

https://gitee.com/52itstyle/baidu-speech.git

配置百度语音API:

# 自行注册申请
https://console.bce.baidu.com/ai/#/ai/speech/app/list

启动项目:

# 切换到项目根目录,执行
manage.py runserver

Python Web版语音合成实例详解 

外网部署

这里以Linux为例,代理使用 openresty。

安装 Python3

wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz

事先安装依赖,否则后期安装会报错:

yum -y install zlib*
yum -y install libffi-devel

下面开始正式安装:

# 解压
tar -xvf Python-3.7.1.tar.xz
# 切换大目录
cd Python-3.7.1
# 配置编译
./configure
# 编译安装
make && make install

安装 Django

pip install Django

安装成功以后需要重新配置并编译安装 Python3:

# 配置编译
./configure
# 编译安装
make && make install

安装服务器 uwsgi

pip3 install uwsgi

上传项目到服务器,并切换到 speech 目录:

# 目录下新建文件夹
mkdir script

在 script 下新增 uwsgi.ini (项目中已经配置好,自行修改路径即可):

# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/www/speech/
# 指定项目的application
module=speech.wsgi:application
# 指定sock的文件路径  
socket=/www/speech/script/uwsgi.sock
# 进程个数  
workers=5
pidfile=/www/speech/script/uwsgi.pid
# 指定IP端口  
http=127.0.0.1:8001
# 指定静态文件
static-map=/static=/www/speech/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/www/speech/script/uwsgi.log

然后使用以下命令启动:

uwsgi --ini uwsgi.ini

执行命令,查看是否启动成功:

[root@AY140216131049Z script]# ps -ef|grep uwsgi 
root  3040  1 0 Nov21 ?  00:00:03 uwsgi --ini uwsgi.ini
root  3041 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  3042 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  3043 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  3044 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  3045 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  3046 3040 0 Nov21 ?  00:00:00 uwsgi --ini uwsgi.ini
root  6606 6580 0 18:13 pts/0 00:00:00 grep --color=auto uwsgi

重启:

uwsgi --reload uwsgi.pid

配置Nginx代理:

server {
  listen 80;
  server_name speech.52itstyle.vip;
  charset utf-8;
  location / {
   include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
   uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
   uwsgi_pass unix:/www/speech/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
  }
  # 动静分离 Nginx 处理静态请求
  location /static {
   root /www/speech/;
  }
 }

如果启动HTTPS:

server {
   listen 80;
   listen 443 ssl;
   server_name speech.52itstyle.vip;
   #ssl on;
   #证书路径
   ssl_certificate /usr/local/openresty/nginx/cert/1901523_speech.52itstyle.vip.pem;
   #私钥路径
   ssl_certificate_key /usr/local/openresty/nginx/cert/1901523_speech.52itstyle.vip.key;
   #缓存有效期
   ssl_session_timeout 5m;
   #可选的加密算法,顺序很重要,越靠前的优先级越高.
   ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
   #安全链接可选的加密协议
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;

  location / {
   include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
   uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
   uwsgi_pass unix:/www/speech/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
  }
  # 动静分离 Nginx 处理静态请求
  location /static {
   root /www/speech/;
  }
 }

演示地址

https://speech.52itstyle.vip/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中list循环语句用法实例
Nov 10 Python
Python全局变量操作详解
Apr 14 Python
使用Python生成随机密码的示例分享
Feb 18 Python
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
三步实现Django Paginator分页的方法
Jun 11 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 Python
Python使用UDP实现720p视频传输的操作
Apr 24 Python
python爬取豆瓣电影TOP250数据
May 23 Python
windows下python虚拟环境virtualenv安装和使用详解
Jul 16 #Python
Pandas中DataFrame的分组/分割/合并的实现
Jul 16 #Python
Python的matplotlib绘图如何修改背景颜色的实现
Jul 16 #Python
python调用其他文件函数或类的示例
Jul 16 #Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 #Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 #Python
python查找重复图片并删除(图片去重)
Jul 16 #Python
You might like
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
php实现评论回复删除功能
2017/05/23 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
javascript学习笔记(五)正则表达式
2011/04/08 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
理解javascript对象继承
2016/04/17 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
python的keyword模块用法实例分析
2015/06/30 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
2019/08/23 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
学校领导班子对照检查材料
2014/08/28 职场文书
2014年教师节讲话稿5篇
2014/09/10 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
质量承诺书格式范文
2015/04/28 职场文书
MySQL触发器的使用
2021/05/24 MySQL
Python图片验证码降噪和8邻域降噪
2021/08/30 Python