interpretation — 同声传译直通
端到端实时同传引擎:直接吃 16 kHz PCM 音频帧,在一个长连接会话里同步吐出 原文(中间态/定稿)、译文(中间态/定稿)与可选合成语音。
走这条路的插件绕过宿主的 ASR → MT → TTS 级联流水线(典型:科大讯飞实时同传)。
声明
json
{
"id": "community.cloud.xunfei_si",
"name": "科大讯飞实时同传",
"version": "1.0.0",
"target_app_version": "0.2",
"type": "interpretation",
"entrypoint": "xunfei_si.py:XunfeiInterpretationProvider",
"tags": ["cloud", "streaming", "low-latency"],
"requires_hf": false,
"supported_langs": ["en", "zh"],
"ui_extensions": { "settings_view": "SettingsView.qml" },
"config_schema": [
{ "key": "appid", "label": "AppID", "type": "string", "default": "" },
{ "key": "api_key", "label": "API Key", "type": "string", "default": "" }
]
}启用后到设置页把它选为当前同传引擎;用户切入同传模式时宿主开始推流。
基类契约
必须实现(抽象方法):
python
def start_session(self, session_id="peer", source_lang="zh", target_lang="en",
voice=None, tts_enabled=False) -> bool
"""开启一条同传会话(建长连接并准备推流)。"""
def feed_audio(self, session_id: str, pcm_chunk: np.ndarray) -> None
"""灌入 16 kHz 单声道 PCM 帧(float32 或 int16)。"""
def stop_session(self, session_id: str = "peer") -> None
"""发结束帧并优雅关闭会话。"""
def is_active(self, session_id: str = "peer") -> bool
"""会话是否处于连接就绪 + 推流状态。"""向上吐结果(基类已实现,直接调):
python
self.emit_transcript(text, is_final=False, session_id="peer") # 原文
self.emit_translation(src, dst, is_final=False, session_id="peer") # 译文
self.emit_tts_audio(pcm_bytes, sample_rate=16000, session_id="peer") # 合成音频
self.emit_status(status, session_id="peer") # 'idle'|'connecting'|'streaming'|'error'
self.emit_error(message, session_id="peer")is_final=False 走打字机中间态(宿主边收边显示),True 为定稿。
兼容别名:
dispatch_transcript/dispatch_translation/dispatch_tts_audio/dispatch_status/dispatch_error与emit_*等价。
双轨会话 session_id
| 值 | 含义 |
|---|---|
"peer" | 上轨:对方 / 系统声音(入站同传) |
"self" | 下轨:我方麦克风(出站同传) |
宿主可能同时开两条会话。若你的底层协议不支持多会话,请在一条会话内部复用连接、 或按 session_id 分别建连。
音色
python
def list_voices(self) -> list[dict]: ... # 同传发音人列表
def voice_config_key(self, target_lang: str) -> str
"""按目标语言返回发音人配置键:中文 → 'voice_zh',其余 → 'voice_en'。"""
def get_voice_for(self, target_lang: str) -> str
"""取当前语向配置的发音人 ID(未配置返回空串)。"""发音人按语种分档(别把中文音色用在英文译文上,会出怪声);配置键就是上面两个。
注意
- 推流是实时热路径:
feed_audio必须快速返回,不要在里面做阻塞 IO / 重计算。 stop_session要真的关连接并释放线程;宿主在停止同传、切换引擎、退出应用时都会调它。- 会话状态用
emit_status如实上报,用户界面据此显示「连接中 / 翻译中 / 出错」。
参考实现
extensions/community_cloud_xunfei_si/(含自定义 SettingsView.qml)。
