开发者平台

语音相关接口

本文档主要列出语音相关接口。

本文档中的接口均符合接口规范,如有疑问,建议先查阅接口引言

接口 接口说明 维护状态
/api/v3/voice/join 加入某个语音频道 正常
/api/v3/voice/list 获取机器人加入的语音频道列表 正常
/api/v3/voice/leave 机器人主动离开频道 正常
/api/v3/voice/keep-alive 保持语音连接活跃 正常

加入语音频道

接口说明

地址 请求方式 说明
/api/v3/voice/join POST 加入某个语音频道

参数列表

参数名 类型 必传 参数区域 说明
channel_id string POST 需要加入的语音频道 id
audio_ssrc string POST 默认为1111. 传输的语音数据的ssrc, 不熟悉慎改。参见RFC 3550
audio_pt string POST 默认为111, 传输的语音数据的payload_type,不熟悉慎改。参见RFC 3551
rtcp_mux boolean POST 默认为true.将rtcp与rtp使用同一个端口进行传输,参见RFC 5761
password string POST 有些房间需要密码才能进入,可以传入密码

返回参数说明

参数名 类型 说明
ip string 媒体服务器的推流ip
port string 媒体服务器的推流端口
rtcp_mux boolean 是否将rtcp与rtp使用同一个端口进行传输,如果为true,推流地址应该为 rtp://ip:port
rtcp_port int 媒体服务器的rtcp推流端口.如果使用rtcp_mux,请忽略该参数。如果不使用rtcp_mux,则推流地址中需要写上rtcpport,如: rtp://xxx:port?rtcpport=rtcpPort
bitrate int 当前语音房间要求的比特率,系统会检测机器人的推流码率, 如果超速(正常推流由于各种原因会在码率上下浮动,请不要超过120%)会被关闭,甚至处罚,请遵照比特率进行推流
audio_ssrc string 同上, 最终的ssrc
audio_pt string 同上, 最终的payload_type

返回示例

//假设我们发起了请求,返回了如下的数据,说明我们已经创建了相应的语音推流地址

{
    "code": 0,
    "message": "操作成功",
    "data": {
        "ip": "127.0.0.1",
        "port": "1000",
        "rtcp_port": "10001",
        "rtcp_mux" : false,
        "bitrate": 48000,
        "audio_ssrc": "1111",
        "audio_pt": "111"
    }
}

那么现在,我们可以使用ffmpeg/gstreamer来进行推流,如下为ffmpeg的示例:

# 如下为推流的一个示例,最主要的是后面的推流地址,我们需要交json中返回的audio_ssrc, audio_pt, ip, port, rtcpPort填入即可。
# -ab 参数后面是码率,本示例中推流码率为48k, 大家可以根据返回的参数自行调整
# 其它的参数如果不会ffmeg请尽量不要改动, 如果有需求,可以参考 https://ffmpeg.org/ffmpeg.html
ffmpeg  -i 'test.mp3' -re -map '0:a:0' -acodec libopus -ab 48k -ac 2 -ar 48000 -filter:a 'volume=0.8' -f tee '[select=a:f=rtp:ssrc=1111:payload_type=111]rtp://127.0.0.1:1000?rtcpport=1001'

Tips:

  1. KOOK默认的编码是opus编码,你可能需要在ffmpeg的基础上安装libopus.
  2. 基于安全考量,在创建推流的ip和端口后,我们会将你的ip和端口与该推流地址绑定,防止黑客扫描端口或者泄漏带来的可能的安全风险。因此,该措施会导致你创建好的地址,在第一次推流后,第二次向该端口推流会失败(你的外网的端口和ip可能会变化,无法连续使用)。因此,对于多个文件连续推流有两个解决方法:
    • 每次都调该接口,重新生成ip地址和端口
    • 采用ffmpeg的播放列表
  3. 由于推流会占据较多资源,因此,每个机器人还是有限额的,如果当前的额度不够,请在开发者中心联系管理员进行调整。系统会针对每个推流的ip进行检查,如果长期不使用,也会回收资源。对于不再使用的ip,建议开发者主动调用api/v3/voice/leave来释放资源。

获取频道列表

接口说明

地址 请求方式 说明
/api/v3/voice/list GET 获取机器人加入的语音频道列表

参数列表

参数名 位置 类型 必需 说明

返回参数说明

参数名 类型 说明
id string 频道id
guild_id string 服务器id
parent_id string 频道的父频道id
name string 频道名

返回示例

{
    "code":0,
    "message":"操作成功",
    "data":{
        "items":[
            {
                "id":"12345",
                "guild_id":"12345",
                "parent_id":"11234",
                "name":"语音频道"
            }
        ],
        "meta":{
            "page":1,
            "page_total":1,
            "page_size":50,
            "total":1
        },
        "sort":{}
    }
}

离开语音频道

接口说明

地址 请求方式 说明
/api/v3/voice/leave POST 离开语音频道

参数列表

参数名 位置 类型 必需 说明
channel_id string POST 需要离开的语音频道 id

返回参数说明

参数名 类型 说明

返回示例

{
    "code": 0,
    "message": "操作成功",
    "data": {
    }
}

保持语音连接活跃

接口说明

地址 请求方式 说明
/api/v3/voice/keep-alive POST 保持语音连接活跃。正常如果长时间断流,系统会回收端口等资源,如果不希望系统回收,可以每隔45s,调用该接口,保持端口活跃,这样系统不会回收该端口资源

参数列表

参数名 位置 类型 必需 说明
channel_id string POST 需要保持活跃语音频道 id

返回参数说明

参数名 类型 说明

返回示例

{
    "code": 0,
    "message": "操作成功",
    "data": {
    }
}