Python学习案例之Web版语音合成播报
前言
语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速、音调、音量设置,打破传统文字式人机交互的方式,让人机沟通更自然。
应用场景
将游戏场景中的公告、任务或派单信息通过语音播报,让玩家玩游戏或配送员送货的同时,也可接听新任务。
文学小说类软件,可以利用百度语音合成技术将文学小说作品进行高质量的朗读,流畅清晰,解放双眼,畅听世界。
软件架构
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
外网部署
这里以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://gitee.com/52itstyle/baidu-speech
https://blog.52itstyle.vip/archives/3474/
https://blog.52itstyle.vip/archives/3503/
Python学习案例之Web版语音合成播报的更多相关文章
- 参考学习《Python学习手册(第4版)》高清中文PDF+高清英文PDF+源代码
看到第38章了,整体感觉解释详细,例子丰富:关于Python语言本身的讲解全面详尽而又循序渐进不断重复,同时详述语言现象背后的机制和原理:除语言本身,还包含编程实践和设计以及高级主题.边看边写代码.不 ...
- 《Python学习手册 第五版》 -第13章 while循环和for循环
上一章已经讲过if条件语句,这章重点是循环语句:while.for 本章的重点内容 1.while循环 1)一般形式 2)break.continue.pass和循环的else 2.for循环 1)一 ...
- 《Python学习手册 第五版》 -第12章 if测试和语法规则
本章节的内容,主要讲解if语句,if语句是三大复合语句之一(其他两个是while和for),能处理编程中大多数逻辑运算 本章的重点内容如下: 1.if语句的基本形式(多路分支) 2.布尔表达式 3.i ...
- 《Python学习手册 第五版》 -第11章 赋值、表达式和打印
上一章对Python的语句和语法已经进行了基本的说明,接下来就是每个章节的详细说明,本章的主要内容就是标题中涵盖的三点:赋值语句.表达式语句.打印语句 本章重点内容如下: 1.赋值语句 1)赋值语句的 ...
- 《Python学习手册 第五版》 -第10章 Python语句简介
前面在开始讲解数据类型的时候,有说过Python的知识结构,在此重温一下 Python知识结构: 程序由模块组成 模块包含语句 语句包含表达式 表达式创建并处理对象 关于知识结构,前面已经说过我自己的 ...
- 自学笔记系列:《Python学习手册 第五版》 -写在开始之前
今年双十一,在当当网上买了这本书,很厚很厚的一本书,大概有将近1700页左右,的确是一个“大工程”, 关于这本书的学习,我想采用一种博客的方式进行,既是写给自己,也想分享给每一个对Python学习感兴 ...
- 《Python学习手册 第五版》 -第14章 迭代和推导
承接上一章for循环的讲解,迭代和推导,是对for循环的一种深入的探索和扩展 本章重点内容 1.迭代 1)什么是迭代?都有哪些分类 2)常规的使用方法 3)多遍迭代器VS单遍迭代器 2.列表推导 1) ...
- 《Python学习手册 第五版》 -第18章 参数
在函数的定义和调用中,参数是使用最多喝最频繁的,本章内容就是围绕函数的参数进行讲解 本章重点内容如下: 1.参数的传递 1)不可变得参数传递 2)可变得参数传递 2.参数的匹配模式 1)位置次序:从左 ...
- 《Python学习手册 第五版》 -第15章 文档
本章主要介绍Python中的文档,会通过多种方式来说明,如果查看Python自带文档和其他参考的资料 本章重点内容 1.#注释:源文件文档 2.dir函数:以列表显示对象中可用的属性 3.文档字符串 ...
随机推荐
- 基于IPV6数据包的分析(GNS3)
一.实验拓扑 二.路由配置 1.路由R1的详细配置(以R1为例,R2与R3相同) R1(config)#interface fastEthernet 0/1 R1(config-if)#ipv6 ad ...
- QPainterPath 不规则提示框(二)
前一篇讲过不规则提示框,但是提示框的方向是固定的,不能达到随意变换方向的效果,本接讲述可以动态变换方向的提示框 先看效果图 图1 图2 图3 图4 如上图1所示,上一篇文章的代码可以达到类似效果 本 ...
- ASP.NET Core中使用GraphQL - 第一章 Hello World
前言 你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL. GraphQL提供了一种声明式的方式从服务器拉取数据.你可以从GraphQL官网中了解到GraphQL的所有优点.在这一系 ...
- Python爬虫入门教程 42-100 爬取儿歌多多APP数据-手机APP爬虫部分
1. 儿歌多多APP简单分析 今天是手机APP数据爬取的第一篇案例博客,我找到了一个儿歌多多APP,没有加固,没有加壳,没有加密参数,对新手来说,比较友好,咱就拿它练练手,熟悉一下Fiddler和夜神 ...
- Java集合与泛型中的几个陷阱,你掉进了几个?
下面我总结了集合.泛型.数组转集合等一些常见的陷进,认真看完,相信你绝对有所收获. 1.List ,List<?> 与 List<Object> 有区别吗? 说实话,我敢保证很 ...
- 基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(无懈可击)
参考美团文档:https://tech.meituan.com/2017/04/21/mt-leaf.html Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- 简述C#中IO的应用
在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.IO 定义了一系列类.接口. ...
- 简述ADO.NET的连接层
前面曾提到过ADO.NET的连接层允许通过数据提供程序的连接.命令.数据读取器对象与数据库进行交互.当想连接数据库并且使用一个数据读取器对象来读取数据时.需要实现下面的几个步骤 * 创建.配置.打开连 ...