能力 | 说明 |
两种建流方式 | AssetVirtualmanKey(形象资产 ID)、VirtualmanProjectId(数智人项目 ID) |
三种流协议 | RTMP、TRTC、WebRTC |
两种驱动模式 | 文本驱动(输入文字让数智人说话)、音频驱动(上传音频文件驱动口型) |
H5 视频播放 | TRTC 和 WebRTC 协议自动弹出浏览器播放页面 |
├── tencent_virtual_human_completeV1.py # 主脚本(Python)├── trtc_player.html # TRTC 协议 H5 播放页面├── webrtc_player.html # WebRTC 协议 H5 播放页面└── TcPlayer-2.4.5.js # TCPlayerLite SDK(WebRTC 播放依赖)
pip install requests websocket-client pydub
# macOSbrew install ffmpeg# Ubuntu/Debiansudo apt install ffmpeg# Windows# 下载 https://ffmpeg.org/download.html 并添加到 PATH
参数 | 说明 | 获取方式 |
appkey | 应用标识 | 数智人平台 → 应用管理(参考图1) |
accesstoken | 访问令牌 | 数智人平台 → 应用管理(参考图1) |
asset_virtualman_key | 形象资产 ID | 数智人平台 → 形象资产管理(参考图2) |
virtualman_project_id | 数智人项目 ID | 数智人平台 → 项目管理 |
asset_virtualman_key 和 virtualman_project_id 代表两种不同的建流方式,使用时二选一即可。



tencent_virtual_human_completeV1.py 文件底部的 CONFIG 字典:CONFIG = {"appkey": "your_appkey","accesstoken": "your_accesstoken","asset_virtualman_key": "your_asset_key", # 形象资产ID(优先使用)"virtualman_project_id": "", # 项目ID(asset_key为空时使用)"protocol": "rtmp", # 流协议: "rtmp" / "trtc" / "webrtc""protocol_option": None, # 协议选项(见第5节)}
Operating System: Ubuntu 24.04.3 LTS / x86_64
Runtime Version: Python 3.11.1
python tencent_virtual_human_completeV1.py
1️⃣ 创建会话(自动选择建流方式)2️⃣ 等待会话就绪(轮询状态,最多120秒)3️⃣ 开启会话🎬 自动启动 H5 播放器(TRTC/WebRTC 协议时)4️⃣ 创建 WebSocket 连接5️⃣ 进入交互模式6️⃣ 关闭会话
📋 驱动方式选择:1 - 文本驱动(输入文字让数智人说话)2 - 音频驱动(选择音频文件驱动数智人)q - 退出
1:进入文本驱动模式,输入文字后数智人会用 TTS 合成语音并同步口型。2:进入音频驱动模式,输入音频文件路径(支持 mp3、wav 等格式),数智人将用你的音频驱动口型。q:退出并关闭会话。/v2/ivh/sessionmanager/sessionmanagerservice/createsessionbyassetCONFIG = {"asset_virtualman_key": "your_asset_key","virtualman_project_id": "", # 留空}
Operating System: Ubuntu 24.04.3 LTS / x86_64
Runtime Version: Python 3.11.1
/v2/ivh/sessionmanager/sessionmanagerservice/createsessionCONFIG = {"asset_virtualman_key": "", # 留空"virtualman_project_id": "your_project_id",}
Operating System: Ubuntu 24.04.3 LTS / x86_64
Runtime Version: Python 3.11.1
create_session() 统一入口自动选择建流方式:def create_session(self) -> Tuple[bool, str]:if self.asset_virtualman_key:return self.create_session_by_asset() # 优先elif self.virtualman_project_id:return self.create_session_by_project() # 降级else:return False, "两个参数均为空,无法建流"
协议 | 延迟 | 播放方式 | 适用场景 |
RTMP 协议 | 2~5秒 | VLC 等外部播放器 | 通用场景、兼容性最好 |
TRTC 协议 | 200~400ms | 自动弹出 H5 页面(TRTC Web SDK) | 超低延迟实时交互 |
WebRTC 协议 | 500ms~1秒 | 自动弹出 H5 页面(TCPlayerLite) | 低延迟 Web 播放 |
CONFIG = {"protocol": "rtmp","protocol_option": None,}
rtmp://liveplay.ivh.qq.com/live/m789。使用 VLC 等播放器打开即可。# 调试模式(使用平台统一 AppId,无需额外配置)CONFIG = {"protocol": "trtc","protocol_option": None,}
trtc:// 格式播放地址,脚本自动:trtc:// 地址中的 appId、roomId、userSig 等参数;trtc_player.html 播放页面;CONFIG = {"protocol": "webrtc","protocol_option": None,}
webrtc:// 格式播放地址,脚本自动:webrtc_player.html 播放页面;ProtocolOption 用于 TRTC 生产环境或自定义推流场景。字段 | 类型 | 说明 |
TrtcUseExternalApp | bool | 是否使用外部 TRTC AppId |
TrtcAppId | str | TRTC 应用 ID(外部 AppId 时必填) |
TrtcRoomId | int | TRTC 数字房间号 |
TrtcStrRoomId | str | TRTC 字符串房间号(与 TrtcRoomId 二选一) |
TrtcAutoGenRoomIdType | int | 自动生成房间号类型:0=数字(默认),1=字符串 |
TrtcUserSig | str | TRTC 用户签名(外部 AppId 时必填) |
TrtcPrivateMapKey | str | TRTC 权限票据(未开启高级权限填 "dummy") |
CssCustomPushUrl | str | 自定义云直播推流地址(任何协议均可使用) |
CONFIG = {"protocol": "trtc","protocol_option": {"TrtcUseExternalApp": True,"TrtcAppId": "1400xxxxxx","TrtcRoomId": 12345,"TrtcUserSig": "eJw8js0Kgk...","TrtcPrivateMapKey": "dummy"},}
CONFIG = {"protocol": "rtmp","protocol_option": {"CssCustomPushUrl": "rtmp://domain/appName/streamName?txSecret={0}&txTime={1}"},}
"ExtraInfo": {"AlphaChannelEnable":True} # 开启Alpha通道(如果需要透明背景)
appId、roomId、userId、userSigrole: 'audience')进入 TRTC 房间REMOTE_VIDEO_AVAILABLE 事件,自动拉取远端视频流object-fit: contain 完整显示// 进入房间(仅观众拉流,不推流)await trtc.enterRoom({sdkAppId: config.appId,userId: config.userId,userSig: config.userSig,roomId: config.roomId,scene: 'live',role: 'audience'});// 监听并播放远端视频trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, async (event) => {await trtc.startRemoteVideo({userId: event.userId,streamType: event.streamType,view: 'remote-video',option: { objectFit: 'contain' }});});
http://localhost:8080/trtc_player.html?appId=1400695865&roomId=402183450&userId=user_xxx&userSig=eJw8...&virtualManUserId=402183450_ivh_anchor
TcPlayer-2.4.5.js)?url=webrtc://... 读取 WebRTC 播放地址player = new TcPlayer('player-container', {"webrtc": webrtcUrl,"width": '100%',"height": '540',"autoplay": true,"live": true,"controls": "none","webrtcConfig": {"streamType": "auto"},"listener": function (msg) {handlePlayerEvent(msg);}});
http://localhost:8080/webrtc_player.html?url=webrtc://liveplay.ivh.qq.com/live/m11533590420520971383?min_delay_ms=100
file:// 协议不支持)。key1=value1&key2=value2&...;accesstoken 作为密钥计算签名;def _generate_signature(self, parameters: Dict[str, str]) -> str:sorted_params = sorted(parameters.items())signing_content = '&'.join(f'{k}={v}' for k, v in sorted_params)h = hmac.new(self.accesstoken.encode('utf-8'),signing_content.encode('utf-8'),hashlib.sha256)hash_in_base64 = base64.b64encode(h.digest()).decode('utf-8')return quote(hash_in_base64)
┌─────────────┐│ 创建会话 │ create_session()└──────┬──────┘▼┌─────────────┐│ 等待就绪 │ wait_for_session_ready() ← 轮询 SessionStatus└──────┬──────┘ SessionStatus=3 → 准备中▼ SessionStatus=1 → 已就绪┌─────────────┐│ 开启会话 │ start_session()└──────┬──────┘▼┌─────────────┐│ H5 播放器 │ start_h5_player() ← TRTC/WebRTC 时自动启动└──────┬──────┘▼┌─────────────┐│ WebSocket │ create_websocket_connection()│ 长连接通道 │└──────┬──────┘▼┌─────────────┐│ 交互驱动 │ send_text_drive() / send_audio_drive()│ (循环) │└──────┬──────┘▼┌─────────────┐│ 关闭会话 │ close_session()└─────────────┘
drive_cmd = {"Header": {},"Payload": {"ReqId": req_id,"SessionId": self.session_id,"Command": "SEND_TEXT","Data": {"Text": "你好,欢迎来到腾讯云数智人平台","ChatCommand": "NotUseChat"}}}self.ws.send(json.dumps(drive_cmd, ensure_ascii=False))
audio = AudioSegment.from_file(audio_file_path)audio = audio.set_channels(1).set_frame_rate(16000).set_sample_width(2)pcm_data = audio.raw_data
IsFinal: True 结束包_ffmpeg_path = shutil.which('ffmpeg')
object-fit: contain,如果仍有问题,检查浏览器是否为最新版本。TcPlayer-2.4.5.js 文件与 webrtc_player.html 在同一目录file:// 协议直接打开start_h5_player() 的 h5_port 参数:h5_url = self.start_h5_player(h5_port=9090)
Was this page helpful?
You can also Contact sales or Submit a Ticket for help.
Help us improve! Rate your documentation experience in 5 mins.
Feedback