语音识别

简介

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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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调用,其中getReqSigndoHttpPost可以从接口鉴权获取。

// 语音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
    }
}
AI开放平台公众号
关注公众号

打造升级AI项目
推送全球AI热点