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中模拟enum枚举类型的5种方法分享
Nov 22 Python
自己使用总结Python程序代码片段
Jun 02 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
详解python中list的使用
Mar 15 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 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 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
Jquery读取URL参数小例子
2013/08/30 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
详解vue组件基础
2018/05/04 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
vue.js 解决v-model让select默认选中不生效的问题
2020/07/28 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
2020/08/07 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
理解python多线程(python多线程简明教程)
2014/06/09 Python
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
用python实现面向对像的ASP程序实例
2014/11/10 Python
python制作一个桌面便签软件
2015/08/09 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python检测网络延迟的代码
2018/05/15 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
centos7之Python3.74安装教程
2019/08/15 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
python 实现两个npy档案合并
2020/07/01 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
如何启动时不需输入用户名与密码
2014/05/09 面试题
机械制造专业大学生自我鉴定
2014/09/19 职场文书
劳模先进事迹材料
2014/12/24 职场文书
孔庙导游词
2015/02/04 职场文书
关于做家务的心得体会
2016/01/23 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电