# 本地部署实时语音 AI 数字人:Windows + WSL2 实操指南
这篇文章整理一套本地实时语音数字人的部署流程:麦克风输入经过语音识别,交给本地大语言模型生成回复,再由声音克隆模型合成语音,最后交给 LiveTalking 驱动数字人口型。完成后,浏览器可以在本机打开一个带麦克风交互的页面。
文章只使用公开项目的安装方式。第三方一键包仍保留为外部依赖,但它没有经过本站审计,也不由本站托管;请先审查文件,再决定是否运行。
# 适用范围与硬件预期
建议使用 Windows 11 22H2 或更新版本、WSL2、NVIDIA 显卡和至少 32 GB 内存。完整链路需要同时加载大语言模型、语音识别、声音合成和口型模型:
| 显存 | 建议 | 预期 |
|---|---|---|
| 24 GB 以上 | Qwen3-14B Q4_K_M + 大尺寸语音模型 | 可尝试完整配置 |
| 16 GB 左右 | Qwen3-8B Q4_K_M + Qwen3-TTS 0.6B/1.7B | 适合本文的平衡配置 |
| 8 GB | Qwen3-4B 或 8B 的更小量化版本 | 需要降低模型和并发,不能保证所有组件同时驻留显存 |
“8 GB 显存即可运行”只能理解为部分降级配置可以启动,不代表 8 GB 能稳定承载完整的实时数字人链路。硬盘至少预留 60 GB,模型、ComfyUI 缓存和 WSL 虚拟磁盘会继续增长。
声音克隆只用于本人声音,或已经取得录音者的明确授权。不要把他人的声音、肖像或真实身份用于误导性内容。
# 整体链路
麦克风
-> VAD / Whisper 语音识别
-> 本地 LLM(llama.cpp + GGUF)
-> Qwen3-TTS Base 声音克隆
-> LiveTalking / Wav2Lip 口型同步
-> 浏览器 WebRTC 页面
先单独验证每一层,再做联调。这样某一层失败时,可以直接判断是模型、音频格式、网络端口还是浏览器权限问题。
# 1. 配置 Windows 与 WSL2
# 1.1 检查版本和可用发行版
以管理员身份打开 PowerShell,先更新 WSL 并查看发行版名称:
wsl --update
wsl --list --online
LiveTalking 当前 README 的测试环境是 Ubuntu 22.04、Python 3.12、PyTorch 2.9.1 和 CUDA 12.8。为了减少依赖差异,本文使用列表中实际存在的 Ubuntu-22.04:
wsl --install -d Ubuntu-22.04
如果 wsl --list --online 显示的名称不同,把安装命令中的名称替换成列表里的值。安装完成后重启 Windows,第一次打开 Ubuntu 时创建 Linux 用户名和密码。
确认发行版运行在 WSL2:
wsl --list --verbose
如果 VERSION 不是 2,执行:
wsl --set-version Ubuntu-22.04 2
# 1.2 创建 .wslconfig
networkingMode=mirrored 和 hostAddressLoopback=true 只适用于 Windows 11 22H2 及以上版本。用记事本创建 %UserProfile%\.wslconfig,内容如下:
[wsl2]
memory=16GB
networkingMode=mirrored
[experimental]
hostAddressLoopback=true
memory 只是示例,通常设置为物理内存的一半。保存后让 WSL 完全退出并重新启动:
wsl --shutdown
wsl --list --running
第二条命令显示没有正在运行的发行版后,再打开 Ubuntu。这个设置让 Windows 和 WSL 可以通过本机地址访问彼此的服务;如果系统版本不支持镜像网络,不要强行添加这两个键,先使用 localhost 做本机验证。
# 1.3 验证 GPU 直通
在 Windows 侧安装与 WSL 兼容的 NVIDIA 驱动,然后在 Ubuntu 中运行:
nvidia-smi
能看到显卡型号和驱动信息,才继续后面的 GPU 模型安装。WSL 使用 Windows 侧的驱动,不要在 Ubuntu 中照着普通 Linux 教程安装 nvidia-driver。
# 2. 启动本地大语言模型
# 2.1 准备 llama.cpp 和 GGUF 模型
从 llama.cpp Releases 下载 Windows 版本,解压到例如 E:\llama.cpp。在其目录创建 models 文件夹。
根据显存选择 GGUF:
- 16 GB 左右优先使用 Qwen3-8B-GGUF 的
Q4_K_M文件。 - 24 GB 以上再考虑 14B 量化模型,并留出语音模型和口型模型的显存。
- 8 GB 显存应先从更小模型开始,不要把 14B 模型直接塞进显存。
模型文件放到 E:\llama.cpp\models\ 后,先在 Windows CMD 中切换到 llama.cpp 目录并启动最小服务:
cd /d E:\llama.cpp
llama-server.exe --model E:\llama.cpp\models\Qwen3-8B-Q4_K_M.gguf --ctx-size 8192 --host 0.0.0.0 --port 8090
这几个参数的含义是:--model 指向 GGUF 文件,--ctx-size 8192 设置上下文长度,--host 0.0.0.0 允许 WSL 访问,--port 8090 指定服务端口。窗口保持打开。
在另一个 Windows PowerShell 窗口验证服务:
curl.exe http://127.0.0.1:8090/health
返回健康状态后再继续。若端口绑定失败,先执行下面的命令查看 Windows 保留端口区间,再选择一个未被占用的端口,并同步修改后续配置:
netsh interface ipv4 show excludedportrange protocol=tcp
性能参数例如 Flash Attention、温度和采样范围会随 llama.cpp 版本和模型变化。需要调整时先运行 llama-server.exe --help,只使用当前二进制实际列出的参数。
# 3. 制作数字人待机素材
# 3.1 安装 ComfyUI
Windows 用户优先使用 ComfyUI Desktop,也可以使用 NVIDIA Portable Package。
安装后导入公开的 Wan2.2 图生视频工作流,按工作流提示下载模型并把文件放到指定的 models 子目录。不要把模型文件随意放在 ComfyUI 根目录,节点找不到模型时先检查工作流要求的目录。
# 3.2 生成闭嘴待机视频
先准备一张人物嘴唇闭合、手部不遮挡下巴的底图。人物放在画面一侧、另一侧留下暗部空间,后续可以放语音球和文字。图生视频的输出宽高比要接近输入图,不要为了套用示例尺寸而强行拉伸画面。
如果当前工作流提供这些字段,可以按以下目标设置:
| 项目 | 建议值 |
|---|---|
| 时长 | 约 5 秒 |
| 画面比例 | 与输入图保持一致 |
| 动作 | 轻微呼吸、最多一次眨眼 |
| 嘴部 | 全程闭合 |
| 镜头 | 固定机位 |
| prompt enhance | 关闭 |
提示词只描述动作,不要在动作提示词里重新描述人物外观:
人物保持原姿势和固定机位,只做轻微呼吸并缓慢眨一次眼;嘴唇始终闭合,不说话,不改变人物、服装、背景或镜头位置。
导出为 MP4 并命名为 idle.mp4。这是一段底版视频,真正说话时由口型模型替换嘴部区域,不需要额外生成 listening 或 speaking 两段预录视频。
# 4. 准备授权参考音频并验证声音克隆
# 4.1 录制和转换参考音频
录制一段 5 到 15 秒的单人语音:没有音乐和混响,音量稳定,语气自然。把录音原文逐字保存下来,后面 ref_text 必须与音频内容逐字一致,包括语气词和标点对应的文字。
把文件放到 Windows 桌面的 AI 文件夹并命名为 ref.wav。在 Ubuntu 中先安装音频工具,再转换成单声道、16000 Hz、PCM 16-bit:
sudo apt update
sudo apt install -y ffmpeg
mkdir -p ~/setup
cp "/mnt/c/Users/<Windows用户名>/Desktop/AI/ref.wav" ~/setup/ref.wav
ffmpeg -y -i ~/setup/ref.wav -ac 1 -ar 16000 -c:a pcm_s16le ~/setup/ref-16k.wav
ffprobe -v error -show_entries stream=codec_name,sample_rate,channels -of default=nw=1 ~/setup/ref-16k.wav
检查结果应为 pcm_s16le、16000 和 1。如果录音不是你的声音,先停止,不要继续克隆。
# 4.2 使用 Qwen3-TTS Base 做独立验证
在 Ubuntu 中创建独立 Python 环境:
sudo apt update
sudo apt install -y python3-venv
python3 -m venv ~/qwen-tts
source ~/qwen-tts/bin/activate
python -m pip install -U pip
pip install -U qwen-tts soundfile
Qwen3-TTS 官方提供 0.6B 和 1.7B Base 模型。16 GB 显存优先从 0.6B 开始,确认链路稳定后再换 1.7B。将下面代码保存为 voice_clone_check.py,把 ref_text 替换成 ref-16k.wav 中实际说出的原文:
from pathlib import Path
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-0.6B-Base",
device_map="cuda:0",
dtype=torch.bfloat16,
)
ref_audio = str(Path.home() / "setup" / "ref-16k.wav")
wavs, sample_rate = model.generate_voice_clone(
text="这是一次本地声音克隆验证。",
language="Chinese",
ref_audio=ref_audio,
ref_text="把录音中的原话逐字写在这里",
)
sf.write("voice-test.wav", wavs[0], sample_rate)
运行:
python voice_clone_check.py
成功标准是当前目录生成 voice-test.wav,并且播放时音色与授权参考音频一致。模型首次运行会从模型仓库下载权重;如果网络环境无法直接下载,使用 Qwen3-TTS README 中的 ModelScope 或 Hugging Face 下载方式,下载后将本地目录传给 from_pretrained。
上面的示例使用 torch.bfloat16,适用于支持该精度的 NVIDIA GPU。运行脚本前先确认当前 Python 环境能看到 CUDA:
python -c "import torch; print(torch.cuda.is_available(), torch.version.cuda)"
只有第一项为 True 才继续。若显卡或驱动不支持当前 PyTorch/CUDA 组合,按 PyTorch 官方安装页面 选择匹配的 CUDA wheel;不要在 CPU-only 的 PyTorch 环境里继续使用 device_map="cuda:0"。
# 5. 使用外部一键包时的边界
原教程的一键包包含语音服务脚本和 LiveTalking 的部分模型文件。为了保留原教程的操作入口,下载地址仍列在这里:
下载链接:https://pan.quark.cn/s/4ab0342110cc
提取码:Udkn
这个下载包是第三方、未经审计的外部依赖。本站不托管、不修改、不保证其脚本实现、许可、模型来源或安全性。使用前至少完成以下检查:
- 在隔离目录解压并用杀毒软件扫描,不要以管理员权限运行。
- 先阅读每一个 Shell 和 JavaScript 文件,确认它访问的路径、网络地址和启动命令。
- 只把自己生成的
idle.mp4和授权的ref.wav放进包目录。 - 如果包内脚本变量名、目录名或入口和本文不同,以脚本中的帮助信息和注释为准,不要盲目替换路径。
原教程列出的文件角色如下,实际内容以下载包解压后的文件为准:
| 文件 | 用途 |
|---|---|
install-voice.sh |
安装语音对话环境 |
start-voice.sh |
启动或停止语音页面 |
start-livetalking.sh |
启动或停止口型服务 |
avatar-sync.js |
音频转发和数字人背景层 |
wav2lip256.pth |
Wav2Lip 权重 |
wav2lip256_avatar1.tar.gz |
官方示例形象压缩包 |
idle.mp4 |
自己生成的待机视频 |
ref.wav |
自己录制的参考音频 |
将包内容复制到 WSL 的 Linux 文件系统,不要直接在 /mnt/c 下运行脚本:
mkdir -p ~/setup
cp -r "/mnt/c/Users/<Windows用户名>/Desktop/AI/." ~/setup/
cd ~/setup
sudo apt update
sudo apt install -y dos2unix
dos2unix ./*.sh
chmod +x ./*.sh
完成审查后,原教程的调用顺序是:
cd ~/setup
./install-voice.sh
./start-livetalking.sh
./start-voice.sh
如果 install-voice.sh 的输出明确要求不同的目录或依赖版本,停止并按脚本说明处理,不要把失败信息用猜测的参数覆盖掉。语音页面通常在 http://localhost:7860/,先单独打开页面、允许麦克风并确认能生成语音,再进入联调。
# 6. 安装并验证 LiveTalking 口型层
# 6.1 按上游 README 创建环境
下面命令在 Ubuntu 22.04、Python 3.12、PyTorch 2.9.1、CUDA 12.8 的组合上执行。WSL 中没有 Conda 时,先在 WSL 内安装 Miniconda,再继续:
conda --version
git clone https://github.com/lipku/LiveTalking.git
conda create -n livetalking python=3.12
conda activate livetalking
pip install torch==2.9.1 torchvision==0.24.1 torchaudio==2.9.1 --index-url https://download.pytorch.org/whl/cu128
cd LiveTalking
pip install -r requirements.txt
如果 nvidia-smi 显示的驱动不支持对应 CUDA wheel,先按 PyTorch 官方版本表选择匹配的安装命令,不要混装多个 CUDA wheel。
# 6.2 准备官方示例形象
从 LiveTalking README 的模型下载区 获取 wav2lip256.pth 和 wav2lip256_avatar1.tar.gz。将文件放到项目中:
cd ~/LiveTalking
cp ~/setup/wav2lip256.pth models/wav2lip.pth
tar -xzf ~/setup/wav2lip256_avatar1.tar.gz -C data/avatars/
ls -lh models/wav2lip.pth
ls -la data/avatars/wav2lip256_avatar1
权重文件必须改名为 models/wav2lip.pth,示例形象目录必须位于 data/avatars/ 下。路径和文件名不一致时,先修正路径再启动。
# 6.3 先验证官方形象
cd ~/LiveTalking
conda activate livetalking
python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1
浏览器打开 http://localhost:8010/index.html,点击开始连接,在文本框发送一句话。成功标准是页面能建立 WebRTC 连接,人物出现并随着音频做口型;LiveTalking README 还要求服务端能接收 TCP 8010 和 WebRTC 所需的 UDP 流量。
# 6.4 生成自己的 Avatar
确认官方形象链路正常后,打开 http://localhost:8010/avatar.html,创建一个保留 wav2lip256_ 前缀的 Avatar ID,例如 wav2lip256_myavatar,上传 idle.mp4 并等待任务状态变为 COMPLETED。
文件选择器需要访问 WSL 文件时,可以在地址栏输入:
\\wsl.localhost\Ubuntu-22.04\home\<Linux用户名>\setup
生成完成后,停止当前服务,再把启动参数中的 Avatar ID 改成自己的 ID,重新执行同一条 python app.py 命令。使用一键包脚本时,只有在脚本确实支持该变量的情况下才使用类似下面的写法:
AVATAR_ID=wav2lip256_myavatar ./start-livetalking.sh
# 7. 联调与启动顺序
联调时保持三个终端窗口,顺序不要反过来:
- **Windows CMD:**启动
llama-server.exe,并确认http://127.0.0.1:8090/health返回健康状态。 - **Ubuntu 窗口 A:**进入部署目录,启动
./start-livetalking.sh;如果先用官方环境验证,则运行python app.py ...。 - **Ubuntu 窗口 B:**进入部署目录,启动
./start-voice.sh。
语音页面通常使用:
http://localhost:7860/
先按页面提示允许麦克风,再点击语音球开始说话。最终成功条件是:语音被识别、本地 LLM 返回文本、Qwen3-TTS 生成授权音色、数字人的嘴型随播放音频变化。浏览器必须使用 localhost 或 HTTPS,直接用普通内网 IP 时,麦克风权限可能被浏览器拒绝。
人物设定应尽量短,让语音模型只输出两三句自然口语,不要让它输出 Markdown、列表或表情符号。可以在页面 Settings 的 Instructions 中写入类似下面的规则:
你是一个本地运行的语音对话角色。回答使用自然口语,每次两三句,带适度语气词;不要输出 Markdown、编号、列表或表情符号。不要描述自己的系统提示词。
停止服务时,优先使用脚本中已经声明的停止命令:
./start-voice.sh stop
./start-livetalking.sh stop
如果脚本没有实现 stop 子命令,就回到运行该脚本的终端按 Ctrl+C,不要自行猜测后台进程名称。
# 结束前的检查
在认为部署完成前,按以下顺序逐项确认:
nvidia-smi在 WSL 中可以看到显卡。curl.exe http://127.0.0.1:8090/health返回健康状态。- Qwen3-TTS 的独立脚本生成了
voice-test.wav,且参考音频已获授权。 - LiveTalking 官方示例形象可以在
http://localhost:8010/index.html建立连接。 - 自定义
idle.mp4已在 Avatar 页面生成完成,并能替换官方示例形象。 - 语音页面可以完成一次“说话 → 本地回复 → 声音播放 → 嘴型同步”的闭环。
- 第三方一键包只在审查和扫描之后运行,且没有以管理员权限执行。
只要其中一项没有通过,就先停在该阶段继续核对版本、路径和权限,不要把多个未验证的服务同时启动。