百度语音合成官方教程_AI开放平台

百度语音合成官方demo_github.com

简单地写了一个按段落朗读文本的demo:DEMO链接_gitee.com
有时候会请求不到数据,不知道是网络原因还是什么,已添加自动重新请求。

config.ini:

;关于语音合成的相关配置
[default]
api_key = Your api key
secret_key = Your secret key
;发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
;精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美
per = 3
;语速,取值0-15,默认为5中语速
spd = 4
;音调,取值0-15,默认为5中语调
pit = 5
;音量,取值0-9,默认为5中音量
vol = 5
# 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
aue = 3
;下载的文件格式, 可选项:mp3(default), pcm-16k, pcm-8k, wav
format = mp3
cuid = 123456PYTHON
tts_url = http://tsn.baidu.com/text2audio
token_url = http://openapi.baidu.com/oauth/2.0/token
;有此scope表示有tts能力,没有请在网页里勾选
scope = audio_tts_post [追风筝的人.txt]
text_lct = 12

main.py

# coding=utf-8
import os
import json
from configparser import ConfigParser
from playsound import playsound from urllib.request import urlopen
from urllib.request import Request
from urllib.error import URLError
from urllib.error import HTTPError
from urllib.parse import urlencode
from urllib.parse import quote_plus TEXT = "欢迎使用百度语音合成。"
ini_file = "./config.ini"
cfg_name = "default"
book = "D:/总要删的/追风筝的人.txt" def load_config(ini, name):
cfg = ConfigParser()
# 读取文件内容
cfg.read(ini, encoding="gbk")
# cfg.items()返回list,元素为tuple
return dict(cfg.items(name)) class DemoError(Exception):
pass def fetch_token(dft_cfg):
# print("fetch token begin")
params = {'grant_type': 'client_credentials',
'client_id': dft_cfg['api_key'],
'client_secret': dft_cfg['secret_key']}
post_data = urlencode(params)
post_data = post_data.encode('utf-8')
req = Request(dft_cfg['token_url'], post_data)
try:
f = urlopen(req, timeout=5)
result_str = f.read()
except URLError as err:
print('token http response http code : ' + str(err.code))
result_str = err.read()
result_str = result_str.decode() # print(result_str)
result = json.loads(result_str)
# print(result)
if 'access_token' in result.keys() and 'scope' in result.keys():
if not dft_cfg['scope'] in result['scope'].split(' '):
raise DemoError('scope is not correct')
# print('SUCCESS WITH TOKEN: %s ; EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
return result['access_token']
else:
raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response') def update_text(file, book_title, ini):
# 读取配置文件
cfg = ConfigParser()
# 读取文件内容
cfg.read(ini, encoding="gbk")
if cfg.has_option(book_title, "text_lct"):
now_lct = int(cfg.get(book_title, "text_lct"))
else:
cfg.add_section(book_title)
now_lct = 0 if len(file) <= now_lct:
return "已经读到最后一句啦!换本书吧~!"
else:
while not len(file[now_lct].strip()):
now_lct = now_lct + 1
# 更新配置文件
cfg.set(book_title, "text_lct", str(now_lct + 1))
cfg.write(open(ini, "r+"))
return file[now_lct] def request_api(params):
data = urlencode(params)
req = Request(dft_cfg['tts_url'], data.encode('utf-8'))
try:
f = urlopen(req)
result_str = f.read()
headers = dict((name.lower(), value) for name, value in f.headers.items())
has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
except Exception as e:
print('asr http response http code : ' + str(e))
result_str = str(e)
has_error = True
if has_error:
print("tts api error:" + str(result_str, 'utf-8'))
request_api(params)
else:
# Step 3.4: 保存请求的音频结果并输出成temp.mp3,朗读完毕后删除
save_file = "error.txt" if has_error else 'temp.' + dft_cfg['format']
with open(save_file, 'wb') as of:
of.write(result_str)
playsound(save_file)
os.remove(save_file) if __name__ == '__main__':
# Step 1: 载入配置文件
dft_cfg = load_config(ini_file, cfg_name)
# Step 2: 获取Token
token = fetch_token(dft_cfg)
# Step 3: 向API发起请求
# Step 3.1: 初始化请求参数params、书籍标题
params = {'tok': token, 'tex': '', 'per': dft_cfg['per'], 'spd': dft_cfg['spd'], 'pit': dft_cfg['pit'],
'vol': dft_cfg['vol'], 'aue': dft_cfg['aue'], 'cuid': dft_cfg['cuid'],
'lan': 'zh', 'ctp': 1} # lan ctp 固定参数
book_title = (book.split('/'))[-1]
# 打开指定书籍, 并按行读取
with open(book, "r", encoding='utf-8') as f:
file = f.readlines()
# Step 3.2: 不断获取文本并朗读请求得到的音频
while 1:
# Step 3.2.1: 根据上次阅读的位置,更新需要合成的文本内容
TEXT = update_text(file, book_title, ini_file)
print(TEXT)
params['tex'] = quote_plus(TEXT) # 此处TEXT需要两次urlencode
# Step 3.2.2: 将参数打包,并向指定URL请求,并朗读
request_api(params)

目前的结果:

【记录】Python3|用百度语音 API 朗读你的小说TXT的更多相关文章

  1. 利用百度语音API进行语音识别。

    由于项目需要,这几天都在试图利用百度语音API进行语音识别.但是识别到的都是“啊,哦”什么的,我就哭了. 这里我只是分享一下这个过程,错误感觉出现在Post语音数据那一块,可能是转换问题吧. API请 ...

  2. 记录开发基于百度地图API实现在地图上绘制轨迹并拾取轨迹对应经纬度的工具说明

    前言: 最近一直在做数据可视化方面的工作,其中平面可视化没什么难度,毕竟已经有很多成熟的可供使用的框架,比如百度的echart.js,highcharts.js等.还有就是3D可视化了,整体来说难度也 ...

  3. python3调取百度地图API输出某地点的经纬度信息

    1. 查看API接口说明 地址:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding 注:callback ...

  4. 调用百度语音AI实现语音的识别和合成

    #coding:utf-8 ## 先去ffmpeg官网下载(https://ffmpeg.zeranoe.com/builds/),好了之后解压缩,配一下环境变量 ## 打开cmd,运行命令,安装如下 ...

  5. [python]百度语音rest api

    百度语音识别提供的api范例只有java, c, php. 如果使用Python, 需要注意: 语音文件长度是指bytes大小 可以通过len(file.read())获得 使用requests.po ...

  6. QT调用百度语音REST API实现语音合成

    QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...

  7. python编程之API入门: (二)python3中使用新浪微博API

    回顾API使用的流程 通过百度地图API的使用,我理解API调用的一般流程为:生成API规定格式的url->通过urllib读取url中数据->对json格式的数据进行解析.下一步,开始研 ...

  8. 依图语音API的C#封装以及调用进行语音转写的处理

    对于语音识别,一般有实时语音识别和语音文件的识别处理等方式,如在会议.培训等场景中,可以对录制的文件进行文字的转录,对于转录文字的成功率来说,如果能够转换90%以上的正确语音内容,肯定能减轻很多相关语 ...

  9. 百度地图API的使用

    ------------------自说自话----------------------------- 好奇怪,习惯性使用有道云笔记记录心得与知识后就很少用博客园来记录了. 但是后来想想,有些东西还是 ...

  10. 利用百度词典API和Volley网络库开发的android词典应用

     关于百度词典API的说明,地址在这里:百度词典API介绍 关于android网络库Volley的介绍说明,地址在这里:Android网络通信库Volley 首先我们看下大体的界面布局!

随机推荐

  1. docker-镜像的作用

    ls /var/lib/docker tree /var/lib/docker overlay2 docker pull ubuntu:8.0 docker images ls /var/lib/do ...

  2. C语言中函数有多个返回值的实现

    在C中,正常情况下,我们只能从函数中返回一个值.但在有些情况下,我们需要从函数中返回多个值,此时使用数组或指针能够很好地完成这样的任务.这里是一个示例,这个程序使用一个整型数组作为参数,并将数组元素的 ...

  3. 论今日,Vue VSCode Snippets 不进行代码提示的问题 或 vetur Request textDocument/documentSymbol failed.

    这他喵的是因为 vetur 这个鬼东西升级了,然后和项目中某些包不匹配了, 降级就好了, 法克尤啊法克尤,我整了一天,大概是坏了吧 灵感来源:https://cxymm.net/article/a84 ...

  4. Typecho实现版权声明的三种方式

    在安装完Typecho之后,第一件事应该就是想着如何去折腾了.对于个人博客而言,不希望自己辛辛苦苦写的文章,被别人转载或无脑采集,还不留原地址,所以就需要在文章的末尾地方放上一个版权声明,来提醒下转载 ...

  5. Springboot 在项目启动时将数据缓存到全局变量

    有写字典数据不会频繁更新,但是会频繁查询,想要减少数据库链接次数,把内容缓存到项目的全局变量中,提高方法查询速度 import javax.annotation.PostConstruct; impo ...

  6. mac环境配置本地nfs服务

    前言 在这篇文章中,讲了在Mac端开启NFS服务,并通过NFS协议让其他设备挂载到你的Mac上. 步骤一:增加配置文件 首先,我们需要编辑NFS的配置文件,以便定义哪些目录可以被远程访问. 打开终端, ...

  7. BUUCTF---rsa_output

    题目 点击查看代码 {21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416 ...

  8. 利用AI增强VS Code TypeScript插件:AnyToTS带来编程新体验

    Any to TS: VSCode 扩展插件 概述 "Any to TS" 是一个强大的 VSCode 扩展插件,旨在将任何对象转换为 TypeScript 类型或接口.该工具基于 ...

  9. Windows Terminal 调整默认终端

    Windows Terminal 打开时默认的是 PowerShell, 如下图: 但是, 我希望默认的是更轻快的 cmd... 打开设置 调整 defaultProfile 为 cmd.exe 配置 ...

  10. IP地址查询服务

    IP地址查询站点 https://ip.cn/ http://ip.qq.com/ http://ip138.com/ https://www.apnic.net/ ... IP计算 ip地址在线计算 ...