语音识别
简介
HI,您好,欢迎使用腾讯AI开放平台语音识别API接口服务。
本文档主要针对需要集成HTTP API的技术研发工程师,详细描述语音识别能力相关的技术内容。
如果您对文档内容有任何疑问,可以通过以下几种方式联系我们:
官方交流一群:581197347
官方交流二群:705874401
官方交流三群:415349651
联系邮箱:aicamp@tencent.com
接口能力
接口名称
接口描述
API地址
语音识别-echo版
对音频进行语音识别,并返回语音的文字内容
https://api.ai.qq.com/fcgi-bin/aai/aai_asr
语音识别-流式版(AI Lab)
对音频进行流式识别,轻松实现边录音边识别
https://api.ai.qq.com/fcgi-bin/aai/aai_asrs
语音识别-流式版(WeChat AI)
对音频进行流式识别,轻松实现边录音边识别
https://api.ai.qq.com/fcgi-bin/aai/aai_wxasrs
更多更强大的接口能力正在开发中,并逐步开放,敬请期待!
协议须知
调用方集成语音识别API时,请遵循以下规则。
规则
描述
传输方式
HTTPS
请求方法
POST
语音参数
必须符合16k或8K采样率、16bit采样位数、单声道
语音格式
PCM、WAV、AMR、 SILK
字符编码
统一采用UTF-8编码
响应格式
统一采用JSON格式
接口鉴权
签名机制,详情请阅接口鉴权
一、语音识别-echo版
1. 接口描述
语音识别-echo版接口提供在线识别语音的能力,对整段音频进行识别,识别完成后,将返回语音的文字内容。
请注意单次请求中,语音时长上限15秒。
只支持中文普通话语音识别,后续开放更多语种的识别能力。
2. 请求参数
参数名称
是否必选
数据类型
数据约束
示例数据
描述
app_id
是
int
正整数
1000001
应用标识(AppId)
time_stamp
是
int
正整数
1493468759
请求时间戳(秒级)
nonce_str
是
string
非空且长度上限32字节
fa577ce340859f9fe
随机字符串
sign
是
string
非空且长度固定32字节
签名信息,详见接口鉴权
format
是
int
正整数
2
语音压缩格式编码,定义见下文描述
speech
是
string
语音数据的Base64编码,非空且长度上限8MB
待识别语音(时长上限15s)
rate
否
int
正整数
16000
语音采样率编码,定义见下文描述,(不传)默认即16KHz
语音压缩格式编码
格式名称
格式编码
PCM
1
WAV
2
AMR
3
SILK
4
语音采样率编码
采样率
编码
8KHz
8000
16KHz
16000
3. 响应参数
参数名称
是否必选
数据类型
描述
ret
是
int
返回码; 0表示成功,非0表示出错
msg
是
string
返回信息;ret非0时表示出错时错误原因
data
是
object
返回数据;ret为0时有意义
+ format
是
int
API请求中的格式编码
+ rate
是
int
API请求中的采样率编码
+ text
是
string
语音识别结果(UTF-8编码)
4. 请求限制
单用户单接口的QPS(每秒请求次数)上限如下,如需更多请联系QQ客服反馈。
未认证用户
个人认证用户
企业认证用户
1
2
10
5. 参考示例
假设示例请求数据如下。
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
2
仅供参考
rate
16000
仅供参考
speech
实时计算base64
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例语音文件存储路径为:/path/to/speech。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '2',
'rate' => '16000',
'speech' => $base64,
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_asr';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 2,
"rate": 16000,
"text": "今天天气怎么样"
}
}
二、语音识别-流式版(AI Lab)
1. 接口描述
语音识别-流式版接口提供流式识别语音的能力,可以轻松实现边录音边识别。
只支持中文普通话语音识别,后续开放更多语种的识别能力。
2. 请求参数
参数名称
是否必选
数据类型
数据约束
示例数据
描述
app_id
是
int
正整数
1000001
应用标识(AppId)
time_stamp
是
int
正整数
1493468759
请求时间戳(秒级)
nonce_str
是
string
非空且长度上限32字节
fa577ce340859f9fe
随机字符串
sign
是
string
非空且长度固定32字节
签名信息,详见接口鉴权
format
是
int
正整数
2
音频压缩格式编码,定义见下文描述
rate
是
int
正整数
16000
音频采样率编码,定义见下文描述
seq
是
int
正整数
0
语音分片所在语音流的偏移量(字节)
len
是
int
正整数
0
语音分片长度(字节)
end
是
int
正整数
0
是否结束分片标识,定义见下文描述
speech_id
是
string
非空且长度上限64B,同一应用内每段语音流标识需唯一,同一段语音流内的语音分片标识需一致
语音唯一标识
speech_chunk
是
string
语音分片数据的Base64编码,非空且长度上限8MB,建议分片单次请求时长200-300ms,分片规则见下文描述
待识别语音分片
语音压缩格式编码
格式名称
格式编码
PCM
1
WAV
2
AMR
3
SILK
4
语音采样率编码
采样率
编码
8KHz
8000
16KHz
16000
是否结束分片标识
标识
说明
0
中间分片
1
结束分片
分片规则
语音压缩格式
分片规则说明
PCM
支持按字节或者时间切片
WAV
支持按字节或者时间切片
AMR
仅支持按帧切片,第一个分片需包含AMR头标识(#!AMR\n),每个分片至少包含一个AMR帧,一个分片允许包含多个AMR帧
SILK
仅支持按帧切片,第一个分片需包含SILK头标识(#!SILK_V3),每个分片至少包含一个SILK帧,一个分片允许包含多个SILK帧
3. 响应参数
参数名称
是否必选
数据类型
描述
ret
是
int
返回码; 0表示成功,非0表示出错
msg
是
string
返回信息;ret非0时表示出错时错误原因
data
是
object
返回数据;ret为0时有意义
+ format
是
int
API请求中的格式编码
+ rate
是
int
API请求中的采样率编码
+ seq
是
int
API请求中的语音分片所在语音流的偏移量
+ len
是
int
API请求中的语音分片长度
+ end
是
int
API请求中的是否结束分片标识
+ speech_id
是
string
API请求中的语音唯一标识
+ speech_text
是
string
截止当前语音流的语音识别结果(UTF-8编码)
4. 请求限制
单用户单接口的QPS(每秒请求次数)上限如下,如需更多请联系QQ客服反馈。
未认证用户
个人认证用户
企业认证用户
1
2
10
5. 参考示例
假设示例请求数据如下(使用PCM格式),注意同一个语音的不同分片请求中,语音唯一标识是不变的。
本示例预先将PCM语音文件按字节切成3个语音分片,分别存储在:/path/to/speech1、/path/to/speech2、/path/to/speech3中。在实际应用中,开发者可自行选择切片方式。
第一个分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
seq
0
仅供参考
len
实时计算
end
0
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例第一个语音分片文件存储路径为:/path/to/speech1。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech1';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'seq' => '0',
'len' => strlen($data),
'end' => '0',
'speech_id' => 'id',
'speech_chunk' => $base64,
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_asrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"seq": 0,
"len": 1024,
"end": 0,
"speech_id": "id",
"speech_text": ""
}
}
第二个分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
seq
上一个分片的seq+上一个分片的len
len
实时计算
end
0
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例第二个语音分片文件存储路径为:/path/to/speech2。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech2';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'seq' => '1024',
'len' => strlen($data),
'end' => '0',
'speech_id' => 'id',
'speech_chunk' => $base64,
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_asrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"seq": 1024,
"len": 1024,
"end": 0,
"speech_id": "id",
"speech_text": "今天天气"
}
}
最后的分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
seq
上一个分片的seq+上一个分片的len
len
实时计算
end
1
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例最后的语音分片文件存储路径为:/path/to/speech3。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech3';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'seq' => '2048',
'len' => strlen($data),
'end' => '1',
'speech_id' => 'id',
'speech_chunk' => $base64,
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_asrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"seq": 2048,
"len": 1024,
"end": 1,
"speech_id": "id",
"speech_text": "今天天气怎么样"
}
}
三、语音识别-流式版(WeChat AI)
1. 接口描述
语音识别-流式版接口提供流式识别语音的能力,可以轻松实现边录音边识别。
为保证识别的流畅度,语音的分片时长建议200-300ms,单段语音的总时长上限为90s。
只支持中文普通话语音识别,后续开放更多语种的识别能力。
2. 请求参数
参数名称
是否必选
数据类型
数据约束
示例数据
描述
app_id
是
int
正整数
1000001
应用标识(AppId)
time_stamp
是
int
正整数
1493468759
请求时间戳(秒级)
nonce_str
是
string
非空且长度上限32字节
fa577ce340859f9fe
随机字符串
sign
是
string
非空且长度固定32字节
签名信息,详见接口鉴权
format
是
int
正整数
2
音频压缩格式编码,定义见下文描述
rate
是
int
正整数
16000
音频采样率编码,定义见下文描述
bits
是
int
正整数
16
音频采样位数,定义见下文描述
seq
是
int
正整数
0
语音分片所在语音流的偏移量(字节)
len
是
int
正整数
0
语音分片长度(字节)
end
是
int
正整数
0
是否结束分片标识,定义见下文描述
speech_id
是
string
非空且长度上限64B,同一应用内每段语音流标识需唯一,同一段语音流内的语音分片标识需一致
语音唯一标识
speech_chunk
是
string
语音分片数据的Base64编码,非空且时长上限90s,建议时长200-300ms,分片规则见下文描述
待识别语音分片
cont_res
是
int
正整数
0
是否获取中间识别结果,定义见下文描述
语音压缩格式编码
格式名称
格式编码
PCM
1
WAV
2
AMR
3
SILK
4
SPEEX
5
MP3
8
语音采样率编码
采样率
编码
16KHz
16000
语音采样位数
采样位数
编码
16位
16
是否结束分片标识
标识
说明
0
中间分片
1
结束分片
分片规则
语音压缩格式
分片规则说明
PCM
支持按字节或者时间切片
WAV
支持按字节或者时间切片
AMR
支持按字节或者时间切片
SILK
支持按字节或者时间切片
SPEEX
支持按字节或者时间切片
是否获取中间识别结果
标识
说明
0
不获取
1
获取
3. 响应参数
参数名称
是否必选
数据类型
描述
ret
是
int
返回码; 0表示成功,非0表示出错
msg
是
string
返回信息;ret非0时表示出错时错误原因
data
是
object
返回数据;ret为0时有意义
+ format
是
int
API请求中的格式编码
+ rate
是
int
API请求中的采样率编码
+ end
是
int
API请求中的是否结束分片标识
+ speech_id
是
string
API请求中的语音唯一标识
+ speech_text
是
string
截止当前语音流的语音识别结果(UTF-8编码)
+ is_final_res
是
int
是否是最终结果,分片乱序情况下有用
+ ack
是
int
期望收到的下一个语音分片的seq
is_final_res 和 ack 用于语音丢包检测,如果中间的某个语音包未到达,后续语音包先到达,后续语音包的 response 中的 ack 是中间丢包的seq。如果该缺失的语音包一直没有收到,尾包的 response 中的 is_final_res 为0
4. 请求限制
单用户单接口的QPS(每秒请求次数)上限如下,如需更多请联系QQ客服反馈。
未认证用户
个人认证用户
企业认证用户
1
2
10
5. 参考示例
假设示例请求数据如下(使用PCM格式),注意同一个语音的不同分片请求中,语音唯一标识是不变的。具体调用方式见SDK及文档。
本示例预先将PCM语音文件按字节切成3个语音分片,分别存储在:/path/to/speech1、/path/to/speech2、/path/to/speech3中。在实际应用中,开发者可自行选择切片方式。
第一个分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
bits
16
仅供参考
seq
0
仅供参考
len
实时计算
end
0
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
cont_res
1
仅供参考
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例第一个语音分片文件存储路径为:/path/to/speech1。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech1';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'bits' => '16',
'seq' => '0',
'len' => strlen($data),
'end' => '1',
'speech_id' => 'id',
'speech_chunk' => $base64,
'cont_res' => '1',
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_wxasrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"end": 0,
"speech_id": "id",
"speech_text": "",
"is_final_res": 0,
"ack": 1024
}
}
第二个分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
bits
16
仅供参考
seq
上一个分片的seq+上一个分片的len
len
实时计算
end
0
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
cont_res
1
仅供参考
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例第二个语音分片文件存储路径为:/path/to/speech2。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech2';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'bits' => '16',
'seq' => '1024',
'len' => strlen($data),
'end' => '1',
'speech_id' => 'id',
'speech_chunk' => $base64,
'cont_res' => '1',
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_wxasrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"end": 0,
"speech_id": "id",
"speech_text": "今天天气",
"is_final_res": 0,
"ack": 2048
}
}
最后的分片
参数名称
参数数据
描述
app_id
1000001
仅供参考
format
1
仅供参考
rate
16000
仅供参考
bits
16
仅供参考
seq
上一个分片的seq+上一个分片的len
len
实时计算
end
0
仅供参考
speech_id
id
仅供参考
speech_chunk
实时计算base64
cont_res
1
仅供参考
time_stamp
实时计算
nonce_str
实时计算
sign
实时计算
假设应用密钥为:a95eceb1ac8c24ee28b70f7dbba912bf,示例最后的语音分片文件存储路径为:/path/to/speech3。
下面使用PHP实现该HTTP API调用,其中getReqSign、doHttpPost可以从接口鉴权获取。
// 语音base64编码
$path = '/path/to/speech3';
$data = file_get_contents($path);
$base64 = base64_encode($data);
// 设置请求数据
$appkey = 'a95eceb1ac8c24ee28b70f7dbba912bf';
$params = array(
'app_id' => '1000001',
'format' => '1',
'rate' => '16000',
'bits' => '16',
'seq' => '2048',
'len' => strlen($data),
'end' => '1',
'speech_id' => 'id',
'speech_chunk' => $base64,
'cont_res' => '1',
'time_stamp' => strval(time()),
'nonce_str' => strval(rand()),
'sign' => '',
);
$params['sign'] = getReqSign($params, $appkey);
// 执行API调用
$url = 'https://api.ai.qq.com/fcgi-bin/aai/aai_wxasrs';
$response = doHttpPost($url, $params);
echo $response;
上述echo $response的输出结果即API的响应结果(注意使用UTF-8编码):
{
"ret": 0,
"msg": "ok",
"data": {
"format": 1,
"rate": 16000,
"end": 1,
"speech_id": "id",
"speech_text": "今天天气怎么样",
"is_final_res": 1,
"ack": 3072
}
}