Skip to content

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)。


相关 ​

TransBox - 赋能全人类无界限跨语言交流