桌面语音对话L2D虚拟人物本地化部署 (ASR + LLM + TTS串联)

1,134 阅读4分钟

所有模型都使用本地化部署,可断网独立运行

参考环境:

  • 操作系统:Windows11
  • CPU:12400
  • 显卡:AMD 6750XT

模型解决方案:

代码仓库:aides

使用electron + l2d作为虚拟形象实现方案

实现效果

img_1.png 通过麦克风讲话,在用户讲完话之后,虚拟人物会展示回答文本及语音。

ASR

nodejs调用库:sherpa-onnx-node

模型来源:models

示例代码:nodejs-addon-examples

部署步骤:

  1. 从示例中选择自己需要的代码,复制到本地文件中
  2. 从模型来源中下载自己需要的语音模型(中文或中英文混合)
  3. 将示例代码中的模型路径及tokens路径改为自己下载的路径
// 该示例需要修改encoder、decoder、joiner、tokens四个路径
function createOnlineRecognizer() {
    const config = {
        'featConfig': {
            'sampleRate': 16000,
            'featureDim': 80,
        },
        'modelConfig': {
            'transducer': {
                'encoder': path.join(__dirname, 'model/encoder-epoch-11-avg-1.onnx'),
                'decoder': path.join(__dirname, 'model/decoder-epoch-11-avg-1.onnx'),
                'joiner': path.join(__dirname, 'model/joiner-epoch-11-avg-1.onnx'),
            },
            'tokens': path.join(__dirname, 'model/tokens.txt'),
            'numThreads': 2,
            'provider': 'cpu',
            'debug': 1,
        },
        'decodingMethod': 'greedy_search',
        'maxActivePaths': 4,
        'enableEndpoint': true,
        'rule1MinTrailingSilence': 2.4,
        'rule2MinTrailingSilence': 1.2,
        'rule3MinUtteranceLength': 20,
    };

    return new sherpa_onnx.OnlineRecognizer(config);
}

LLM

LLM方面使用deepseek 8b模型(能够使用的最大模型与你电脑的显卡显存有关)。部署方面使用LM Studio进行部署,这种部署方式最为简单,可参考视频可能是最简单的DeepSeek R1本地运行教程进行部署。

需要注意的是,AMD显卡用户一定要看参考视频去进行部署。

在下载后模型后,需要到开发者界面开启llm接口服务,以便我们使用代码进行访问。

img.png

TTS

在asr中使用的Kaldi也可以提供tts解决方案,但该项目需要定制化音色与情感,在这方面GPT-SoVITS有着更出色的表现。

GPT-SoVITS主要由两部分构成:模型训练与语音推理。在模型训练当中,需要我们提供几分钟不等的干音数据及对应文本训练模型;在语音推理中,需要用到训练好的模型, 配合上参考语音片段(几秒即可,可用于生成不同感情)及 该参考语音对应文本,再加上需要生成语音的文本,即可生成对应的语音。

基础模型方面可以使用开源社区提供的训练好的模型;参考语音及对应文本可以去各类Wiki、论坛或者录音获得;GPT-SoVITS并没有提供打包好的应用供我们直接使用, 需要下载GPT-SoVITS整合包获得项目源码。在整合包内部直接集成了python环境及相关依赖, 可以直接进行部署,并通过接口进行访问。

在GPT-SoVITS源码中需要注意到,在每次要生成语音的时候,原始代码都要对参考语音及对应文本进行处理,而这里会耗费约1s左右的时间。而才使用中我们更倾向于使用一种固定的音色, 因此可以根据个人需求,修改原始代码,将参考语音及对应文本的处理部分放在应用开始时,可以起到加速生成语音的效果。

串联实现

arides.png

整体流程如上图所示。需要重点提到的是,处理deepseek返回的文本中最好进行分割,这样可以一边生成语音银边播放。如果直接将大段文本直接发送给TTS模块, 会造成整体极高的延时。

l2d模型来自live2d。据该官方介绍,l2d可以接收音频buffer进行口型同步,但我在实验中并没有获得预期中的反应。 目前暂还不清楚其中的实现机理。

后记

目前主流模型对于AMD显卡用户并不友好,因为大部分模型都需要用到NVIDIA显卡硬件中的cuda模块,但幸运的是deepseek可以用到AMD显卡能力。在该实现方案中,ASR与TTS使用CPU进行推理,在该种情况下, 依然能得到比较良好对话体验,有兴趣的开发者可以研究目前开源技术能达到的整体效果。

虽然在本文中使用主流开源方案进行串联,能得到客观的效果。但我认为以后得整体出路是是通过语音直接到语音, 因为在串联流程中,每一步都会损失的信息,损失的信息来源自我们人说话中的语气、情感、音色、上下文等。这些因素都会影响我们在语音对话中的可能性。

希望在未来的发展中能看到语音对话真正走入平民百姓的日子。