进阶 docs.ojin.ai 2026-10-14 02:27:09 · 20 阅读

第9章 Python SDK——实时说话头像开发指南

完整文档索引请参阅 llms.txt。此页同样提供 Markdown 版本。

Python SDK

直接从 Python 调用 Ojin 的人脸模型(Human Presence 与 Human Portrait)。输入 TTS 音频,即可获取同步、唇形匹配的说话头像流。

ojin-client SDK 是为 Python 应用或语音智能体实时添加说话头像的最快方式。你只需提供文本(任何 TTS 生成的音频),SDK 会回传一个口型完美同步的说话人脸,并自动处理缓冲、播放时钟、重采样以及抢话(barge-in)。

如果想要一个完整的智能体?如果不希望自行搭建流水线,Human Agent 可以通过单行嵌入代码提供一个完整的语音输入、语音输出的头像。已经在用 Pipecat?直接跳转到 Pipecat 集成部分。

环境要求

  • Python 3.10+
  • Ojin API 密钥(获取链接在此)
  • 人脸模型配置 ID,即来自仪表盘的 Presence 或 Portrait 配置

新账户将获得 10 美元免费额度。

安装

使用 uv(推荐):

uv add "ojin-client[stv]"

或者使用 pip:

pip install "ojin-client[stv]"

附加项 [stv] 会引入语音转视频辅助依赖(numpy, opencv-python-headless, soxr),自动处理重采样、解码及同步计算。

身份验证

客户端需要 API 密钥和配置 ID。请避免在源码中硬编码,建议从环境变量读取:
或者让 SDK 自动加载并校验。resolve_credentials() 会读取可选的 .env 文件,如果缺失任一值将抛出明确错误:

默认情况下,客户端连接至 wss://models.ojin.ai/realtime。
切勿在源码中硬编码 API 密钥或将其提交到版本控制系统。

选择模型

SDK 对两种人脸模型均使用相同的接口;传入的 config_id 决定了实际运行的模型。

config_id 来源... 你获得... 适用场景
Human Presence 配置 旗舰级、高表现力的生成式 Presence,具备丰富的表情和自然的动作 质量与表现力最重要
Human Portrait 配置 高性价比、实时唇形匹配的说话脸 以最优价格获得出色的说话脸效果

在仪表盘创建配置。无论选择哪种,下方的代码相同,仅 config_id 不同。

两种客户端,同一软件包

OjinSTVClient (高级) OjinClient (低级)
导入:
from ojin.stv import OjinSTVClient
导入:
from ojin.ojin_client import OjinClient
输入:任意采样率的 TTS 音频 输入:16 kHz 单声道 int16 PCM
输出:基于 25 fps 时钟的同步 STVAudioFrame + STVVideoFrame 输出:原始协议消息(JPEG + PCM)
处理:缓冲、播放时钟、重采样、抢话重同步 处理:仅 WebSocket + 线协议

大多数应用应使用 OjinSTVClient。仅在编写自己的播放/同步层时,才使用 OjinClient。

选择头像到达观众的方式。默认 OjinSTVClient 通过 WebSocket 将帧回传至你的进程。如果观众位于 LiveKit 或 Daily 房间,请传入 webrtc=WebRTCSettings(...),Ojin 将直接把头像发布到该房间。参见“直接 WebRTC (LiveKit & Daily)”。

快速入门

给头像输入一段 TTS 音频,然后消费其回传的同步流。

say() 是 start_turn() + send_tts_audio() 的一次性辅助函数。对于实时智能体,每句语音调用一次 start_turn(),并在 TTS 生成片段时通过 send_tts_audio() 流式发送。用户听到的是你发送的确切音频,且与头像唇形同步。

SDK 会自动调整输入格式。可以按照 TTS 生成的节奏输入音频,即使是很小的 40 ms 片段也可以。OjinSTVClient 会自动批处理音频;无需收集几秒后再发送。TTS 或网络的暂停仍可能中断播放。它还会将 output_stream() 控制在实时 25 fps,且音视频已同步。你无需管理输入缓冲、播放时钟或丢帧。关于推荐的初始音频量及调优方法,参见“优化性能”。

常用事件

使用 @client.on(STVEvent.X) 或 client.add_listener(STVEvent.X, cb) 注册处理器。处理器可以是同步或异步的;处理器失败不会破坏播放循环。

事件 触发时机
SESSION_READY 会话已就绪,可接受音频
FIRST_FRAME 第一个头像帧发出 (frame_type)
WEBRTC_CONNECTED 仅限直接 WebRTC:头像已加入你的房间 (participant_id)
BOT_STARTED_SPEAKING 一轮对话的第一个语音帧被播放
BOT_STOPPED_SPEAKING 一轮对话播放结束
INTERRUPTED interrupt() 生效(检查其返回值以确定是否实际发送了服务端取消)
ERROR 发生传输或服务端错误
CLOSED 会话已关闭

下一步

可运行示例:
实时流媒体及渲染为 MP4,可直接克隆。

构建语音智能体:
将头像放入 Pipecat 流水线。

直接 WebRTC:
将头像直接发布到 LiveKit 或 Daily 房间。

最佳实践:适用于浏览器输出、WebRTC 后端和直接 WebRTC 的流水线模式
选择人脸模型:Human Presence(旗舰版)或 Human Portrait(高性价比)
调优延迟与稳定性:参考“优化性能”及故障排除指南
完整 API 表面:完整的客户端参考位于 ojin-client README 及 PyPI
入门示例:02-realtime-speech-to-video(实时流)和 01-speech-to-video-mp4-generator(渲染至文件)

上一篇 最佳实践
下一篇 最佳实践
最后更新于 12 天前
有帮助吗?

评论 (0)