事情的起因比较直接:联机时想用角色声线说话。市面上的变声器要么只能套预设音色,要么延迟高到没法用,于是决定自己搭一条完整的链路:录音 → 识别 → 翻译 → 合成 → 输出到游戏语音。整体思路并不复杂,复杂的是把各环节稳定地串起来。

链路设计

处理流程分为四段:

  • 录音:按住热键说话,松手后开始处理
  • 识别(ASR):语音转文字
  • 翻译:中文转日语
  • 合成:GPT-SoVITS 生成语音,同时输出到耳机与虚拟声卡

每一段都有现成的开源方案,主要工作集中在选型、集成和排错上。

模型与选型

  • 识别:FunASR 的 SenseVoiceSmall,中/日文都能识别,CPU 即可运行。模型加载约 4 秒,识别一段 2~3 秒的语音约 0.2 秒。对比了几个方案后,这个在速度与准确率之间最均衡。
  • 翻译:DeepL API,个人免费额度足够。密钥放在本地配置文件中,不写入代码或仓库。
  • 合成:GPT-SoVITS 本地 API。音色使用 galgame 角色崩月水仙的语音素材,自行训练了 40 轮。首次启动需要加载 BERT 等模型,纯 CPU 环境大约需要一到两分钟,因此程序会先拉起服务并轮询端口,就绪后才允许输入,避免第一句就失败。
  • 音频:sounddevice 负责录音,soundfile 负责解码,播放时同时推送到默认声卡和 VB-Cable 虚拟声卡,保证本地监听与游戏语音通道互不干扰。

集成过程中遇到的问题

  • PyTorch 自带 DLL 与 PyQt 的 OpenMP 运行库冲突,程序启动即崩溃。解决方式是在加载 PyQt 之前先 import torch,并将 torch/lib 目录置于 PATH 最前面。
  • Windows 控制台默认使用 GBK 编码,日志包含日文时会报编码错误。在 start.bat 中设置 PYTHONUTF8=1 后解决。
  • SenseVoice 的识别结果包含 <|zh|> 之类的标签,翻译前需要先用正则清理,否则会连同标签一起送入翻译接口。
  • VB-Cable 需要管理员权限安装驱动。程序内置了设备检测、驱动下载与安装引导,首次使用会弹出 UAC 确认。
  • 热键默认绑定鼠标侧键,按住说话、松手处理,也可以在设置中重新捕获。

最终功能

  • 按住热键说话,松手后自动完成 识别 → 翻译 → 合成 → 播放
  • 支持文字输入:中文自动翻译为日语后合成,日文直接合成,自动判断语言
  • 双路输出:本地耳机 + 游戏语音通道
  • 状态面板展示 ASR / 翻译 / 合成三个服务的状态与延迟,录音电平提供 VU 表
  • 识别原文、翻译结果与历史记录保留在界面中
  • 日志自动轮转,避免长期运行占用过多磁盘

延迟情况

单次完整流程实测:识别约 0.3 秒,翻译约 1 秒,合成 1~5 秒(取决于句子长度)。因此该工具属于“按下说话、松开等待、然后以角色声线播放”的交互方式,并非严格意义上的实时变声。若要实现边说话边输出,需要引入流式合成或 GPU 推理,属于后续迭代方向。

整个项目基于 Python 与开源模型搭建,除 DeepL 免费额度外没有额外成本。对于想自行搭建的人,链路选型可以参考上文,实际工作中大部分时间消耗在环境与依赖问题上。代码目前自用,待路径与配置整理干净后再考虑开源。