跳到主要内容
AI教程

如何在本地搭建 AI 数字人

想在自己的电脑上搭建一个能听、能说、有口型,能和你对话的 AI 数字人,并不用任何 AI 工具,或者花费昂贵的

如何在本地搭建 AI 数字人

想在自己的电脑上搭建一个能听、能说、有口型,能和你对话的 AI 数字人,并不用任何 AI 工具,或者花费昂贵的订阅费。把语音识别、本地大模型、声音合成和口型同步串起来,就能得到一套在本机运行的实时交互系统。

本文从硬件准备开始,带你在 Windows + WSL2 环境中完成整套部署。最终效果是:网页显示自定义的数字人,我们通过麦克风和AI数字人对话,AI 数字人会用你克隆的音色回答。

一、整套系统工作流程

这套方案不是由一个模型单独完成,而是部署多个组件:

其中,llama.cpp 负责运行本地语言模型;faster-whisper 把用户语音转成文字;Qwen3-TTS 根据参考音频生成回复声音;LiveTalking 与 Wav2Lip 则把声音变成与之匹配的嘴部动作。

二、硬件要求与显存预算

最低配置:

  • NVIDIA 显卡:8GB 显存

  • 内存:16GB

  • 可用硬盘:至少 60GB

  • 系统:Windows 10/11,并支持 WSL2

推荐配置:

  • NVIDIA 显卡:16GB 显存或更高

  • 内存:32GB 或更高

  • 建议使用 SSD 存放模型和 WSL 文件

以 Qwen3 14B 量化模型为例,显存大致会分配为:

  • 组件|参考显存占用

  • Qwen3-14B Q4_K_M|约 9GB

  • faster-whisper large-v3|约 3GB

  • Qwen3-TTS 1.7B|约 4GB

  • Wav2Lip 256|约 1.3GB

  • 合计|约 17GB

24GB 显存的显卡运行这套组合会更从容。16GB 显存可以换用 8B 模型并降低上下文长度;8GB 左右则建议从 4B 模型和中型语音识别模型起步。

三、配置 WSL2 网络与内存

1.  先在 Windows 用户目录创建 .wslconfig 文件:

C:\Users\你的用户名\.wslconfig

2. 填入以下内容:

[wsl2]
memory=32GB
networkingMode=mirrored

[experimental]
hostAddressLoopback=true

memory 可以按实际内存修改,通常分配物理内存的一半到四分之三即可。hostAddressLoopback=true 对本机 Windows 与 WSL 之间的 WebRTC 通信尤其重要,缺少它时,后面的 WebRTC 连接会永远失败,而且报错完全看不出原因,浏览器显示 JSON 解析错误,ICE 候选列表是空的。

3. 修改后,在 PowerShell 中执行:

wsl --shutdown

重新进入 WSL 后配置才会生效。

四、在 Windows 端启动本地大模型

1. 准备 llama.cpp

下载适用于 Windows 的 llama.cpp,并解压到固定目录,例如:

E:\llama.cpp

稳定版本下载地址:https://pan.quark.cn/s/0073852e4042

2. 按显存选择模型

  • 显存范围|建议模型|下载地址

  • 16GB 以上|Qwen3-14B-Instruct Q4_K_M|https://pan.quark.cn/s/f48c2144ac71

  • 8–16GB|Qwen3-8B GGUF Q4_K_M|https://pan.quark.cn/s/78b8643f1be3

  • 8GB 以下|Qwen3-4B GGUF|https://pan.quark.cn/s/fd588898ccbf

把下载好的 .gguf 文件放进:

E:\llama.cpp\models

3. 启动推理服务

在 Windows 命令提示符中运行:

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 --top-p 0.95 ^
  --host 0.0.0.0 --port 8090

几个参数的作用:

  • host 0.0.0.0 :允许 WSL 访问 Windows 端的模型服务;

  • c 8192 :设置上下文长度,短对话已经足够;

  • temp 1.0 :让回复不那么刻板;

  • port 8090 :指定服务端口。

这个命令窗口需要一直保持运行。如果提示端口被占用,但常规检查又看不到进程,可以查看 Hyper-V 是否预留了该端口:

netsh interface ipv4 show excludedportrange protocol=tcp

发现冲突时,最省事的办法是同时修改模型服务和调用脚本中的端口。

五、制作数字人底图与数字人视频

1. 先设计一张自己喜欢的数字人图片

数字人图片不能只追求“好看”,还要为后续网页布局与嘴型生成留空间。比较稳妥的构图是:

  • 画面比例使用 16:9;

  • 人物位于右侧三分之一处;

  • 左侧保留较大暗色留白,方便放交互光球与字幕;

  • 嘴唇自然闭合,不露齿;

  • 手不要挡住嘴、下巴和脸部轮廓;

  • 使用偏暗的侧光,降低口型区域轻微模糊带来的违和感。

可参考下面的提示词思路,自行替换人物、服装和场景:

电影感低照度侧面人像,一位成年女性坐在画面右侧,柔和轮廓光,
左侧保留大面积深色负空间,表情自然,嘴唇闭合,镜头固定,
真实皮肤质感,16:9 横向构图。

负面提示词可加入:张嘴、露齿、人物居中、明亮杂乱背景、手遮住嘴部、文字、水印、塑料皮肤、卡通风格。

2. 用 ComfyUI + Wan2.2 生成 5 秒数字人视频

下载安装 ComfyUI ,打开后选择 Wan2.2 的图生视频工作流,把底图作为首帧。建议第一次使用下面的保守参数:

  • 参数|建议值

  • 分辨率|以底图比例为准;原教程示例为 704 × 896

  • 时长|5 秒

  • 帧率|25 fps

  • Prompt Enhance|关闭

ComfyUI 下载地址:https://pan.quark.cn/s/bb9d21f1e724

提示词只描述动作,不要再次描述人物长相。例如:

人物保持原位,只有轻微呼吸,缓慢眨眼一次,头部做极小幅度自然移动后回到起始姿势,
嘴唇始终闭合,固定机位,无推拉摇移。

导出文件并命名为:idle.mp4

因为真正的说话口型会由 Wav2Lip 实时生成,所以不需要再额外制作“正在说话”、“正在倾听”等多套视频。

这里有几个常见误区:

  • 不要打开提示词增强,关闭 prompt_enhance ,否则模型可能重新设计人物或场景;

  • 输出比例必须与输入图片的比例保持一致。如果使用 16:9 横版底图,应换成工作流支持的横向尺寸,避免拉伸或裁掉人物;

  • 提示词只写动作,重复描述外貌反而容易让人物漂移;

  • 5 秒视频足够做循环待机,盲目拉长视频更容易出现重复或形变。

六、录制参考声音(声音克隆)

Qwen3-TTS 会根据参考音频模仿音色与说话状态。建议录制一段 5–15 秒的声音,要求如下:

  • 只有一个人说话;

  • 环境安静,无音乐和明显混响;

  • 语速自然,情绪与希望克隆出来的风格一致;

  • 同时保存完全准确的逐字稿。

录完后的文件导出来( wav 或 mp3格式),放到桌面的 AI 文件夹,将文件命名为:ref.wav 。录音说的原话逐字记下来,后面要填进配置里。要注意的是,情绪也会被克隆,所以在录音的时候可以使用自己想要的语气。

参考音频,请下载“一键部署包”。这些脚本用于安装语音对话环境、启动各项服务并处理音画同步。由于脚本可能随项目版本调整,使用前最好快速检查其中的下载地址、端口和模型名称。包括文件:

  • 文件|用途

  • install-voice.sh|语音对话部分一键安装

  • start-voice.sh|语音服务启动 / 停止 / 日志

  • start-livetalking.sh|口型服务启动 / 停止

  • avatar-sync.js|音频转发 + 数字人背景层

  • wav2lip256.pth|口型模型权重

  • wav2lip256_avatar1.tar.gz|官方示例形象(用来验证链路)

一键部署包下载地址:https://pan.quark.cn/s/d4fc5bfc88eb

七、整理文件

最后,把5 秒数字人视频文件 idle.mp4, 和 音频文件 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

八、安装WSL2 (Ubuntu 24.04 与 GPU 支持)

以管理员身份打开 PowerShell:

wsl --update
wsl --install -d Ubuntu-24.04

安装完成后重启电脑,让第一步的 .wslconfig 生效。重启后打开 Ubuntu 终端,设置用户名和密码,验证显卡直通:

nvidia-smi

如果能看到显卡型号和驱动信息,说明 GPU 透传正常。

不要在 WSL 内重复安装显卡驱动。显卡驱动只安装在 Windows 里,WSL 使用主机提供的 CUDA 透传;在WSL内再次安装显卡驱动会覆盖 libcuda.so,导致 GPU 不可用。

九、把安装包复制进 WSL

在 Ubuntu 终端,将路径换成自己的 Windows 用户名:

#拷贝(把路径换成自己的用户名):
mkdir -p ~/setup
cp -r "/mnt/c/Users/你的用户名/Desktop/AI/." ~/setup/
cd ~/setup
ls -la

#转换行尾:
sudo apt update
sudo apt install -y dos2unix
dos2unix *.sh

#加执行权限:
chmod +x *.sh
  • 为什么要转行尾:Windows 文本文件常用 CRLF 换行,不转换可能出现 bash^M 或 bad interpreter 错误,很多人卡在这里。

  • 直接在 /mnt/c中运行大量 Python 文件通常更慢,也容易遇到权限问题,复制到 Linux 主目录会更稳定。

十、安装并测试语音对话模块

1. 执行安装脚本

cd ~/setup
./install-voice.sh

安装过程会创建 Python 环境,并准备语音活动检测、faster-whisper、Qwen3-TTS 和前端组件。根据网络和硬盘速度,可能需要十几分钟。

2. 统一参考音频格式

ffmpeg -i ~/setup/ref.wav -ac 1 -ar 16000 -c:a pcm_s16le ~/s2s/ref.wav

#确认格式:必须是 pcm_s16le / 16000 / 1 声道:
ffprobe -v error \
  -show_entries stream=sample_rate,channels,codec_name \
  -show_entries format=duration \
  -of default=nw=1 ~/s2s/ref.wav

检查结果应满足:

  • 编码:pcm_s16le

  • 采样率:16000

  • 声道:单声道

3. 写入参考音频逐字稿

把下面的文字换成录音中实际说出的内容:

sed -i 's|^REF_TEXT=.*|REF_TEXT="这里填写与录音完全一致的逐字稿"|' ~/setup/start-voice.sh
grep -n "^REF_TEXT=" ~/setup/start-voice.sh

逐字稿漏字、错字或标点差异过大,都会降低克隆效果。

4. 首次启动

cd ~/setup
./start-voice.sh

然后在 Windows 浏览器打开:

http://localhost:7860/

允许浏览器使用麦克风,点击页面中的交互按钮进行测试。第一次建议进入设置,把 NOISE GATE 调到最左侧或直接关闭,否则正常说话也可能被当作背景噪声过滤掉。

十一、安装 LiveTalking(口型同步) 与 Wav2Lip

新开一个 Ubuntu 终端,进入 WSL,依次运行:

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

如果系统还没有 uv,先根据 uv 官方安装说明完成安装,再重新执行上面的命令。

放置口型模型和默认数字人:

cd ~/livetalking/LiveTalking

# 注意要改名为:wav2lip.pth
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,因为项目默认按这个文件名寻找权重。

先测试官方示例数字人:

cd ~/livetalking/LiveTalking
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左右或更高;若 inferfps 明显不足,就需要降低模型负载或更换更轻的配置。

网上教程多推荐 MuseTalk ,画质虽然更好,但是此次 AI 数字人的画面要求并不高,但显存占用只有约 1.3GB,对于暗光、侧脸和人物这种占比不大的画面,我们能以较低成本达到可接受效果,而 MuseTalk 则占用12G的显存。同时,纯本地化部署也不需要 stun,但不要传空字符串,否则 WebRTC 可能因 STUN 地址格式错误而启动失败。

十二、把视频转换成自己的数字人形象

在 LiveTalking 运行时打开:

http://localhost:8010/avatar.html

按下面的方式提交生成任务:

  • 算法:Wav2Lip

  • Avatar ID:wav2lip256_myavatar(保留 wav2lip256_前缀)

  • 视频文件:前面生成的 idle.mp4

等待状态变成 COMPLETED 后,再启动自己的数字人:

cd ~/setup
AVATAR_ID=wav2lip256_myavatar ./start-livetalking.sh

如果希望以后默认启动它,可以修改脚本中的 Avatar ID:

sed -i 's/wav2lip256_lingdu/wav2lip256_myavatar/' ~/setup/start-livetalking.sh

若生成后嘴部附近出现明显撕裂,优先检查待机视频中是否有手、头发或衣领频繁遮挡嘴和下巴,而不是急着更换模型。

十三、按正确顺序启动完整系统

整套服务需要三个终端窗口。

第一个窗口:Windows 本地大模型

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 --top-p 0.95 ^
  --host 0.0.0.0 --port 8090

 第二个窗口:WSL 口型服务

cd ~/setup
./start-livetalking.sh

第三个窗口:WSL 语音服务

cd ~/setup
./start-voice.sh

最后打开 http://localhost:7860/,必要时按 Ctrl + F5 强制刷新。先点击页面让数字人建立连接,再点击语音交互按钮开始说话。

关闭服务时执行:

./start-voice.sh stop
./start-livetalking.sh stop

Windows 端的 llama.cpp 窗口可以直接按  Ctrl + C 停止。

十四、设置自然、低延迟的人设

在网页的 Settings → INSTRUCTIONS 中写入人设。不要只堆“温柔、活泼、善解人意”之类的形容词,最好同时提供几组短对话示例,让模型学会回复节奏。

可以采用这样的约束:

你是一位自然、友善的虚拟伙伴。说话口语化,每次只回答两到三句话。
不要使用 Markdown、列表、编号、表情符号和舞台动作描写。
不要复述用户问题,直接回应。遇到不确定的信息,要坦率说明。

示例:
用户:今天有点累。
助手:那就先别逼自己满负荷运转。喝点水,休息十分钟,我们再慢慢处理。

短回复不仅更像真实聊天,也能明显缩短等待合成完整语音的时间。禁用 Markdown 和表情符号,是为了避免 TTS 把符号或格式标记读出来。/no_think 用于关闭不必要的长推理输出,进一步减少首句延迟。

十五、减少抢话与误打断

实时语音系统最难调的往往不是模型,而是“什么时候认为用户说完了”。中文说话中间常有停顿,静音判断过短就会频繁抢话。

可以在 ~/setup/start-voice.sh 中尝试以下参数:

MIN_SILENCE_MS=1200 
VAD_THRESH=0.6
MIN_SPEECH_MS=500
SPEECH_PAD_MS=300

参数含义:

  • MIN_SILENCE_MS:沉默多久后判定一句话结束;建议先用 1200ms,觉得反应慢再降到 900ms;

  • VAD_THRESH:语音活动阈值;嘈杂环境可升到 0.7;

  • MIN_SPEECH_MS:过滤过短的声响;

  • SPEECH_PAD_MS:在语音前后保留一点缓冲,减少吞字。

观察日志:

tail -f ~/s2s/logs/s2s.log | grep -E "soft-ended|discard"

如果修改参数后日志行为完全不变,通常不是参数无效,而是服务没有真正重启。

十六、显存不够时怎么减负

按收益从高到低,可以依次尝试:

  • 将 Qwen3-14B 换成 Qwen3-8B,大约可省 3GB;

  • 换成 Qwen3-4B,大约可省 6GB;

  • 把语音识别模型改成 `medium`,约省 1.5GB;

  • 把 llama.cpp 的上下文从 `-c 8192` 降到 `-c 4096`,还能节省约 1GB;

  • 保留 Wav2Lip,不要在显存紧张时换成更重的口型模型。

语音聊天每轮通常只有两三句话,14B 与 8B 在“听感”上的差异,未必大过等待时间带来的体验差异。显存紧张时,优先追求稳定和低延迟。

十七、常见故障速查

  • 现象|原因与处理办法

  • bad interpreter 或出现 ^M|脚本是 Windows 换行,执行 `dos2unix *.sh

  • WebRTC 一直连接不上|检查 `.wslconfig` 中的 `hostAddressLoopback=true`,再执行 `wsl --shutdown`

  • 网页提示 JSON 解析失败|往往是后端返回了 500 错误,应查看启动终端中的真实报错

  • malformed/uri:invalid scheme|STUN 地址为空或格式不正确,传入有效的 `stun:` 地址

  • 能打开网页但说话无反应|关闭或降低 NOISE GATE,确认浏览器已获得麦克风权限

  • 数字人频繁抢话|提高 `MIN_SILENCE_MS`,建议从 1200ms 开始

  • 回答与问题对不上|先处理错误断句,并确认没有同时开启互相冲突的实时转写流程

  • 每次声音差异很大|检查是否使用 TTS Base 模型,并核对参考音频与逐字稿

  • 声音像被变调|检查 `avatar-sync.js` 的采样率设置,通常应与 16000Hz 音频一致

  • 端口绑定失败但查不到进程|查看 Hyper-V 保留端口范围,换一个未被保留的端口

  • GPU 占满但长时间没有进度|可能发生显存向系统内存回退;降低模型,或在 NVIDIA 控制面板检查 CUDA 系统内存回退策略

  • 使用局域网 IP 时没有麦克风|浏览器通常要求 localhost 或 HTTPS 才允许麦克风访问

  • 电脑睡眠唤醒后服务失效|执行 `wsl --shutdown` 后重新启动三个服务

  • 再次启动提示端口占用|先运行两个 `stop` 命令,确认旧进程结束再重启

十八、可选:做一个一键启动脚本

确认三个服务都能独立稳定运行后,可以在Windows 新建 start-ai-avatar.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

start "voice" wsl -d Ubuntu-24.04 -- bash -lc "cd ~/setup && ./start-voice.sh"
timeout /t 10

start http://localhost:7860/

等待时间要根据自己的电脑调整。第一次部署不要直接依赖批处理脚本,否则某一步失败时不容易判断是哪项服务出了问题。

十九、手机访问与外网开放的安全问题

浏览器麦克风属于敏感权限。使用普通局域网 IP 打开网页时,浏览器可能因为页面不是安全上下文而拒绝授权。技术上可以使用 Cloudflare Tunnel 等工具把本地页面映射到 HTTPS 地址,例如:

cloudflared tunnel --url http://localhost:7860

但这也意味着本地服务可能被互联网访问。不要把无身份认证的临时地址公开传播,更不要把带有私人声音、对话记录和摄像素材的服务直接暴露出去。需要远程使用时,至少应增加访问控制,并在用完后及时关闭隧道。

二十、怎样判断部署真的成功

不要以“网页能打开”作为完成标准。建议按下面的顺序验收:

  • 1. llama.cpp 的 8090 端口能正常生成中文回复;

  • 2. 语音网页能识别麦克风输入并返回合成语音;

  • 3. LiveTalking 示例人物能发声并生成匹配口型;

  • 4. 自定义待机视频能成功转换为 Avatar;

  • 5. 三个服务串联后,首句等待约为 1–2 秒,连续对话没有频繁抢话;

  • 6. 长时间运行时显存没有持续上涨,服务重启和停止命令有效。

一次回复的延迟通常来自多段叠加:语音识别、语言模型首个 token、语音合成、口型推理,以及等待完整语音的缓冲。想优化体验,应先从日志判断最慢的是哪一段,而不是盲目更换所有模型。

结语:

这套方案真正有意思的地方,不只是“让一张照片开口”,而是把几个本地 AI 模块接成了完整的实时交互链路。它既能做虚拟伙伴,也可以改造成展厅讲解员、桌面语音助手、直播数字人或角色原型。

第一次部署时,最稳的策略是逐段验证:先跑语言模型,再测语音,接着检查口型,最后才换上自定义人物。只要每一步都有清晰的成功标准,复杂系统也能被拆成一组可定位、可复现的小问题。

最后再提醒一次:数字人形象和声音都可能涉及个人权益。用于公开展示或商业用途前,务必取得素材权利人的授权,并明确告知是被使用在 AI 系统里与人物进行交互对话。

#AI浏览器#AI编程#AI视频#AI设计#AI金融#AI音频#大模型#开源#效率工具#数据分析