# 歌曲识别 ACRCloud API 文档
# 接口说明
歌曲识别 ACRCloud,歌曲识别分为歌曲原声识别以及哼唱识别,基于音频的检索匹配,在ACRCloud上亿级曲库中找到对应的歌曲,识别内容中使用的音乐以及歌曲详细信息如歌名、歌手、专辑信息、发行时间和版权信息等。
部分开发语言demo如下,其他开发语言请参照文档进行开发,也欢迎热心的开发者到 讯飞开放平台社区 (opens new window)分享你们的demo。
哼唱识别 demo java语言 (opens new window)
哼唱识别 demo python语言 (opens new window)
音乐识别 demo java语言 (opens new window)
音乐识别 demo python语言 (opens new window)集成歌曲识别 ACRCloud API时,需按照以下要求:
内容 | 说明 |
---|---|
请求协议 | http[s] (为提高安全性,强烈推荐https) |
请求地址 | 哼唱识别:https://cn-east-1.api.xf-yun.com/v1/private/s9884ba49 音乐识别:https://cn-east-1.api.xf-yun.com/v1/private/s29ebee0d 注:服务器IP不固定,为保证您的接口稳定,请勿通过指定IP的方式调用接口,使用域名方式调用 |
请求方式 | POST |
接口鉴权 | 签名机制,详情请参照下方鉴权说明 |
字符编码 | UTF-8 |
响应格式 | 统一采用JSON格式 |
开发语言 | 任意,只要可以向讯飞云服务发起HTTP请求的均可 |
适用范围 | 任意操作系统,但因不支持跨域不适用于浏览器 |
音频属性 | 采样率8/16k、位长8/16bit、单/双声道 |
音频格式 | mp3、speex |
音频大小 | 文件base64编码后不超过10M |
# 鉴权说明
在调用业务接口时,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。 通过在请求地址后面加上鉴权相关参数的方式,参数具体如下: http示例url:
https://cn-east-1.api.xf-yun.com/v1/private/s9884ba49?authorization=YXBpX2tleT0iYXBpa2V5WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iMkdUVmN2Y0NQdDcyMWxnUUxseHhCNzVZS1lzb3RaMHM3TWh3WHJaTUNQdz0i&host=cn-east-1.api.xf-yun.com&date=Thu%2C+31+Mar+2022+02%3A42%3A08+GMT
鉴权参数:
参数 | 类型 | 必须 | 说明 | 示例 |
---|---|---|---|---|
host | string | 是 | 请求主机 | cn-east-1.api.xf-yun.com |
date | string | 是 | 当前时间戳,RFC1123格式("EEE, dd MMM yyyy HH:mm:ss z") | Thu, 31 Mar 2022 02:42:08 GMT |
authorization | string | 是 | 使用base64编码的签名相关信息(签名基于hamc-sha256计算) | 参考下方详细生成规则 |
• date参数生成规则:
date必须是UTC+0或GMT时区,RFC1123格式(Thu, 31 Mar 2022 02:42:08 GMT)。
服务端会对date进行时钟偏移检查,最大允许300秒的偏差,超出偏差的请求都将被拒绝。
• authorization参数生成格式:
1)获取接口密钥APIKey 和 APISecret。
在讯飞开放平台控制台,创建一个应用后打开歌曲识别 ACRCloud页面可以获取,均为32位字符串。
2)参数authorization base64编码前(authorization_origin)的格式如下。
api_key="$api_key",algorithm="hmac-sha256",headers="host date request-line",signature="$signature"
其中 api_key 是在控制台获取的APIKey,algorithm 是加密算法(仅支持hmac-sha256),headers 是参与签名的参数(见下方注释)。
signature 是使用加密算法对参与签名的参数签名后并使用base64编码的字符串,详见下方。
注: headers是参与签名的参数,请注意是固定的参数名("host date request-line"),而非这些参数的值。
3)signature的原始字段(signature_origin)规则如下。
signature原始字段由 host,date,request-line三个参数按照格式拼接成,
拼接的格式为(\n为换行符,’:’后面有一个空格):
host: $host\ndate: $date\n$request-line
假设
请求url = https://cn-east-1.api.xf-yun.com/v1/private/s9884ba49
date = "Thu, 31 Mar 2022 02:42:08 GMT"
那么 signature原始字段(signature_origin)则为:
host: cn-east-1.api.xf-yun.com
date: Thu, 31 Mar 2022 02:42:08 GMT
POST /v1/private/s9884ba49 HTTP/1.1
4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。
signature_sha=hmac-sha256(signature_origin,$apiSecret)
其中 apiSecret 是在控制台获取的APISecret
5)使用base64编码对signature_sha进行编码获得最终的signature。
signature=base64(signature_sha)
假设
APISecret = "apisecretXXXXXXXXXXXXXXXXXXXXXXX"
date = "Thu, 31 Mar 2022 02:42:08 GMT"
则signature为
signature="2GTVcvcCPt721lgQLlxxB75YKYsotZ0s7MhwXrZMCPw="
6)根据以上信息拼接authorization base64编码前(authorization_origin)的字符串,示例如下。
api_key="apikeyXXXXXXXXXXXXXXXXXXXXXXXXXX", algorithm="hmac-sha256", headers="host date request-line", signature="2GTVcvcCPt721lgQLlxxB75YKYsotZ0s7MhwXrZMCPw="
注: headers是参与签名的参数,请注意是固定的参数名("host date request-line"),而非这些参数的值。
7)最后再对authorization_origin进行base64编码获得最终的authorization参数。
authorization = base64(authorization_origin)
示例结果为:
authorization=YXBpX2tleT0iYXBpa2V5WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iMkdUVmN2Y0NQdDcyMWxnUUxseHhCNzVZS1lzb3RaMHM3TWh3WHJaTUNQdz0i
# 鉴权结果
如果鉴权失败,则根据不同错误类型返回不同HTTP Code状态码,同时携带错误描述信息,详细错误说明如下:
HTTP Code | 说明 | 错误描述信息 | 解决方法 |
---|---|---|---|
401 | 缺少authorization参数 | {"message":"Unauthorized"} | 检查是否有authorization参数,详情见authorization参数详细生成规则 |
401 | 签名参数解析失败 | {“message”:”HMAC signature cannot be verified”} | 检查签名的各个参数是否有缺失是否正确,特别确认下复制的api_key是否正确 |
401 | 签名校验失败 | {“message”:”HMAC signature does not match”} | 签名验证失败,可能原因有很多。 1. 检查api_key,api_secret 是否正确 。 2.检查计算签名的参数host,date,request-line是否按照协议要求拼接 。 3. 检查signature签名的base64长度是否正常(正常44个字节) 。 |
403 | 时钟偏移校验失败 | {“message”:”HMAC signature cannot be verified, a valid date or x-date header is required for HMAC Authentication”} | 检查服务器时间是否标准,相差5分钟以上会报此错误 |
时钟偏移校验失败示例:
HTTP/1.1 403 Forbidden
Date: Mon, 30 Nov 2020 02:34:33 GMT
Content-Length: 116
Content-Type: text/plain; charset=utf-8
{
"message": "HMAC signature does not match, a valid date or x-date header is required for HMAC Authentication"
}
# 请求参数
在调用业务接口时,都需要在 Http Request Body 中配置以下参数,请求数据均为json字符串。
请求参数示例:(哼唱识别)
{
"header": {
"app_id": "your_app_id",
"status": 3,
},
"parameter": {
"acr_humming": {
"mode": "humming",
"output_text": {
"encoding": "utf8",
"compress": "raw",
"format": "json"
}
}
},
"payload": {
"data": {
"encoding": "lame",
"sample_rate": 16000,
"channels": 1,
"bit_depth": 16,
"status": 3,
"audio": "exSI6ICJlbiIsCgkgICAgInBvc2l0aW9uIjogImZhbHNlIgoJf...",
"frame_size": 0
}
}
}
请求参数说明:(哼唱识别)
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
header | Object | 是 | 协议头部,用于描述平台特性的参数 |
header.app_id | string | 是 | 在平台申请的appid信息 |
header.status | int | 是 | 请求状态,可选值为:3 (一次性传完) |
parameter | Object | 是 | 用于上传服务特性参数 |
parameter.acr_humming | Object | 是 | 服务别名 |
parameter.acr_humming.mode | string | 是 | 可选值:humming |
parameter.acr_humming.output_text | Object | 是 | 响应数据格式预期 |
parameter.acr_humming.output_text.encoding | string | 否 | 文本编码,可选值:utf8(默认)、gb2312 |
parameter.acr_humming.output_text.compress | string | 否 | 文本压缩格式,可选值:raw(默认)、 gzip |
parameter.acr_humming.output_text.format | string | 否 | 文本格式,可选值:plain、 json(默认)、 xml |
payload | Object | 是 | 输入数据段,携带请求的数据 |
payload.data | Object | 是 | 输入的音频数据格式 |
payload.data.encoding | string | 是 | 音频编码,可选值:lame、speex-wb |
payload.data.sample_rate | int | 否 | 采样率,可选值:16000,8000 |
payload.data.channels | int | 否 | 声道数,可选值:1,2 |
payload.data.bit_depth | int | 否 | 位深,可选值:16,8 |
payload.data.status | int | 否 | 数据状态,可选值:3 (一次性传完) |
payload.data.audio | string | 是 | 音频数据,base64编码后大小:0 - 1048576B |
payload.data.frame_size | int | 否 | 帧大小,最小值:0 (默认), 最大值:1024 |
请求参数示例:(音乐识别)
{
"header": {
"app_id": "your_appid",
"status": 3,
},
"parameter": {
"acr_music": {
"mode": "music",
"output_text": {
"encoding": "utf8",
"compress": "raw",
"format": "json"
}
}
},
"payload": {
"data": {
"encoding": "speex-wb",
"sample_rate": 16000,
"channels": 1,
"bit_depth": 16,
"status": 3,
"audio": "SUQzBA......",
"frame_size": 0
}
}
}
请求参数说明:(音乐识别)
参数名 | 类型 | 必传 | 描述 |
---|---|---|---|
header | Object | 是 | 协议头部,用于描述平台特性的参数 |
header.app_id | string | 是 | 在平台申请的appid信息 |
header.status | int | 是 | 请求状态,可选值为:3 (一次性传完) |
parameter | Object | 是 | 用于上传服务特性参数 |
parameter.acr_music | Object | 是 | 服务别名 |
parameter.acr_music.mode | string | 是 | 音乐识别,可选值:music |
parameter.acr_music.output_text | Object | 是 | 响应数据格式预期 |
parameter.acr_music.output_text.encoding | string | 否 | 文本编码,可选值:utf8(默认)、gb2312 |
parameter.acr_music.output_text.compress | string | 否 | 文本压缩格式,可选值:raw(默认)、 gzip |
parameter.acr_music.output_text.format | string | 否 | 文本格式,可选值:plain、 json(默认)、 xml |
payload | Object | 是 | 输入数据段,携带请求的数据 |
payload.data | Object | 是 | 输入的音频数据格式 |
payload.data.encoding | string | 是 | 音频编码,可选值:lame、speex-wb |
payload.data.sample_rate | int | 否 | 采样率,可选值:16000,8000 |
payload.data.channels | int | 否 | 声道数,可选值:1,2 |
payload.data.bit_depth | int | 否 | 位深,可选值:16,8 |
payload.data.status | int | 否 | 数据状态,可选值:3 (一次性传完) |
payload.data.audio | string | 是 | 音频数据,base64编码后大小:0 - 1048576B |
payload.data.frame_size | int | 否 | 帧大小,最小值:0 (默认), 最大值:1024 |
# 返回结果
返回参数示例:
{
"header": {
"code": 0,
"message": "success",
"sid": "ase000e1db1@hu17fdeceb15c0207882"
},
"payload": {
"output_text": {
"compress": "raw",
"encoding": "utf8",
"format": "json",
"seq": "0",
"status": "3",
"text": "eyJjb3N0X3Rpb......"
}
}
}
返回参数说明:
参数名 | 类型 | 描述 |
---|---|---|
header | Object | 协议头部,用于描述平台特性的参数 |
header.code | int | 返回码,0表示成功,其它表示异常 |
header.message | string | 错误描述 |
header.sid | string | 本次会话的id |
payload | Object | 响应数据块 |
payload.output_text | Object | 输出数据 |
payload.output_text.compress | string | 文本压缩格式 |
payload.output_text.encoding | string | 文本编码 |
payload.output_text.format | string | 文本格式 |
payload.output_text.seq | string | 数据序号 |
payload.output_text.status | string | 数据状态 |
payload.output_text.text | string | 文本数据 |
text字段Base64解码后示例:(哼唱识别)
{
"cost_time": 0.76300001144409,
"status": {
"msg": "Success",
"version": "1.0",
"code": 0
},
"metadata": {
"humming": [{
"play_offset_ms": 149350,
"external_ids": {},
"artists": [{
"name": "周杰伦"
}],
"acrid": "e0a93ffb5f48de0773793f254ed2a0a4",
"title": "明明就",
"album": {
"name": ""
},
"score": 0.96,
"external_metadata": {},
"result_from": 9
}, {
"play_offset_ms": 79710,
"external_ids": {},
"artists": [{
"name": "麦浚龙"
}],
"acrid": "d1a3ec1b9699ef503a4f5376217bebe1",
"title": "爱上杀手",
"album": {
"name": ""
},
"score": 0.68,
"external_metadata": {},
"result_from": 2
}, {
"play_offset_ms": 70580,
"external_ids": {},
"artists": [{
"name": "林俊杰"
}],
"acrid": "9db961cd28cb0371d61ceb948acdd071",
"title": "黑武士",
"album": {
"name": ""
},
"score": 0.65,
"external_metadata": {},
"result_from": 2
}, {
"play_offset_ms": 127460,
"external_ids": {},
"artists": [{
"name": "韦唯"
}],
"acrid": "0cfdb99436f5345f9912e16a839fe946",
"title": "爱的奉献",
"album": {
"name": ""
},
"score": 0.64,
"external_metadata": {},
"result_from": 2
}, {
"play_offset_ms": 155020,
"external_ids": {},
"artists": [{
"name": "郑钧"
}],
"acrid": "7c0905136af28afd94e3acca67c27143",
"title": "私奔",
"album": {
"name": ""
},
"score": 0.61,
"external_metadata": {},
"result_from": 2
}]
}
}
text字段Base64解码后示例:(音乐识别)
{
"metadata": {
"timestamp_utc": "2022-06-22 02:42:25",
"music": [{
"play_offset_ms": 59480,
"artists": [{
"name": "张碧晨"
}],
"language": "zh",
"album": {
"name": "光的方向"
},
"label": "华策音乐(天津)有限公司",
"acrid": "22bf590667ed22bfe0c6e0e7e7bf8b8f",
"external_ids": {},
"release_date": "2021-03-31",
"contributors": {
"composers": ["金大洲"],
"lyricists": ["萨吉"]
},
"title": "光的方向(电视剧《长歌行》片头主题曲)",
"external_metadata": {},
"duration_ms": 185000,
"result_from": 3,
"score": 100
}]
},
"cost_time": 0.89600014686584,
"status": {
"msg": "Success",
"version": "1.0",
"code": 0
},
"result_type": 0
}
text字段base64解码后关键信息如下:
参数名 | 类型 | 描述 |
---|---|---|
timestamp_utc | string | 服务端返回时间 ( UTC 时间 ) |
humming | array | 哼唱识别字段 |
music | array | 音乐识别字段 |
play_offset_ms | float | 播放位置 |
artists | array | 歌手字段 |
artists.name | string | 歌手名 |
album | object | 专辑字段 |
album.name | string | 专辑名 |
label | string | 音乐发行版权方 |
external_ids | object | 其他标准码(如 isrc) |
release_date | string | 发行时间 |
contributors | object | 贡献者字段 |
contributors.composers | array | 作曲人名 |
contributors.lyricists | array | 作词人名 |
title | string | 歌曲名 |
external_metadata | object | 第三方平台 id 和 metadata |
duration_ms | float | 歌曲时长 (毫秒) |
result_from | float | 忽略 |
score | float | 识别置信度(满分为100分) |
cost_time | float | 接受数据和响应总时间 |
status | object | 状态信息 |
status.msg | string | 状态详细描述 |
status.version | string | 版本信息 |
status.code | float | 状态信息码 |
# 常见问题
# 音乐识别和哼唱识别的区别?
答:音乐识别:通过听筒收集音乐播放信息,系统自动识别并检索出所播放的歌曲。 哼唱识别:用户对着话筒哼唱小段歌曲,系统自动识别并检索出所哼唱的歌曲。
# 歌曲识别支持什么音频格式?
答:目前支持采样率8/16k、位长8/16bit、单/双声道的mp3或speex格式的音频。
# 歌曲识别支持什么应用平台?
答:目前支持WebAPI应用平台。