按交互选择接口
实时语音助手走 Speech to Speech;文案配音走 Text to Speech。建议在代码中把两者定义成独立操作,前者维护音频会话,后者从文字生成一段音频。
先为自己的应用定义接口,而不是让页面依赖供应商字段:
type VoiceInput = { text: string; language: 'en' | 'zh' };
type VoiceJob = { ticket: string; status: 'queued' };
interface NarrationProvider {
submit(input: VoiceInput, requestId: string): Promise<VoiceJob>;
}
这段代码是应用层接口,不是 xAI SDK。浏览器无需接收内部任务编号、模型名或长期密钥。
先做请求边界
浏览器把文字发给本站服务端。服务端校验来源、长度、语言和额度,再带稳定请求标识提交一次任务,返回有访问范围的票据。前端轮询本站状态接口,成功后获取音频播放地址。
网络重试和重复点击必须在服务端去重。按钮禁用只改善体验,不能保证任务不会重复执行或计费。结果未知时不要立即当作失败创建新任务。
再接实时语音
按照官方 Speech to Speech 会话协议传输麦克风音频与响应事件。由服务端生成短期客户端凭据,长期 key 始终留在服务器。为会话设置时长上限,用户停止时关闭连接。
录音、编码、传输、播放分成独立模块。排障优先记录事件类型、耗时和错误分类,默认不记录完整原始对话。
开放前验收
检查空输入、超长输入、不支持的语言、重复提交、跨会话访问、连接超时和生成失败。上游地址由服务端固定,不能允许客户端任意传 URL。错误信息不能泄露供应商响应与凭据。
最后实际播放和下载音频,不能只用 JSON 返回成功作为验收。实时状态机参见 WebSocket 指南,具体字段和事件名称始终以官方文档为准。