WebRTC全双工AI与音视频关联:完整报文
约 1191 字大约 4 分钟
2026-10-16
本页是场景流程的完整 JSON 序列,按图中编号查阅。示例中的分支互斥,不能顺序重放全部报文;实际 ID、截止、SDP、地址和密钥须由运行时取得。实施状态及字段定义仍以场景与命令页为准。
补充示例 1
{"msgToken":"s20-cap","method":"capabilityReport","params":{"revision":1,"purposes":["aiConversation"],"transports":["webrtc"],"supportedInteractionModes":["fullDuplex"],"aecMode":"device","features":["audio"],"audio":{"format":"opus","sampleRate":48000,"channels":1,"frameDuration":20}}}补充示例 2
{"msgToken":"s20-cap","method":"requestAck","code":200,"data":{"requestMethod":"capabilityReport","result":{"acceptedRevision":1}}}编号报文
M01 · sessionCreate
{
"msgToken": "s20-77",
"method": "sessionCreate",
"params": {
"purpose": "aiConversation",
"transport": "webrtc",
"audioParams": {
"format": "opus",
"sampleRate": 48000,
"channels": 1,
"frameDuration": 20
},
"tracks": [
{
"trackId": "mic",
"kind": "audio",
"sourceId": "mic",
"direction": "sendonly",
"codec": "opus",
"state": "requested"
},
{
"trackId": "speaker",
"kind": "audio",
"sourceId": "speaker",
"direction": "recvonly",
"codec": "opus",
"state": "requested"
}
],
"supportedInteractionModes": [
"fullDuplex"
]
}
}M02 · sessionCreated
{
"msgToken": "s20-77",
"method": "sessionCreated",
"sessionId": "s20-session",
"data": {
"state": "negotiating",
"selected": {
"transport": "webrtc",
"interactionMode": "fullDuplex",
"audioParams": {
"format": "opus",
"sampleRate": 48000,
"channels": 1,
"frameDuration": 20
}
},
"tracks": [
{
"trackId": "mic",
"kind": "audio",
"sourceId": "mic",
"direction": "sendonly",
"codec": "opus",
"state": "requested"
},
{
"trackId": "speaker",
"kind": "audio",
"sourceId": "speaker",
"direction": "recvonly",
"codec": "opus",
"state": "requested"
}
]
},
"code": 200
}M03 · mediaOffer
{
"msgToken": "s20-78",
"method": "mediaOffer",
"sessionId": "s20-session",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP offer>"
}
}
}M04 · mediaAnswer
{
"msgToken": "s20-78",
"method": "mediaAnswer",
"sessionId": "s20-session",
"data": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP answer>"
}
},
"code": 200
}M05 · mediaState
{
"msgToken": "s20-79",
"method": "mediaState",
"sessionId": "s20-session",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}M06 · requestAck
{
"msgToken": "s20-79",
"method": "requestAck",
"sessionId": "s20-session",
"data": {
"requestMethod": "mediaState",
"result": {
"mediaRevision": 1,
"state": "connected"
}
},
"code": 200
}M07 · sessionEstablished
{
"msgToken": "s20-80",
"method": "sessionEstablished",
"sessionId": "s20-session",
"data": {
"state": "established",
"mediaRevision": 1
},
"eventSeq": 1
}M08 · audioStart
{
"msgToken": "s20-81",
"method": "audioStart",
"sessionId": "s20-session",
"params": {
"inputId": "continuous-wrtc"
}
}M09 · requestAck
{
"msgToken": "s20-81",
"method": "requestAck",
"sessionId": "s20-session",
"data": {
"requestMethod": "audioStart",
"result": {
"inputId": "continuous-wrtc"
}
},
"code": 200
}M10 · respCreated
{
"msgToken": "s20-82",
"method": "respCreated",
"sessionId": "s20-session",
"data": {
"respId": "r-old",
"inputId": "continuous-wrtc"
},
"messageSeq": 1
}M11 · respTextDone
{
"msgToken": "s20-83",
"method": "respTextDone",
"sessionId": "s20-session",
"data": {
"respId": "r-old",
"contentIndex": 0,
"text": "请继续说。"
},
"messageSeq": 2
}M12 · respAudioStart
{
"msgToken": "s20-84",
"method": "respAudioStart",
"sessionId": "s20-session",
"data": {
"respId": "r-old",
"trackId": "speaker",
"mediaRevision": 1
},
"eventSeq": 2
}M13 · respCancel
{
"msgToken": "s20-85",
"method": "respCancel",
"sessionId": "s20-session",
"params": {
"respId": "r-old"
}
}M14 · requestAck
{
"msgToken": "s20-85",
"method": "requestAck",
"sessionId": "s20-session",
"data": {
"requestMethod": "respCancel",
"result": {
"respId": "r-old",
"state": "cancelled"
}
},
"code": 200
}M15 · audioSpeechInterrupted
{
"msgToken": "s20-86",
"method": "audioSpeechInterrupted",
"sessionId": "s20-session",
"data": {
"respId": "r-old",
"trackId": "speaker",
"mediaRevision": 1
},
"eventSeq": 3
}M25 · respDone
{
"method": "respDone",
"msgToken": "s20-audit-5",
"sessionId": "s20-session",
"messageSeq": 3,
"data": {
"respId": "r-old",
"inputId": "continuous-wrtc",
"status": "cancelled",
"contentCount": 1,
"audioState": "cancelled",
"reason": "bargeIn"
}
}M16 · respCreated
{
"msgToken": "s20-87",
"method": "respCreated",
"sessionId": "s20-session",
"data": {
"respId": "r-new",
"inputId": "continuous-wrtc"
},
"messageSeq": 4
}M17 · respAudioStart
{
"msgToken": "s20-88",
"method": "respAudioStart",
"sessionId": "s20-session",
"data": {
"respId": "r-new",
"trackId": "speaker",
"mediaRevision": 1
},
"eventSeq": 4
}M26 · respDone
{
"method": "respDone",
"msgToken": "s20-audit-6",
"sessionId": "s20-session",
"messageSeq": 5,
"data": {
"respId": "r-new",
"inputId": "continuous-wrtc",
"status": "completed",
"contentCount": 0,
"audioState": "sent"
}
}M27 · respDone
{
"msgToken": "s20-final-60",
"method": "respDone",
"sessionId": "s20-session",
"messageSeq": 6,
"data": {
"respId": "r-new",
"inputId": "continuous-wrtc",
"status": "failed",
"reason": "upstreamUnavailable",
"contentCount": 0,
"audioState": "failed"
}
}M18 · sessionError
{
"msgToken": "s20-89",
"method": "sessionError",
"sessionId": "s20-session",
"data": {
"reason": "upstreamUnavailable",
"retryable": true,
"scope": "response",
"respId": "r-new"
},
"eventSeq": 5,
"code": 502
}M19 · audioStop
{
"msgToken": "s20-90",
"method": "audioStop",
"sessionId": "s20-session",
"params": {
"inputId": "continuous-wrtc"
}
}M20 · requestAck
{
"msgToken": "s20-90",
"method": "requestAck",
"sessionId": "s20-session",
"data": {
"requestMethod": "audioStop",
"result": {
"inputId": "continuous-wrtc"
}
},
"code": 200
}M21 · audioStart
{
"msgToken": "s20-91",
"method": "audioStart",
"sessionId": "s20-session",
"params": {
"inputId": "continuous-wrtc-2"
}
}M22 · requestAck
{
"msgToken": "s20-91",
"method": "requestAck",
"sessionId": "s20-session",
"data": {
"requestMethod": "audioStart",
"result": {
"inputId": "continuous-wrtc-2"
}
},
"code": 200
}M23 · sessionEnd
{
"msgToken": "s20-92",
"method": "sessionEnd",
"sessionId": "s20-session",
"params": {
"reason": "userHangup"
}
}M24 · sessionEnded
{
"msgToken": "s20-92",
"method": "sessionEnded",
"sessionId": "s20-session",
"data": {
"state": "ended",
"reason": "userHangup"
},
"code": 200
}更新日志
2026/10/17 03:27
查看所有更新日志
d04e1-docs(AI与音视频): 按公共主线与场景分支整合接入手册于
