文档目录
- HTTP接口说明
- MRCP接口说明
- SSML使用说明
- MRCP接口说明
- 语音通知接口说明
语音合成
语音识别
云通讯
HTTP接口说明
更新时间:2019-11-26
此接口适用于http协议调用语音合成接口,即TTS-HTTP接口。
1、鉴权-通用请求参数说明
HTTP请求方式:POST
数据编码: UTF-8
请求时,需要将鉴权参数放到请求头中,代码示例如下:
数据编码: UTF-8
请求时,需要将鉴权参数放到请求头中,代码示例如下:
HttpRequest request = HttpRequest.post(url)
.header("accessKeyId", "10931")
.header("signType", "normal")
.header("signature", "f261ff0bf7c3472894c7da70113c552b")
.header("timestamp", "1571037860787");
.header("signType", "normal")
.header("signature", "f261ff0bf7c3472894c7da70113c552b")
.header("timestamp", "1571037860787");
参数 | 是否必填 | 说明 |
---|---|---|
accessKeyId | 是 | 租户id,说明: accessKeyId在能力开放平台首页-企业信息中获得(paas.lingban.cn) |
timestamp | 是 | 时间戳(毫秒) |
signType | 是 | 验证模式:密钥明文(normal)、数字签名(md5),默认为密钥明文 |
signature | 是 |
密钥明文验证模式时,此字段直接传递 accessKeySecret 。
数字签名验证模式时,此字段为签名结果
签名方法: accessKeyId + timestamp + accessKeySecret )。
说明: accessKeySecret 在能力开放平台首页-企业信息中获得 |
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• TTS-HTTP接口为http协议接口,IP白名单为选填。
• 对于http协议的接口,若填写IP白名单,则只允许白名单内IP调用接口;若不填写IP白名单,则对该账号调用接口的IP不进行限制。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• TTS-HTTP接口为http协议接口,IP白名单为选填。
• 对于http协议的接口,若填写IP白名单,则只允许白名单内IP调用接口;若不填写IP白名单,则对该账号调用接口的IP不进行限制。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
1.1 通用响应参数说明
参数 | 说明 |
---|---|
code | 返回码, 1为请求成功,其他均为请求失败 |
msg | 返回说明 |
data | 返回内容 |
1.2 通用接口调用成功示例
{
"code": 1,
"msg": "success",
"data": {}
}
"msg": "success",
"data": {}
1.3 通用接口调用失败示例
{
"code": -1,
"msg": "创建任务失败",
"data": {}
}
"msg": "创建任务失败",
"data": {}
2、接口说明
接口地址:/open/tts/v1/create
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
3、请求参数
注意: 请求参数包括 [通用请求参数] 和下表中的参数
参数 | 类型 | 必填 | 说明 | 示例 |
---|---|---|---|---|
text | String | 是 | 合成文字 | 灵伴即时,与生活对话,与 未来沟通! |
speaker | String | 是 | 说话人编码 | nana |
volume | String | 否 | 音量,值区间0-100 默认50 | 50 |
speed | String | 否 | 音速,值区间0-100 默认50 | 50 |
pitch | String | 否 | 音调,值区间0-100 默认50 | 50 |
inputType | String | 否 | 文本格式,支持格式[text、ssml],默认text | text |
4、请求样例
POST https://paas.lingban.cn/open/tts/v1/create
Content-Type: application/json;charset=UTF-8
accessKeyId: 10931
timestamp: 1571037860787
signType: md5
signature: d4975f17500b0bada784fc87ac5ace1b
{
Content-Type: application/json;charset=UTF-8
accessKeyId: 10931
timestamp: 1571037860787
signType: md5
signature: d4975f17500b0bada784fc87ac5ace1b
{
"text": "灵伴即时,与生活对话,与未来沟通!",
"speaker": "yanyan",
"volume":"50",
"speed":"50",
"pitch":"50",
"inputType":"text"
}
"speaker": "yanyan",
"volume":"50",
"speed":"50",
"pitch":"50",
"inputType":"text"
5、响应结果
响应结果的成功或失败通过HTTP Header的Content-Type字段区分:
成功响应
成功响应
Headers的Content-Type字段内容为application/octet-stream,表示合成成功,合成的语音数据在Body中。
Headers的invokeId字段内容为该次调用产生唯一标识
Body内容为合成音频的二进制数据。
Headers的invokeId字段内容为该次调用产生唯一标识
Body内容为合成音频的二进制数据。
失败响应
Headers没有Content-Type字段,或者Content-Type字段内容为application/json,表示合成失败,错误信息在Body中。
Body内容为错误信息,JSON格式的字符串。如下所示:
{
Body内容为错误信息,JSON格式的字符串。如下所示:
{
"code": "-1",
"msg": "合成失败"
}
"msg": "合成失败"
拒绝合成
请求参数input-type非text或ssml格式,拒绝合成请求。拒绝信息在Body中。
Body内容为拒绝合成信息,JSON格式的字符串。如下所示:
请求参数input-type非text或ssml格式,拒绝合成请求。拒绝信息在Body中。
Body内容为拒绝合成信息,JSON格式的字符串。如下所示:
{
"code": "2001",
"msg": "请求类型非法"
}
"msg": "请求类型非法"
6、说话人音色
• 音色是指语音合成引擎所能识别的音色清单列表,音色代号是在接口中传入的参数值
• 题材分类是指该音色推荐使用的场景
• 题材分类是指该音色推荐使用的场景
音色代号 | 性别 | 名称 | 题材分类 |
---|---|---|---|
linger | 女 | 灵儿 | 童声 |
yaoyao | 男 | 妖妖 | 童声 |
subo | 男 | 苏博 | 新闻 |
mina | 女 | 米娜 | 新闻 |
linghui | 女 | 灵慧 | 新闻 |
lingyin | 女 | 灵隐 | 新闻 |
youlan | 女 | 幽蓝 | 言情小说 |
lingmeng | 女 | 绫梦 | 言情小说 |
shanyu | 男 | 山雨 | 玄幻小说 |
shenghun | 男 | 圣魂 | 玄幻小说 |
hongmang | 男 | 鸿芒 | 玄幻小说 |
yuzhang | 男 | 御彰 | 玄幻小说 |
yizhou | 男 | 易周 | 都市小说 |
chuanqi | 男 | 传奇 | 游戏小说 |
mengjing | 女 | 梦静 | 都市小说 |
jianming | 女 | 剑鸣 | 玄幻小说 |
haohan | 男 | 浩翰 | 都市小说 |
yunsong | 男 | 云颂 | 玄幻小说 |
youran | 女 | 悠然 | 玄幻小说 |
yanyan | 女 | 妍妍 | 客服 |
nana | 女 | 娜娜 | 客服 |
lulu | 女 | 璐璐 | 客服 |
tiantian | 男 | 天天 | 客服 |
ningning | 男 | 宁宁 | 客服 |
xiaoyao | 女 | 逍遥 | 客服 |
wenxi | 男 | 文熙 | 客服 |
shuangshuang | 男 | 双双 | 客服 |
ruirui | 女 | 瑞睿 | 客服 |
nainai | 女 | 奈奈 | 客服 |
qiqi | 女 | 麒麒 | 客服 |
xiaoxiao | 女 | 筱筱 | 客服 |
yurou | 女 | 羽柔 | 客服 |
linglong | 女 | 玲珑 | 客服 |
qiulian | 女 | 秋莲 | 客服 |
luyao | 女 | 露瑶 | 客服 |
lingfeng | 女 | 灵凤 | 客服 |
lingyu | 男 | 凌宇 | 客服 |
bufan | 男 | 步凡 | 客服 |
xintong | 女 | 馨彤 | 客服 |
yiyi | 女 | 伊依 | 客服 |
zhentian | 男 | 振天 | 客服 |
xiaocheng | 女 | 晓诚 | 客服 |
chenchen | 女 | 晨晨 | 客服 |
zhengcheng | 男 | 征程 | 客服 |
siqi | 女 | 思绮 | 客服 |
chenyu | 女 | 晨雨 | 客服 |
zili | 男 | 子黎 | 客服 |
wenhui | 女 | 文慧 | 客服 |
xiaofang | 女 | 小芳 | 客服 |
xiaoai | 女 | 小艾 | 客服 |
7、状态码
状态码 | 说明 |
---|---|
1 | 请求成功 |
-1 | 合成失败 |
1001 | IP不合法 |
1002 | 账户余额不足 |
1003 | 话术不可为空 |
1004 | 说话人不合法 |
1005 | 账户未开通 |
1007 | 验证参数错误 |
2001 | 请求类型非法 |
MRCP接口说明
更新时间:2019-11-28
此接口适用于mrcp协议调用语音合成接口,即TTS-MRCP接口。
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 若须调用TTS-MRCP接口,则IP白名单为必填。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 若须调用TTS-MRCP接口,则IP白名单为必填。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
1、配置freeswitch的mod_unimrcp模块:
安装mod_unimrcp模块
cd /项目源码地址/frerswitch
vim modules.conf
# 取消掉asr_tts/mod_unimrcp的注释
asr_tts/mod_unimrcp
# 安装mod_unimrcp模块
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,添加或者去掉注释mod_unimrcp,让模块启动默认加载
vim /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
vim modules.conf
# 取消掉asr_tts/mod_unimrcp的注释
asr_tts/mod_unimrcp
# 安装mod_unimrcp模块
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,添加或者去掉注释mod_unimrcp,让模块启动默认加载
vim /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
2、设置配置文件与conf文件
在mrcp_profiles目录下新建lingban-tts-mrcp-v2.xml配置文件:
vim /usr/local/freeswitch/conf/mrcp_profiles/lingban-tts-mrcp-v2.xml
然后输入以下内容:
接下来修改unimrcp默认使用的TTS驱动,vim/usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml:default-tts-profile为新创建的lingban-tts:
3、设置拨号计划,拨打软电话
在/usr/local/freeswitch/conf/dialplan/default.xml文件中创建拨号计划:
接下来用我们的软电话注册freeswitch,然后拨打8888即可听到语音合成结果。
4、SPEAK方法说明
4.1 在SPEAK方法中可以指定以下header
4.2 请求类型(Content-Type)
必填
支持以下两种类型:
• text/plain:以纯文本的形式传递待合成文本
• application/ssml+xml:以ssml的形式传递待合成文本
注意:待合成文本的格式必须和Content-Type指定的类型一致
支持以下两种类型:
• text/plain:以纯文本的形式传递待合成文本
• application/ssml+xml:以ssml的形式传递待合成文本
注意:待合成文本的格式必须和Content-Type指定的类型一致
4.3 说话人代码(Voice-Name)
非必填
如果不指定本header,使用默认说话人(该默认值是在部署的配置文件中指定的)
如果指定了错误的说话人代码,服务器会拒绝SPEAK请求,并返回004 error
如果不指定本header,使用默认说话人(该默认值是在部署的配置文件中指定的)
如果指定了错误的说话人代码,服务器会拒绝SPEAK请求,并返回004 error
MRCP/2.0 149 1 409 COMPLETE
Channel-Identifier: b6a0e6d0e0d911e9@speechsynth
Completion-Cause: 004 error
Completion-Reason: Invalid voice name
Channel-Identifier: b6a0e6d0e0d911e9@speechsynth
Completion-Cause: 004 error
Completion-Reason: Invalid voice name
说话人代码详见5.说话人音色
注意:说话人代码区分大小写
注意:说话人代码区分大小写
4.4 音量(Prosody-Volume)
非必填
分为绝对值、相对值和枚举值三类
绝对值的取值范围为0.0~100.0,如果不指定本header,默认音量为绝对值50.0
相对值的取值范围为-50.0~+50.0,相对值指定了在绝对值50.0的基础上的变化量,相对值0.0等效于绝对值50.0
• 枚举值的定义(与绝对值的对应关系)为:
• silent 0.0
• x-soft 15.0
• soft 25.0
• medium 50.0
• loud 75.0
• x-loud 100.0
• default 50.0
如果指定了错误的绝对值或相对值,系统自动将绝对值限制在[0.0, 100]之内
如果指定了错误的枚举值,系统自动采用默认音量
分为绝对值、相对值和枚举值三类
绝对值的取值范围为0.0~100.0,如果不指定本header,默认音量为绝对值50.0
相对值的取值范围为-50.0~+50.0,相对值指定了在绝对值50.0的基础上的变化量,相对值0.0等效于绝对值50.0
• 枚举值的定义(与绝对值的对应关系)为:
• silent 0.0
• x-soft 15.0
• soft 25.0
• medium 50.0
• loud 75.0
• x-loud 100.0
• default 50.0
如果指定了错误的绝对值或相对值,系统自动将绝对值限制在[0.0, 100]之内
如果指定了错误的枚举值,系统自动采用默认音量
4.5 语速(Prosody-Rate)
非必填
分为相对值和枚举值两类
UniMRCP接口中没有定义语速绝对值这种类型
MRCP-TTS服务内部存在绝对值这个概念,相对值和枚举值都是在绝对值的基础上计算的
如果不指定本header,默认语速为绝对值50.0
相对值的取值范围为-50.0~+50.0,相对值指定了在绝对值50.0的基础上的变化量,相对值0.0等效于绝对值50.0
枚举值的定义(与绝对值的对应关系)为:
• x-slow 10.0
• slow 30.0
• medium 50.0
• fast 75.0
• x-fast 100.0
• default 50.0
如果指定了错误的相对值,系统自动将绝对值限制在[0.0, 100]之内
如果指定了错误的枚举值,系统自动采用默认语速
分为相对值和枚举值两类
UniMRCP接口中没有定义语速绝对值这种类型
MRCP-TTS服务内部存在绝对值这个概念,相对值和枚举值都是在绝对值的基础上计算的
如果不指定本header,默认语速为绝对值50.0
相对值的取值范围为-50.0~+50.0,相对值指定了在绝对值50.0的基础上的变化量,相对值0.0等效于绝对值50.0
枚举值的定义(与绝对值的对应关系)为:
• x-slow 10.0
• slow 30.0
• medium 50.0
• fast 75.0
• x-fast 100.0
• default 50.0
如果指定了错误的相对值,系统自动将绝对值限制在[0.0, 100]之内
如果指定了错误的枚举值,系统自动采用默认语速
5、说话人音色
音色代号 | 性别 | 名称 | 题材分类 |
---|---|---|---|
linger | 女 | 灵儿 | 童声 |
yaoyao | 男 | 妖妖 | 童声 |
subo | 男 | 苏博 | 新闻 |
mina | 女 | 米娜 | 新闻 |
linghui | 女 | 灵慧 | 新闻 |
lingyin | 女 | 灵隐 | 新闻 |
youlan | 女 | 幽蓝 | 言情小说 |
lingmeng | 女 | 绫梦 | 言情小说 |
shanyu | 男 | 山雨 | 玄幻小说 |
shenghun | 男 | 圣魂 | 玄幻小说 |
hongmang | 男 | 鸿芒 | 玄幻小说 |
yuzhang | 男 | 御彰 | 玄幻小说 |
yizhou | 男 | 易周 | 都市小说 |
chuanqi | 男 | 传奇 | 游戏小说 |
mengjing | 女 | 梦静 | 都市小说 |
jianming | 女 | 剑鸣 | 玄幻小说 |
haohan | 男 | 浩翰 | 都市小说 |
yunsong | 男 | 云颂 | 玄幻小说 |
youran | 女 | 悠然 | 玄幻小说 |
yanyan | 女 | 妍妍 | 客服 |
nana | 女 | 娜娜 | 客服 |
lulu | 女 | 璐璐 | 客服 |
tiantian | 男 | 天天 | 客服 |
ningning | 男 | 宁宁 | 客服 |
xiaoyao | 女 | 逍遥 | 客服 |
wenxi | 男 | 文熙 | 客服 |
shuangshuang | 男 | 双双 | 客服 |
ruirui | 女 | 瑞睿 | 客服 |
nainai | 女 | 奈奈 | 客服 |
qiqi | 女 | 麒麒 | 客服 |
xiaoxiao | 女 | 筱筱 | 客服 |
yurou | 女 | 羽柔 | 客服 |
linglong | 女 | 玲珑 | 客服 |
qiulian | 女 | 秋莲 | 客服 |
luyao | 女 | 露瑶 | 客服 |
lingfeng | 女 | 灵凤 | 客服 |
lingyu | 男 | 凌宇 | 客服 |
bufan | 男 | 步凡 | 客服 |
xintong | 女 | 馨彤 | 客服 |
yiyi | 女 | 伊依 | 客服 |
zhentian | 男 | 振天 | 客服 |
xiaocheng | 女 | 晓诚 | 客服 |
chenchen | 女 | 晨晨 | 客服 |
zhengcheng | 男 | 征程 | 客服 |
siqi | 女 | 思绮 | 客服 |
chenyu | 女 | 晨雨 | 客服 |
zili | 男 | 子黎 | 客服 |
wenhui | 女 | 文慧 | 客服 |
xiaofang | 女 | 小芳 | 客服 |
xiaoai | 女 | 小艾 | 客服 |
SSML使用说明
更新时间:2020-12-21
1、简介
SSML(Speech Synthesis Markup Language)是一种基于XML的语音合成标记语言。
用户可以利用SSML精确控制数字符号的读法、词汇的发音、韵律的停顿等特征。
本系统基于W3C SSML v1.1实现,支持SSML v1.1中的一部分常用的标签类型。
2、使用说明
3、标签说明
3.1 概述
3.2 标签嵌套关系
标签嵌套基于以下规则:
是根节点,其他标签全部在此标签内部; 内部可以包含纯文本,以及被其他标签修饰的文本; 、 、 和 都是可选标签; 内部可以包含 和 ; 和 不强制要求在 内部,可以单独使用; 和 不可以互相嵌套; 和 内部不能包含任何标签; 不可出现在 、 和 内部。
1. 说明:
2. 语法:
3. 属性:
字段名称:version
字段功能:指定SSML的版本
是否必填:是
字段说明:字段的值必须为"1.1"
字段功能:指定SSML的版本
是否必填:是
字段说明:字段的值必须为"1.1"
1. 说明:
2. 语法:
3. 属性:
无
4. 示例:
1. 说明:
2. 语法:
3. 属性:
字段名称:interpret-as
字段功能:指定读法的类型
是否必填:是
字段功能:指定读法的类型
是否必填:是
4. 读法类型:
数值类
读法类型:数读
读法代码:num
说明:按数值方式朗读的整数或小数
示例:
读法代码:num_liang
说明:按数值方式朗读的整数或小数,其中“2”读作“两”,用于后接量词的情况
示例:
读法代码:num
说明:按数值方式朗读的整数或小数
示例:
123(一百二十三)
123.33(一百二十三点三三)
读法类型:数读(两)123.33(一百二十三点三三)
读法代码:num_liang
说明:按数值方式朗读的整数或小数,其中“2”读作“两”,用于后接量词的情况
示例:
2(两)
123(一百二十三)
123.33(一百二十三点三三)
123(一百二十三)
123.33(一百二十三点三三)
编码类
读法类型:码读
读法代码:code
说明:按编码方式朗读的数字和英文字母的组合
示例:
读法代码:code_yao
说明:按编码方式朗读的数字和英文字母的组合,其中“1”读作“幺”
示例:
读法代码:code
说明:按编码方式朗读的数字和英文字母的组合
示例:
123X(一二三X)
ISO9001(ISO九零零一)
读法类型:码读(幺)ISO9001(ISO九零零一)
读法代码:code_yao
说明:按编码方式朗读的数字和英文字母的组合,其中“1”读作“幺”
示例:
123X(幺二三X)
ISO9001(ISO九零零幺)
ISO9001(ISO九零零幺)
时间类
读法类型:日期
读法代码:date
说明:支持由“-”或“/”分隔的年月日,年要求用4位数字表示,月日要求用2位数字表示
示例:
读法代码:date_ym
说明:支持由“-”或“/”分隔的年月,年要求用4位或2位数字表示,月要求用2位或1位数字表示
示例:
读法代码:time
说明:支持由“:”分隔的时间,时分秒都要求用2位数字表示
示例:
读法代码:date
说明:支持由“-”或“/”分隔的年月日,年要求用4位数字表示,月日要求用2位数字表示
示例:
2001-01-01(二零零一年一月一日)
2001/01/01(二零零一年一月一日)
读法类型:日期(年月)2001/01/01(二零零一年一月一日)
读法代码:date_ym
说明:支持由“-”或“/”分隔的年月,年要求用4位或2位数字表示,月要求用2位或1位数字表示
示例:
2001-01(二零零一年一月)
2001/01(二零零一年一月)
2001-1(二零零一年一月)
2001/1(二零零一年一月)
20-01(二零年一月)
20/01(二零年一月)
20-1(二零年一月)
20/1(二零年一月)
读法类型:时间2001/01(二零零一年一月)
2001-1(二零零一年一月)
2001/1(二零零一年一月)
20-01(二零年一月)
20/01(二零年一月)
20-1(二零年一月)
20/1(二零年一月)
读法代码:time
说明:支持由“:”分隔的时间,时分秒都要求用2位数字表示
示例:
21:01:30(二十一点零一分三十秒)
21:01(二十一点零一分)
21:01(二十一点零一分)
其他类
读法类型:汉语人名
读法代码:name
说明:汉语人名或姓氏,其中姓氏采用作为姓氏时的常见读音,名字中的多音字采用高频读音
示例:
读法代码:tel
说明:支持常见电话号码格式
示例:
读法代码:address
说明:支持常见地址格式
示例:
读法代码:plate
说明:支持国内车牌,停顿规则为2-2-3或2-3-3
示例:
读法代码:flight_number
说明:支持国内外航班号,停顿规则为2-3或2-4
示例:
读法代码:name
说明:汉语人名或姓氏,其中姓氏采用作为姓氏时的常见读音,名字中的多音字采用高频读音
示例:
单田芳(shan4 tian2 fang1)
查(zha1)
读法类型:电话号码查(zha1)
读法代码:tel
说明:支持常见电话号码格式
示例:
13812345678(幺三八,幺二三四,五六七八)
010-6606100(零幺零,六六零,六幺零零)
010-66061001(零幺零,六六零六,幺零零幺)
(010)6606100(零幺零,六六零,六幺零零)
(010)66061001(零幺零,六六零六,幺零零幺)
95588(九五五八八)
4008801234(四零零,八八零,幺二三四)
读法类型:地址010-6606100(零幺零,六六零,六幺零零)
010-66061001(零幺零,六六零六,幺零零幺)
(010)6606100(零幺零,六六零,六幺零零)
(010)66061001(零幺零,六六零六,幺零零幺)
95588(九五五八八)
4008801234(四零零,八八零,幺二三四)
读法代码:address
说明:支持常见地址格式
示例:
通州区孙各庄303#(北京市通州区孙各庄三百零三号)
通州区孙各庄3-2-1(北京市通州区孙各庄三杠二杠幺)
读法类型:车牌通州区孙各庄3-2-1(北京市通州区孙各庄三杠二杠幺)
读法代码:plate
说明:支持国内车牌,停顿规则为2-2-3或2-3-3
示例:
京A12345(京A,幺二,三四五)
京A12345E(京A,幺二三,四五E)
读法类型:航班号京A12345E(京A,幺二三,四五E)
读法代码:flight_number
说明:支持国内外航班号,停顿规则为2-3或2-4
示例:
CA901(CA,九零幺)
MU5173(MU,五幺七三)
MU5173(MU,五幺七三)
5. 示例:
略
1. 说明:
2. 语法:
3. 属性:
字段名称:ph
字段功能:指定待合成文本的拼音
是否必填:是
特殊说明:
拼音由发音和声调组成,拼音之间由空格隔开,如pin1 yin1;
声调包括1~4声,5代表轻声;
女的拼音是nv3,铝的拼音是lv3,虐的拼音是nve4;
拼音的数量和待合成文本中的字数必须相同;
标签内部最多包含20个汉字。
字段功能:指定待合成文本的拼音
是否必填:是
特殊说明:
拼音由发音和声调组成,拼音之间由空格隔开,如pin1 yin1;
声调包括1~4声,5代表轻声;
女的拼音是nv3,铝的拼音是lv3,虐的拼音是nve4;
拼音的数量和待合成文本中的字数必须相同;
4. 示例:
略
1. 说明:
2. 语法:
3. 属性:
字段名称:time
字段功能:指定停顿的时长,取值范围为25ms~5000ms
是否必填:是
特殊说明:
此功能主要面向语音流中的短时间的停顿,建议停顿时长保持在300ms以内。
字段功能:指定停顿的时长,取值范围为25ms~5000ms
是否必填:是
特殊说明:
此功能主要面向语音流中的短时间的停顿,建议停顿时长保持在300ms以内。
4. 示例:
MRCP接口说明
更新时间:2019-11-26
此文档适用于使用freeswitch v1.8.7作为mrcp客户端,调用灵伴mrcp服务端的asr接口,完成语音识别。
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 若须调用ASR-MRCP接口,则IP白名单为必填。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 若须调用ASR-MRCP接口,则IP白名单为必填。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
1、配置freeswitch中的mod_unimrcp模块:
安装mod_unimrcp模块
cd /项目源码地址/freeswitch
vim modules.conf
# 取消掉asr_tts/mod_unimrcp的注释
asr_tts/mod_unimrcp
# 安装mod_unimrcp模块
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,添加或者去掉注释mod_unimrcp,让模块启动默认加载
vim /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
vim modules.conf
# 取消掉asr_tts/mod_unimrcp的注释
asr_tts/mod_unimrcp
# 安装mod_unimrcp模块
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,添加或者去掉注释mod_unimrcp,让模块启动默认加载
vim /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
2、设置profile文件与conf文件
在mrcp_profiles目录下新建lingban-asr-Normal-mrcp-v2.xml配置文件:
vim /usr/local/freeswitch/conf/mrcp_profiles/lingban-asr-Normal-mrcp-v2.xml
然后输入以下内容:
接下来修改unimrcp默认使用的ASR驱动,vim/usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml:default-asr-profile为新创建的lingban-asr:
3、使用lua脚本集成灵伴ASR-MRCP接口
在/usr/local/freeswitch/scripts目录下新增lingban.lua脚本:
local asr_model_id = argv[1]; --获取语音检测模型名
local _loopcnt = 0;
if (asr_model_id == nil) then
asr_model_id = "Normal"
end
local calld_id = session:getVariable("uuid");
local action = 0;
local _loopcnt = 0;
session:answer()
session:sleep(200);
function onInput(s, type, obj)
freeswitch.consoleLog("INFO","Enter Lua-script-name: " ..getFileName(debug.getinfo(1).short_src).. "\n") --- 输出语音检测结果
session:setVariable("fire_asr_events", "true");
-- Register the input callback
session:setInputCallback("onInput");
session:execute("detect_speech", "unimrcp:".."lingban-asr-"..asr_model_id.." {recognition-timeout=60000,Sensitivity-Level=0.85,Start-Input-Timers=true,no-input-timeout=10000,call-id=" .. calld_id:gsub("%-", "") .."}" .. "normal" .. " " .. asr_model_id);
while (session:ready() == true) do
session:execute("detect_speech", "stop"); --释放资源
session:hangup()
local _loopcnt = 0;
if (asr_model_id == nil) then
asr_model_id = "Normal"
end
local calld_id = session:getVariable("uuid");
local action = 0;
local _loopcnt = 0;
session:answer()
session:sleep(200);
function onInput(s, type, obj)
freeswitch.consoleLog("info", "Get callback with type: " .. type .. "\n");
if (type == "event") then
endif (type == "event") then
local event = obj:getHeader("Speech-Type");
freeswitch.consoleLog("info", "Get event: " .. event .. "\n");
if (event == "begin-speaking") then
if (event == "detected-speech") then
endfreeswitch.consoleLog("info", "Get event: " .. event .. "\n");
if (event == "begin-speaking") then
freeswitch.consoleLog("info", "Get begin-speaking-obj: " .. obj:serialize() .. "\n");
endif (event == "detected-speech") then
freeswitch.consoleLog("info", "Get detected-speech-obj: " .. obj:serialize() .. "\n");
ret = obj:getHeader("ASR-Completion-Cause");
if(ret ~= nill and (ret == "0" or ret == "2" or ret == "3")) then
if (obj:getBody()) then
endret = obj:getHeader("ASR-Completion-Cause");
if(ret ~= nill and (ret == "0" or ret == "2" or ret == "3")) then
action = 1;
endif (obj:getBody()) then
asr_res = obj:getBody()
freeswitch.consoleLog("INFO","Get result: \n" .. asr_res .. "\n") --- 输出语音检测结果
if (string.find(asr_res, "00") ~= nil or string.find(asr_res, "001") ~= nil) then
endfreeswitch.consoleLog("INFO","Get result: \n" .. asr_res .. "\n") --- 输出语音检测结果
if (string.find(asr_res, "00") ~= nil or string.find(asr_res, "001") ~= nil) then
action = 1
endfreeswitch.consoleLog("INFO","Enter Lua-script-name: " ..getFileName(debug.getinfo(1).short_src).. "\n") --- 输出语音检测结果
session:setVariable("fire_asr_events", "true");
-- Register the input callback
session:setInputCallback("onInput");
session:execute("detect_speech", "unimrcp:".."lingban-asr-"..asr_model_id.." {recognition-timeout=60000,Sensitivity-Level=0.85,Start-Input-Timers=true,no-input-timeout=10000,call-id=" .. calld_id:gsub("%-", "") .."}" .. "normal" .. " " .. asr_model_id);
while (session:ready() == true) do
_loopcnt = _loopcnt + 1;
if (_loopcnt > 300) then -- about 1 minute;
if (action == 1) then
session:execute("detect_speech", "unimrcp:".."lingban-asr-"..asr_model_id.." {recognition-timeout=60000,Sensitivity-Level=0.85,Start-Input-Timers=true,no-input-timeout=10000,call-id=" .. calld_id:gsub("%-", "") .."}" .. "normal" .. " " .. asr_model_id);
end
action = 0
session:sleep(200)
endif (_loopcnt > 300) then -- about 1 minute;
freeswitch.consoleLog("ERR", "session:"..calld_id.. " spend too long time!")
break;
endbreak;
if (action == 1) then
session:execute("detect_speech", "unimrcp:".."lingban-asr-"..asr_model_id.." {recognition-timeout=60000,Sensitivity-Level=0.85,Start-Input-Timers=true,no-input-timeout=10000,call-id=" .. calld_id:gsub("%-", "") .."}" .. "normal" .. " " .. asr_model_id);
end
action = 0
session:sleep(200)
session:execute("detect_speech", "stop"); --释放资源
session:hangup()
在/usr/local/freeswitch/grammar目录新增normal.gram语法文件,可以为空语法文件须满足语音识别语法规范1.0标准(简称SRGS1.0),该语法文件ASR引擎在进行识别时可以使用。
4、使用python脚本监听DETECTED_SPEECH事件并打印
apt-get install python-dev swig
pip install python-ESL
vim events.py
#!/usr/bin/env python
events.py - subscribe to DETECTED_SPEECH events and print them to stdout
import ESL
import logging
logging.basicConfig(filename='esl.log',level=logging.DEBUG)
#/usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml中配置的listen-ip、listen-port、password
con = ESL.ESLconnection('localhost', '8021', 'ClueCon')
if con.connected():
pip install python-ESL
vim events.py
#!/usr/bin/env python
events.py - subscribe to DETECTED_SPEECH events and print them to stdout
import ESL
import logging
logging.basicConfig(filename='esl.log',level=logging.DEBUG)
#/usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml中配置的listen-ip、listen-port、password
con = ESL.ESLconnection('localhost', '8021', 'ClueCon')
if con.connected():
con.events('plain', 'DETECTED_SPEECH')
while 1:
while 1:
e = con.recvEvent()
if e:
print e.serialize()
logging.info(e.serialize())
logging.info(e.serialize())
5、拨打软电话
在/usr/local/freeswitch/conf/dialplan/default.xml文件中创建拨号计划:
6、拨打外网交流
拨打远程,需要转码和忽略前期声音 originate {ignore_early_media=true,absolute_codec_string=PCMA}sofia/gateway/sip线路/电话 &lua(lingban.lua)
语音通知接口说明
更新时间:2019-11-26
此接口用于创建语音通知请求。
1、鉴权-通用请求参数说明
HTTP请求方式:POST
数据编码: UTF-8
请求时,需要将鉴权参数放到请求头中,代码示例如下:
数据编码: UTF-8
请求时,需要将鉴权参数放到请求头中,代码示例如下:
HttpRequest request = HttpRequest.post(url)
.header("accessKeyId", "10931")
.header("signType", "normal")
.header("signature", "f261ff0bf7c3472894c7da70113c552b")
.header("timestamp", "1571037860787");
.header("signType", "normal")
.header("signature", "f261ff0bf7c3472894c7da70113c552b")
.header("timestamp", "1571037860787");
参数 | 是否必填 | 说明 |
---|---|---|
accessKeyId | 是 | 租户id,说明: accessKeyId在能力开放平台首页-企业信息中获得(paas.lingban.cn) |
timestamp | 是 | 时间戳(毫秒) |
signType | 是 | 验证模式:密钥明文(normal)、数字签名(md5),默认为密钥明文 |
signature | 是 |
密钥明文验证模式时,此字段直接传递 accessKeySecret 。
数字签名验证模式时,此字段为签名结果
签名方法: accessKeyId + timestamp + accessKeySecret )。
说明: accessKeySecret 在能力开放平台首页-企业信息中获得 |
IP白名单说明:
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 语音通知接口为http协议接口,IP白名单为选填。
• 对于http协议的接口,若填写IP白名单,则只允许白名单内IP调用接口;若不填写IP白名单,则对该账号调用接口的IP不进行限制。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
• IP白名单为全局白名单,填写后,能力开放平台内所有接口的调用,都需要从白名单中的IP进行发起。
• 语音通知接口为http协议接口,IP白名单为选填。
• 对于http协议的接口,若填写IP白名单,则只允许白名单内IP调用接口;若不填写IP白名单,则对该账号调用接口的IP不进行限制。
• IP白名单的添加、编辑在能力开放平台首页-企业信息中进行(paas.lingban.cn)。
1.1 通用响应参数说明
参数 | 说明 |
---|---|
code | 返回码, 1为请求成功,其他均为请求失败 |
msg | 返回说明 |
data | 返回内容 |
1.2 通用接口调用成功示例
{
"code": 1,
"msg": "success",
"data": {}
}
"msg": "success",
"data": {}
1.3 通用接口调用失败示例
{
"code": -1,
"msg": "创建任务失败",
"data": {}
}
"msg": "创建任务失败",
"data": {}
2、接口说明
接口地址:/open/v1/voice
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
3、请求参数
注意: 请求参数包括 [通用请求参数] 和下表中的参数
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
phone | String | 是 | 手机号 |
templateId | String | 是 | 模版ID |
speaker | String | 否 | 说话人音色编码 |
waitingTime | Integer | 否 | 等待时长,最长60秒 |
params | 集合 | 否 | 模版参数 |
params.name | String | 否 | 参数名称 |
params.value | String | 否 | 参数值 |
4、请求样例
POST https://paas.lingban.cn/open/v1/voice
Content-Type: application/json;charset=UTF-8
accessKeyId: 10931
timestamp: 1571037860787
signType: md5
signature: d4975f17500b0bada784fc87ac5ace1b
{
accessKeyId: 10931
timestamp: 1571037860787
signType: md5
signature: d4975f17500b0bada784fc87ac5ace1b
{
"phone": "153xxxxxx",
"templateId": 1,
"speaker": "yanyan",
"waitingTime": 30,
"params": [
{
{
]
}
"templateId": 1,
"speaker": "yanyan",
"waitingTime": 30,
"params": [
{
"name":"phone",
"value":"153xxxxxx"
},"value":"153xxxxxx"
{
"name":"name",
"value":"张三"
}"value":"张三"
]
5、响应参数
参数 | 类型 | 说明 |
---|---|---|
invokeId | String | 调用唯一标识 |
6、响应样例
{
"code": "1",
"msg": "请求成功",
"data": {
}
"msg": "请求成功",
"data": {
"invokeId": "966820c2-c26f-4036-b94e-c8062324ed92"
}
7、语音通知回调
7.1 接口说明
接口地址:语音通知接口调用方提供语音通知回调地址
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
HTTP请求方式:POST
POST请求参数格式:application/json;charset=UTF-8
7.2 请求参数
注意: 请求参数包括 [通用请求参数] 和下表中的参数
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
invokeId | String | 是 | 调用唯一标识 |
caller | String | 是 | 主叫号 |
callee | String | 是 | 被叫号 |
startCallTime | Long | 是 | 呼叫开始时间 |
startRingTime | Long | 是 | 振铃时间 |
calleeAcceptTime | Long | 是 | 接通时间 |
endCallTime | Long | 是 | 挂断时间 |
cause | Integer | 是 | 通话结束原因编码 |
callEndReason | String | 是 | 通话结束原因 |
duration | Integer | 是 | 通话时长 |
recordPath | String | 否 | 录音文件地址 |
7.3 请求样例
POST http://xxx/callback
Content-Type: application/json;charset=UTF-8
{
Content-Type: application/json;charset=UTF-8
{
"accessKeyId":"1001",
"callEndReason":"正常结束",
"callee":"13051350397",
"calleeAcceptTime":1563437680,
"caller":"95114",
"cause":0,
"duration":100,
"endCallTime":1563437780,
"invokeId":"b740047e-672d-41c8-a036-dc6c8731a313",
"recordPath":"",
"signType":"normal",
"signature":"pHryChFOPBEYYjGqjgZExkHAkXluQE",
"startCallTime":1563437480,
"startRingTime":1563437580,
"timestamp":1570702061083
}
"callEndReason":"正常结束",
"callee":"13051350397",
"calleeAcceptTime":1563437680,
"caller":"95114",
"cause":0,
"duration":100,
"endCallTime":1563437780,
"invokeId":"b740047e-672d-41c8-a036-dc6c8731a313",
"recordPath":"",
"signType":"normal",
"signature":"pHryChFOPBEYYjGqjgZExkHAkXluQE",
"startCallTime":1563437480,
"startRingTime":1563437580,
"timestamp":1570702061083
7.4 响应样例
{
"code": "1",
"msg": "请求成功",
"data": null
}
"msg": "请求成功",
"data": null
8、说话人音色
• 音色是指语音合成引擎所能识别的音色清单列表,音色代号是在接口中传入的参数值
• 题材分类是指该音色推荐使用的场景
• 题材分类是指该音色推荐使用的场景
音色代号 | 性别 | 名称 | 题材分类 |
---|---|---|---|
yanyan | 女 | 妍妍 | 客服 |
nana | 女 | 娜娜 | 客服 |
lulu | 女 | 璐璐 | 客服 |
tiantian | 男 | 天天 | 客服 |
9、状态码
状态码 | 说明 |
---|---|
1 | 请求成功 |
-1 | 合成失败 |
1001 | IP不合法 |
1002 | 账户余额不足 |
1003 | 话术不可为空 |
1004 | 说话人不合法 |
1005 | 账户未开通 |
1006 | 模版ID错误 |
1007 | 验证参数错误 |
2001 | 请求类型非法 |