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下的Mysql模块MySQLdb安装详解
Apr 09 Python
python实现文件分组复制到不同目录的例子
Jun 04 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
python中Genarator函数用法分析
Apr 08 Python
在Python中处理字符串之ljust()方法的使用简介
May 19 Python
python实现下载整个ftp目录的方法
Jan 17 Python
Python学习笔记之函数的定义和作用域实例详解
Aug 13 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
python 检测图片是否有马赛克
Dec 01 Python
python 基于opencv去除图片阴影
Jan 26 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和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
php中stdClass的用法分析
2015/02/27 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
jQuery之日期选择器的深入解析
2013/06/19 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
2017/07/18 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
python快速排序代码实例
2013/11/21 Python
Flask框架的学习指南之用户登录管理
2016/11/20 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
python标记语句块使用方法总结
2019/08/05 Python
python-视频分帧&多帧合成视频实例
2019/12/10 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
美国豪华的多品牌精品店:The Webster
2019/07/31 全球购物
c语言常见笔试题总结
2016/09/05 面试题
《风筝》教学反思
2014/04/10 职场文书
二年级小学生评语
2014/04/21 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
审查起诉阶段律师意见书
2015/05/19 职场文书
学术会议开幕词
2016/03/03 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
Go语言并发编程 sync.Once
2021/10/16 Golang