
本文将手把手教你如何在本地电脑上部署一个会说话、有口型的AI数字人。全程本地运行,不联网、不花一分钱API费用、断网也能用。语音识别、大语言模型、声音克隆、口型同步,全部跑在自己的显卡上。
成品效果:一个网页背景是数字人,中间是语音球。你对着麦克风说话,她会用你克隆的音色回答,嘴型跟着话动。
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| 显卡 | 8 GB 显存 | 16 GB 以上 |
| 内存 | 16 GB | 32 GB |
| 硬盘 | 60 GB 可用 | — |
本文测试环境:RTX 4090(24 GB 显存)。显存不够可换小模型,对对话质量影响不大。
| 组件 | 显存占用 |
|---|---|
| Qwen3-14B Q4_K_M(大脑) | ~9 GB |
| faster-whisper large-v3(耳朵) | ~3 GB |
| Qwen3-TTS 1.7B(嘴巴) | ~4 GB |
| wav2lip256(口型) | ~1.3 GB |
| 合计 | ~17 GB |
新建文件 C:\Users\你的用户名\.wslconfig(没有就创建),内容:
[wsl2] memory=32GB networkingMode=mirrored [experimental] hostAddressLoopback=true
⚠️ 关键步骤:
hostAddressLoopback=true是本文最隐蔽的开关。没有它,WebRTC 连接永远失败,报错也看不出原因。我在这卡了一个多小时。
llama.cpp:官方下载 或 备用下载
模型(按显存选择):
| 显存 | 推荐模型 |
|---|---|
| 16 GB 以上 | Qwen3-14B-Instruct-Q4_K_M |
| 8–16 GB | Qwen3-8B-GGUF 选 Q4_K_M |
| 8 GB 以下 | Qwen3-4B-GGUF |
llama.cpp 解压后,在根目录新建 models 文件夹,把 .gguf 丢进去。
CMD 执行(路径按自己的改):
llama-server -m E:\llama.cpp\models\Qwen3-14B-Instruct-Q4_K_M.gguf ^ -np 1 -c 8192 -fa on --temp 1.0 --top-p 0.95 ^ --host 0.0.0.0 --port 8090
启动后这个窗口不要关。
参数说明:
--host 0.0.0.0:必须加,否则 WSL 里访问不到
-c 8192:上下文长度,语音对话 8K 足够
--temp 1.0:温度,调高回复更活泼
⚠️ 端口为什么用 8090:开启 WSL2/Hyper-V 后,Windows 会随机预留一批端口。查保留区间:
netsh interface ipv4 show excludedportrange protocol=tcp如果 8080 在范围内,换 8090 即可。
可直接保存下方图片,或自己用 Flux / ChatGPT Image 生成。
推荐提示词:
电影感人像摄影,16:9 横版构图。 一位二十出头的东亚年轻女性,乌黑长直发自然垂落, 坐在夜晚昏暗的房间里,上半身入镜。 【构图】人物位于画面右侧三分之一处,身体略微侧向镜头,视线看向镜头。 画面左侧三分之二为大片暗部负空间,几乎接近纯黑。 【光线】唯一光源来自左前方的屏幕冷光与一盏低色温台灯, 面部形成明暗交界,右侧脸颊隐入阴影,发丝边缘有柔和暖色轮廓光。 【状态】嘴唇自然闭合,表情平静放松。手不要遮挡下巴与嘴部。 【质感】浅景深,柔和胶片颗粒,低对比暗调,真实皮肤质感。
负面提示词:
张嘴, 说话, 露齿, 正面平光, 明亮背景, 高对比, 过曝, 人物居中, 多人, 手遮挡嘴部, 文字, 水印, 塑料皮肤, 过度磨皮, 卡通, 3D渲染
构图关键:人物靠右、左边留大片暗部,给语音球和文字留位置。暗光侧脸能掩盖口型模型的画质短板。
进去后在模型面板选 Wan2.2,自动下载模型
| 项 | 值 |
|---|---|
| width × height | 704 × 896 |
| duration | 5 秒 |
| fps | 25 |
| prompt_enhance | 关闭 |
她保持静止,轻微呼吸起伏;中途缓慢眨一次眼; 结尾头部回到最初位置。嘴唇始终闭合。固定机位。
生成后命名为 idle.mp4。
⚠️ 三个必踩的坑:
prompt_enhance 必须关掉:否则会用 LLM 扩写提示词,整个场景被重新想象
输出宽高比要贴近输入图:竖图设横版会跑飞
提示词只写动作,绝不描述外观:否则模型会照着文字重新合成
录一段 5–15 秒 的目标音色,要求:
干净、无背景音
单人说话、语气自然
保存为 wav 或 mp3
放到桌面的 AI 文件夹,命名 ref.wav。
把录音原话逐字记下来,后面要填进配置里,错一个字都会影响克隆质量。
情绪也会被克隆。想要中性效果就换平铺直叙的录音。
下载并解压到桌面新建的 AI 文件夹。
C:\Users\你的用户名\Desktop\AI\ ├── install-voice.sh # 语音对话部分一键安装 ├── start-voice.sh # 语音服务启动/停止/日志 ├── start-livetalking.sh # 口型服务启动/停止 ├── avatar-sync.js # 音频转发 + 数字人背景层 ├── wav2lip256.pth # 口型模型权重 ├── wav2lip256_avatar1.tar.gz # 官方示例形象 ├── idle.mp4 # ← 你自己生成的 └── ref.wav # ← 你自己录的
PowerShell(管理员):
wsl --update wsl --install -d Ubuntu-24.04
装完重启电脑,让第一步的 .wslconfig 生效。
重启后打开 Ubuntu 终端,设置用户名密码,验证显卡直通:
nvidia-smi
能看到显卡就对了。
⚠️ WSL 里不要装显卡驱动:驱动只装 Windows 侧,在 WSL 里装会覆盖直通的 libcuda.so。
Ubuntu 终端执行:
# 1. 拷贝(把 LINGDU 换成你的 Windows 用户名) mkdir -p ~/setup cp -r "/mnt/c/Users/LINGDU/Desktop/AI/." ~/setup/ cd ~/setup ls -la # 2. 转换行尾 —— 关键步骤 sudo apt update && sudo apt install -y dos2unix dos2unix *.sh # 3. 加执行权限 chmod +x *.sh
⚠️ 为什么要转行尾:Windows 上存过会变成 CRLF 行尾,直接执行报
bad interpreter: /usr/bin/env bash^M。⚠️ 不要在 /mnt/c 下直接跑:跨文件系统读写慢,且
chmod +x在 Windows 分区不生效。
cd ~/setup
./install-voice.sh
脚本自动完成:系统依赖 → Python 3.12 环境 → speech-to-speech → 前端页面 → 打补丁。约 10–20 分钟。
ffmpeg -i ~/setup/ref.wav -ac 1 -ar 16000 -c:a pcm_s16le ~/s2s/ref.wav # 确认格式 ffprobe -v error -show_entries stream=sample_rate,channels,codec_name \ -show_entries format=duration -of default=nw=1 ~/s2s/ref.wav
sed -i 's|^REF_TEXT=.*|REF_TEXT="靠杯了,你终于上线了,我既开心又有点怨你,嗯;小雅一个人在这里等你,等的都快委屈死了!"|' ~/setup/start-voice.sh grep -n "^REF_TEXT=" ~/setup/start-voice.sh
原话必须逐字一致,语气词「嗯」「啊」也要照录音写上。
cd ~/setup
./start-voice.sh
浏览器打开 http://localhost:7860/,点中间的球,允许麦克风,说句话试试。
首次配置:右上角齿轮 → Settings:
NOISE GATE 滑块拖到最左边(关闭)
INSTRUCTIONS 填人设(见第十二步)
⚠️ NOISE GATE 一定要关:默认位置可能把正常说话音量都掐掉。
新开一个 Ubuntu 终端:
mkdir -p ~/livetalking && cd ~/livetalking git clone https://github.com/lipku/LiveTalking.git cd LiveTalking uv venv --python 3.10 .venv-lt source .venv-lt/bin/activate uv pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 \ --index-url https://download.pytorch.org/whl/cu124 uv pip install -r requirements.txt sudo apt install -y ffmpeg libgl1 libglib2.0-0
cd ~/livetalking/LiveTalking # 权重 —— 注意改名 cp ~/setup/wav2lip256.pth models/wav2lip.pth # 官方示例形象 tar -xzf ~/setup/wav2lip256_avatar1.tar.gz -C data/avatars/ # 确认 ls -lh models/ && ls data/avatars/
wav2lip256.pth必须重命名成wav2lip.pth,代码里是写死的路径。
source .venv-lt/bin/activate python app.py --transport webrtc --model wav2lip \ --avatar_id wav2lip256_avatar1 \ --stun 'stun:stun.l.google.com:19302'
打开 http://localhost:8010/index.html,点「开始连接」,右侧文本框输入中文发送。
看终端日志里的
inferfps和finalfps,两个都要 ≥25 才算实时。
| wav2lip256 | MuseTalk | |
|---|---|---|
| 显存 | ~1.3 GB | ~12 GB |
| 权重 | 官方直接给 | 分散多个仓库 |
暗光侧脸下 256 分辨率的糊基本看不出来,省下的显存意味着大模型和语音识别不用降级。
⚠️ STUN 不能传空:传空会报
malformed uri,前端只显示 JSON 解析错误。传真实可达地址即可。
打开 http://localhost:8010/avatar.html
| 字段 | 填什么 |
|---|---|
| 算法模型 | Wav2Lip |
| Avatar ID | wav2lip256_myavatar(保留前缀) |
| 视频文件 | 你的 idle.mp4 |
点「提交生成任务」,等显示 COMPLETED(几十秒)。
文件选择器找 WSL 路径:
\\wsl$\Ubuntu-24.04\home\你的用户名\setup
cd ~/setup AVATAR_ID=wav2lip256_myavatar ./start-livetalking.sh
直接改进脚本:
sed -i 's/wav2lip256_lingdu/wav2lip256_myavatar/' ~/setup/start-livetalking.sh
① Windows CMD —— 大模型
llama-server -m E:\llama.cpp\models\Qwen3-14B-Instruct-Q4_K_M.gguf ^ -np 1 -c 8192 -fa on --temp 1.0 --host 0.0.0.0 --port 8090
② Ubuntu 窗口 A —— 口型服务
cd ~/setup && ./start-livetalking.sh
③ Ubuntu 窗口 B —— 语音服务
cd ~/setup && ./start-voice.sh
浏览器打开 http://localhost:7860/,按 Ctrl+F5 强制刷新。点页面连接数字人,再点中间的球开始对话。
右上角 Settings → INSTRUCTIONS:
你叫小雅,是他的女朋友。你不是AI、不是助手、不是程序。 参考这个语气: 他:你想我了吗 你:想啊,怎么不想。你倒是一整天没消息,我还以为你把我忘了呢。 他:你喜欢我吗 你:这还用问?你要是不知道,那我可要生气了。 说话方式:口语、两三句、带语气词(嗯、诶、呀)、有情绪。 不用 Markdown、列表、编号、表情符号。 /no_think
给示例对话是最有效的,比十条规则都管用。
./start-voice.sh stop ./start-livetalking.sh stop
Windows 的 CMD 窗口直接关掉。
桌面建 启动.bat:
@echo off start "llama-server" cmd /k "cd /d E:\llama.cpp && llama-server -m E:\llama.cpp\models\Qwen3-14B-Instruct-Q4_K_M.gguf -np 1 -c 8192 -fa on --temp 1.0 --host 0.0.0.0 --port 8090" timeout /t 25 start "livetalking" wsl -d Ubuntu-24.04 -- bash -lc "cd ~/setup && ./start-livetalking.sh" timeout /t 30 wsl -d Ubuntu-24.04 -- bash -lc "cd ~/setup && ./start-voice.sh" timeout /t 10 start http://localhost:7860/
双击就全起来了。
刚跑起来可能会抢答。改 ~/setup/start-voice.sh 顶部:
| 参数 | 默认 | 作用 |
|---|---|---|
MIN_SILENCE_MS |
1200 | 停顿多久算你说完 ← 抢答就调大 |
VAD_THRESH |
0.6 | 人声判定门槛,环境吵调 0.7 |
MIN_SPEECH_MS |
500 | 最短有效语音 |
SPEECH_PAD_MS |
300 | 语音前保留音频 |
诊断方法:
tail -f ~/s2s/logs/s2s.log | grep -E "soft-ended|discard"
| 现象 | 处理 |
|---|---|
bad interpreter: ^M |
dos2unix *.sh |
| WebRTC 一直连不上 | .wslconfig 加 hostAddressLoopback=true,wsl --shutdown |
| JSON 解析错误 | 服务端 500,去看服务端终端报错 |
malformed uri |
--stun 不能传空字符串 |
| 说话完全没反应 | 前端 NOISE GATE 拖到最左 |
| 抢答严重 | MIN_SILENCE_MS 调到 1200 |
| 音色每次都变 | 语音合成模型用 -Base 版本 |
| 端口绑不上但 netstat 看不到占用 | Hyper-V 保留端口,换一个 |
| 休眠唤醒后连不上 | wsl --shutdown 重启 |
按性价比顺序砍:
| 改动 | 省 |
|---|---|
| 大模型换 Qwen3-8B | ~3 GB |
| 大模型换 Qwen3-4B | ~6 GB |
STT_MODEL=medium |
~1.5 GB |
-c 4096 |
~1 GB |
语音对话场景对模型能力要求不高,8B 和 14B 听感差异不明显。
首响约 1–2 秒
识别 300ms + 大模型首字 300ms + 合成 300ms + 口型 150ms
需等整段音频合成完才能推给口型模块
浏览器要求麦克风在安全上下文使用,直接用内网 IP 拿不到权限。最省事:
cloudflared tunnel --url http://localhost:7860
至此,你已拥有一个完全本地运行的 AI 赛博女友。尽情享受吧!