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 相关文章推荐
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
python实现折半查找和归并排序算法
Apr 14 Python
python图像常规操作
Nov 11 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
Feb 08 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
Python中的整除和取模实例
Jun 03 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 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
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
php和asp语法上的区别总结
2019/05/12 PHP
短信提示使用 特效
2007/01/19 Javascript
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
VUE JS 使用组件实现双向绑定的示例代码
2017/01/10 Javascript
vue轮播图插件vue-concise-slider的使用
2018/03/13 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
[01:03:09]完美世界DOTA2联赛PWL S2 Forest vs SZ 第二场 11.25
2020/11/26 DOTA
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python实现对excel进行数据剔除操作实例
2017/12/07 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
新年团拜会主持词
2014/04/02 职场文书
2014年党风廉政建设工作总结
2014/11/19 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
Ruby处理CSV数据方法详解
2022/04/18 Ruby