
Muốn tự xây dựng trên máy tính của mình một nhân vật kỹ thuật số AI có thể nghe, nói, khớp khẩu hình và trò chuyện với bạn mà không cần sử dụng bất kỳ công cụ AI nào hoặc trả phí thuê bao đắt đỏ. Bằng cách kết nối nhận dạng giọng nói, mô hình ngôn ngữ cục bộ, tổng hợp giọng nói và đồng bộ khẩu hình, bạn có thể tạo ra một hệ thống tương tác thời gian thực chạy ngay trên máy.
Bài viết bắt đầu từ khâu chuẩn bị phần cứng, hướng dẫn bạn hoàn tất toàn bộ quá trình triển khai trong môi trường Windows + WSL2. Kết quả cuối cùng: trang web hiển thị nhân vật kỹ thuật số tùy chỉnh; chúng ta trò chuyện với nhân vật kỹ thuật số AI qua micro, và nhân vật sẽ trả lời bằng giọng nói đã được bạn nhân bản.
I. Quy trình hoạt động của toàn bộ hệ thống
Giải pháp này không do một mô hình duy nhất đảm nhiệm mà triển khai nhiều thành phần:

Trong đó, llama.cpp phụ trách chạy mô hình ngôn ngữ cục bộ; faster-whisper chuyển giọng nói của người dùng thành văn bản; Qwen3-TTS tạo giọng trả lời dựa trên âm thanh tham chiếu; còn LiveTalking và Wav2Lip biến giọng nói thành chuyển động môi tương ứng.
II. Yêu cầu phần cứng và dự toán VRAM
Cấu hình tối thiểu:
GPU NVIDIA: 8GB VRAM
RAM: 16GB
Dung lượng ổ đĩa trống: ít nhất 60GB
Hệ điều hành: Windows 10/11, hỗ trợ WSL2
Cấu hình đề xuất:
GPU NVIDIA: 16GB VRAM trở lên
RAM: 32GB trở lên
Nên dùng SSD để lưu mô hình và tệp WSL
Lấy mô hình lượng tử hóa Qwen3 14B làm ví dụ, VRAM sẽ được phân bổ приблиз như sau:
Thành phần|Mức sử dụng VRAM tham khảo
Qwen3-14B Q4_K_M|Khoảng 9GB
faster-whisper large-v3|Khoảng 3GB
Qwen3-TTS 1.7B|Khoảng 4GB
Wav2Lip 256|Khoảng 1.3GB
Tổng cộng|Khoảng 17GB
GPU có 24GB VRAM sẽ chạy tổ hợp này thoải mái hơn. Với 16GB VRAM, có thể chuyển sang mô hình 8B và giảm độ dài ngữ cảnh; với khoảng 8GB, nên bắt đầu từ mô hình 4B và mô hình nhận dạng giọng nói cỡ trung.
III. Cấu hình mạng và bộ nhớ WSL2
1. Trước tiên, tạo tệp .wslconfig trong thư mục người dùng Windows:
C:\Users\Tên người dùng của bạn\.wslconfig2. Nhập nội dung sau:
[wsl2]
memory=32GB
networkingMode=mirrored
[experimental]
hostAddressLoopback=truememory có thể điều chỉnh theo lượng RAM thực tế; thông thường chỉ cần cấp từ một nửa đến ba phần tư RAM vật lý. hostAddressLoopback=true đặc biệt quan trọng đối với giao tiếp WebRTC giữa Windows và WSL trên cùng máy. Nếu thiếu tùy chọn này, kết nối WebRTC ở các bước sau sẽ luôn thất bại nhưng thông báo lỗi không chỉ rõ nguyên nhân: trình duyệt hiển thị lỗi phân tích JSON và danh sách ứng viên ICE bị trống.
3. Sau khi chỉnh sửa, chạy lệnh sau trong PowerShell:
wsl --shutdownCấu hình chỉ có hiệu lực sau khi vào lại WSL.
IV. Khởi động mô hình ngôn ngữ cục bộ trên Windows
1. Chuẩn bị llama.cpp
Tải llama.cpp dành cho Windows và giải nén vào một thư mục cố định, ví dụ:
E:\llama.cppĐịa chỉ tải bản ổn định: https://pan.quark.cn/s/0073852e4042
2. Chọn mô hình theo dung lượng VRAM
Khoảng VRAM|Mô hình đề xuất|Địa chỉ tải
Trên 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
Dưới 8GB|Qwen3-4B GGUF|https://pan.quark.cn/s/fd588898ccbf
Đặt tệp .gguf đã tải vào:
E:\llama.cpp\models3. Khởi động dịch vụ suy luận
Chạy trong Command Prompt của 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 8090Công dụng của một số tham số:
host 0.0.0.0: cho phép WSL truy cập dịch vụ mô hình trên Windows;
c 8192: đặt độ dài ngữ cảnh, đủ cho các cuộc hội thoại ngắn;
temp 1.0: giúp câu trả lời bớt máy móc;
port 8090: chỉ định cổng dịch vụ.
Cửa sổ lệnh này phải được giữ chạy liên tục. Nếu hệ thống báo cổng đang được sử dụng nhưng kiểm tra thông thường không thấy tiến trình, bạn có thể kiểm tra Hyper-V có dành riêng cổng đó hay không:
netsh interface ipv4 show excludedportrange protocol=tcpNếu phát hiện xung đột, cách đơn giản nhất là đồng thời thay đổi cổng trong dịch vụ mô hình và tập lệnh gọi.
V. Tạo ảnh nền và video cho nhân vật kỹ thuật số
1. Trước tiên, thiết kế một ảnh nhân vật kỹ thuật số theo ý thích
Ảnh nhân vật kỹ thuật số không chỉ cần “đẹp” mà còn phải chừa không gian cho bố cục trang web và tạo khẩu hình sau này. Bố cục tương đối ổn định là:
Sử dụng tỷ lệ khung hình 16:9;
Nhân vật nằm ở một phần ba bên phải;
Chừa khoảng trống tối lớn ở bên trái để đặt quả cầu tương tác và phụ đề;
Môi khép tự nhiên, không lộ răng;
Tay không che miệng, cằm và đường nét khuôn mặt;
Sử dụng ánh sáng viền hơi tối để giảm cảm giác thiếu tự nhiên do vùng khẩu hình bị mờ nhẹ.
Có thể tham khảo ý tưởng prompt dưới đây và tự thay thế nhân vật, trang phục cũng như bối cảnh:
Chân dung điện ảnh góc nghiêng trong điều kiện ánh sáng thấp, một phụ nữ trưởng thành ngồi ở bên phải khung hình, ánh sáng viền dịu,
chừa một vùng âm bản tối lớn ở bên trái, biểu cảm tự nhiên, môi khép, máy quay cố định,
da chân thực, bố cục ngang 16:9.Có thể thêm vào prompt phủ định: há miệng, lộ răng, nhân vật ở giữa, nền sáng lộn xộn, tay che miệng, chữ, hình mờ, da nhựa, phong cách hoạt hình.
2. Dùng ComfyUI + Wan2.2 để tạo video nhân vật kỹ thuật số 5 giây
Tải và cài đặt ComfyUI, sau đó chọn workflow chuyển ảnh thành video của Wan2.2 và dùng ảnh nền làm khung hình đầu tiên. Khi sử dụng lần đầu, nên bắt đầu với các tham số thận trọng sau:
Tham số|Giá trị đề xuất
Độ phân giải|Theo tỷ lệ ảnh nền; ví dụ trong hướng dẫn gốc là 704 × 896
Thời lượng|5 giây
Tốc độ khung hình|25 fps
Prompt Enhance|Tắt
Địa chỉ tải ComfyUI: https://pan.quark.cn/s/bb9d21f1e724
Prompt chỉ mô tả hành động, không mô tả lại ngoại hình nhân vật. Ví dụ:
Nhân vật giữ nguyên vị trí, chỉ hô hấp nhẹ, chậm rãi chớp mắt một lần, đầu di chuyển tự nhiên với biên độ cực nhỏ rồi trở về tư thế ban đầu,
môi luôn khép, máy quay cố định, không zoom, lia hay thay đổi góc.Xuất tệp và đặt tên: idle.mp4
Vì khẩu hình khi nói thực sự sẽ được Wav2Lip tạo theo thời gian thực, không cần tạo thêm nhiều video như “đang nói”, “đang lắng nghe”.

Dưới đây là một số lỗi thường gặp:
Không bật tăng cường prompt; hãy tắt prompt_enhance , nếu không mô hình có thể thiết kế lại nhân vật hoặc bối cảnh;
Tỷ lệ đầu ra phải giống tỷ lệ ảnh đầu vào. Nếu dùng ảnh nền ngang 16:9, hãy đổi sang kích thước ngang được workflow hỗ trợ để tránh kéo giãn hoặc cắt mất nhân vật;
Prompt chỉ nên viết về hành động; lặp lại mô tả ngoại hình dễ khiến nhân vật bị trôi;
Video 5 giây là đủ để làm vòng lặp chờ; kéo dài video một cách thiếu cần thiết dễ tạo ra hiện tượng lặp hoặc biến dạng.
VI. Ghi âm giọng tham chiếu (nhân bản giọng nói)
Qwen3-TTS sẽ mô phỏng âm sắc và trạng thái nói dựa trên âm thanh tham chiếu. Nên ghi âm một đoạn dài 5–15 giây với các yêu cầu sau:
Chỉ có một người nói;
Môi trường yên tĩnh, không có nhạc và tiếng vang rõ rệt;
Tốc độ nói tự nhiên, cảm xúc phù hợp với phong cách muốn nhân bản;
Đồng thời lưu bản chép lời chính xác từng chữ.
Sau khi ghi âm, xuất tệp ( định dạng wav hoặc mp3), đặt vào thư mục AI trên màn hình nền và đặt tên tệp là: ref.wav. Ghi lại chính xác từng lời đã nói trong bản ghi âm, vì sau đó sẽ cần điền vào cấu hình. Lưu ý rằng cảm xúc cũng được nhân bản, vì vậy khi ghi âm bạn có thể sử dụng ngữ điệu mong muốn.
Để có âm thanh tham chiếu, hãy tải “gói triển khai một lần nhấp”. Các tập lệnh này dùng để cài đặt môi trường trò chuyện bằng giọng nói, khởi động các dịch vụ và xử lý đồng bộ âm thanh-hình ảnh. Vì tập lệnh có thể thay đổi theo phiên bản dự án, nên kiểm tra nhanh địa chỉ tải, cổng và tên mô hình trước khi sử dụng. Gói bao gồm:
Tệp|Công dụng
install-voice.sh|Cài đặt một lần cho phần trò chuyện bằng giọng nói
start-voice.sh|Khởi động / dừng / xem nhật ký dịch vụ giọng nói
start-livetalking.sh|Khởi động / dừng dịch vụ khẩu hình
avatar-sync.js|Chuyển tiếp âm thanh + lớp nền nhân vật kỹ thuật số
wav2lip256.pth|Trọng số mô hình khẩu hình
wav2lip256_avatar1.tar.gz|Nhân vật mẫu chính thức (dùng để kiểm tra chuỗi hoạt động)
Địa chỉ tải gói triển khai một lần nhấp: https://pan.quark.cn/s/d4fc5bfc88eb
VII. Sắp xếp tệp
Cuối cùng, đặt tệp video nhân vật kỹ thuật số 5 giây idle.mp4 cùng với tệp âm thanh ref.wav` vào thư mục AI trên màn hình nền. Cấu trúc thư mục cuối cùng:
C:\Users\Tên người dùng của bạn\Desktop\AI\
├── install-voice.sh
├── start-voice.sh
├── start-livetalking.sh
├── avatar-sync.js
├── wav2lip256.pth
├── wav2lip256_avatar1.tar.gz
├── idle.mp4
└── ref.wavVIII. Cài đặt WSL2 (Ubuntu 24.04 và hỗ trợ GPU)
Mở PowerShell với quyền quản trị:
wsl --update
wsl --install -d Ubuntu-24.04Sau khi cài đặt xong, khởi động lại máy tính để .wslconfig ở bước đầu có hiệu lực. Sau khi khởi động lại, mở terminal Ubuntu, thiết lập tên người dùng và mật khẩu, rồi kiểm tra GPU passthrough:
nvidia-smiNếu thấy tên GPU và thông tin trình điều khiển, nghĩa là truyền GPU đang hoạt động bình thường.
Không cài lại trình điều khiển GPU trong WSL. Trình điều khiển GPU chỉ được cài trên Windows; WSL sử dụng CUDA passthrough do máy chủ cung cấp. Cài lại trình điều khiển GPU trong WSL sẽ ghi đè libcuda.so, khiến GPU không thể sử dụng.
IX. Sao chép gói cài đặt vào WSL
Trong terminal Ubuntu, thay đường dẫn bằng tên người dùng Windows của bạn:
#Sao chép (thay đường dẫn bằng tên người dùng của bạn):
mkdir -p ~/setup
cp -r "/mnt/c/Users/Tên người dùng của bạn/Desktop/AI/." ~/setup/
cd ~/setup
ls -la
#Chuyển đổi ký tự cuối dòng:
sudo apt update
sudo apt install -y dos2unix
dos2unix *.sh
#Cấp quyền thực thi:
chmod +x *.shTại sao cần chuyển đổi ký tự xuống dòng: tệp văn bản Windows thường dùng ký tự xuống dòng CRLF. Nếu không chuyển đổi, có thể xuất hiện lỗi bash^M hoặc bad interpreter; nhiều người bị mắc ở bước này.
Chạy trực tiếp nhiều tệp Python trong /mnt/c thường chậm hơn và dễ gặp vấn đề về quyền. Sao chép chúng vào thư mục chính của Linux sẽ ổn định hơn.
Mười. Cài đặt và kiểm thử mô-đun hội thoại bằng giọng nói
1. Chạy tập lệnh cài đặt
cd ~/setup
./install-voice.shQuá trình cài đặt sẽ tạo môi trường Python, đồng thời chuẩn bị tính năng phát hiện hoạt động giọng nói, faster-whisper, Qwen3-TTS và các thành phần giao diện trước. Tùy thuộc vào tốc độ mạng và ổ đĩa, quá trình này có thể mất hơn mười phút.
2. Chuẩn hóa định dạng âm thanh tham chiếu
ffmpeg -i ~/setup/ref.wav -ac 1 -ar 16000 -c:a pcm_s16le ~/s2s/ref.wav
#Xác nhận định dạng: phải là pcm_s16le / 16000 / 1 kênh:
ffprobe -v error \
-show_entries stream=sample_rate,channels,codec_name \
-show_entries format=duration \
-of default=nw=1 ~/s2s/ref.wavKết quả kiểm tra phải đáp ứng:
Mã hóa: pcm_s16le
Tần số lấy mẫu: 16000
Kênh: đơn âm
3. Ghi lại bản chép lời của âm thanh tham chiếu
Thay phần văn bản bên dưới bằng nội dung thực tế được nói trong bản ghi âm:
sed -i 's|^REF_TEXT=.*|REF_TEXT="Nhập bản chép lời hoàn toàn trùng khớp với bản ghi âm tại đây"|' ~/setup/start-voice.sh
grep -n "^REF_TEXT=" ~/setup/start-voice.shBỏ sót chữ, sai chữ hoặc khác biệt dấu câu quá lớn trong bản chép lời đều sẽ làm giảm hiệu quả sao chép giọng nói.
4. Khởi động lần đầu
cd ~/setup
./start-voice.shSau đó mở trình duyệt Windows và truy cập:
http://localhost:7860/Cho phép trình duyệt sử dụng micrô, rồi nhấp vào nút tương tác trên trang để kiểm thử. Lần đầu nên vào phần cài đặt, kéo NOISE GATE sang hết bên trái hoặc tắt hẳn; nếu không, cả lời nói bình thường cũng có thể bị lọc thành tạp âm nền.

Mười một. Cài đặt LiveTalking (đồng bộ khẩu hình) và Wav2Lip
Mở một terminal Ubuntu mới, vào WSL, rồi lần lượt chạy:
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-0Nếu hệ thống chưa có uv, trước tiên hãy cài đặt theo hướng dẫn cài đặt chính thức của uv, sau đó chạy lại các lệnh trên.
Đặt mô hình khẩu hình và nhân vật kỹ thuật số mặc định:
cd ~/livetalking/LiveTalking
# Lưu ý phải đổi tên thành: wav2lip.pth
cp ~/setup/wav2lip256.pth models/wav2lip.pth
# Nhân vật mẫu chính thức
tar -xzf ~/setup/wav2lip256_avatar1.tar.gz -C data/avatars/
# Xác nhận
ls -lh models/ && ls data/avatars/Lưu ý: mặc dù tệp nguồn có tên wav2lip256.pth, sau khi sao chép bắt buộc phải đặt tên là wav2lip.pth, vì dự án mặc định tìm trọng số theo tên tệp này.
Trước tiên hãy kiểm thử nhân vật kỹ thuật số mẫu chính thức:
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'Mở trình duyệt và truy cập:
http://localhost:8010/index.htmlSau khi kết nối thành công, gửi một đoạn văn bản tiếng Trung. Chỉ khi đồng thời xuất hiện âm thanh, chuyển động nhân vật và khẩu hình khớp thì giai đoạn này mới được xem là hoàn tất.
Có thể dùng inferfps và finalfps trong nhật ký terminal để theo dõi khả năng xử lý thời gian thực. Thông thường nên đạt khoảng 25 hoặc cao hơn ở cả hai chỉ số; nếu inferfps thấp rõ rệt, cần giảm tải mô hình hoặc thay đổi sang cấu hình nhẹ hơn.
Các hướng dẫn trên mạng thường đề xuất MuseTalk. Chất lượng hình ảnh của MuseTalk dù tốt hơn, nhưng yêu cầu hình ảnh của nhân vật kỹ thuật số AI lần này không quá cao, trong khi mức sử dụng VRAM chỉ khoảng 1.3GB. Với cảnh thiếu sáng, góc mặt nghiêng và nhân vật chiếm tỷ lệ không lớn, chúng ta vẫn có thể đạt hiệu quả chấp nhận được với chi phí thấp hơn, còn MuseTalk sử dụng tới 12G VRAM. Đồng thời, triển khai hoàn toàn cục bộ cũng không cần stun, nhưng không được truyền chuỗi rỗng, nếu không WebRTC có thể khởi động thất bại do định dạng địa chỉ STUN sai.
Mười hai. Chuyển video thành nhân vật kỹ thuật số của riêng bạn
Mở trang sau khi LiveTalking đang chạy:
http://localhost:8010/avatar.htmlGửi tác vụ tạo theo cách dưới đây:
Thuật toán: Wav2Lip
Avatar ID: wav2lip256_myavatar (giữ nguyên tiền tố wav2lip256_)
Tệp video: idle.mp4 đã tạo ở bước trước
Chờ trạng thái chuyển thành COMPLETED, sau đó khởi động nhân vật kỹ thuật số của riêng bạn:
cd ~/setup
AVATAR_ID=wav2lip256_myavatar ./start-livetalking.shNếu muốn lần sau mặc định khởi động nhân vật này, có thể sửa Avatar ID trong tập lệnh:
sed -i 's/wav2lip256_lingdu/wav2lip256_myavatar/' ~/setup/start-livetalking.shNếu sau khi tạo xuất hiện hiện tượng rách rõ rệt quanh miệng, trước tiên hãy kiểm tra trong video chờ xem tay, tóc hoặc cổ áo có thường xuyên che miệng và cằm hay không, thay vì vội đổi mô hình.
Mười ba. Khởi động toàn bộ hệ thống theo đúng thứ tự
Toàn bộ dịch vụ cần ba cửa sổ terminal.

Cửa sổ đầu tiên: mô hình ngôn ngữ lớn cục bộ trên 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 8090Cửa sổ thứ hai: dịch vụ khẩu hình WSL
cd ~/setup
./start-livetalking.shCửa sổ thứ ba: dịch vụ giọng nói WSL
cd ~/setup
./start-voice.shCuối cùng mở http://localhost:7860/, khi cần có thể nhấn Ctrl + F5 để tải lại bắt buộc. Trước tiên nhấp vào trang để nhân vật kỹ thuật số thiết lập kết nối, sau đó nhấp vào nút tương tác bằng giọng nói để bắt đầu nói.
Khi tắt dịch vụ, chạy:
./start-voice.sh stop
./start-livetalking.sh stopCửa sổ llama.cpp trên Windows có thể dừng trực tiếp bằng cách nhấn Ctrl + C.
Mười bốn. Thiết lập tính cách tự nhiên, độ trễ thấp
Nhập tính cách vào Settings → INSTRUCTIONS trên trang web. Không nên chỉ chồng chất các tính từ như “dịu dàng, năng động, thấu hiểu”; tốt nhất nên cung cấp thêm một số đoạn hội thoại ngắn mẫu để mô hình học nhịp độ trả lời.
Có thể áp dụng các ràng buộc như sau:
Bạn là một người bạn ảo tự nhiên và thân thiện. Nói chuyện theo văn phong khẩu ngữ, mỗi lần chỉ trả lời từ hai đến ba câu.
Không sử dụng Markdown, danh sách, đánh số, biểu tượng cảm xúc hoặc mô tả hành động sân khấu.
Không nhắc lại câu hỏi của người dùng, hãy trả lời trực tiếp. Khi gặp thông tin không chắc chắn, hãy thẳng thắn nói rõ.
Ví dụ:
Người dùng: Hôm nay tôi hơi mệt.
Trợ lý: Vậy trước hết đừng ép bản thân phải hoạt động hết công suất. Uống chút nước và nghỉ mười phút, rồi chúng ta từ từ xử lý tiếp.Câu trả lời ngắn không chỉ giống trò chuyện thực tế hơn mà còn rút ngắn đáng kể thời gian chờ tổng hợp đầy đủ giọng nói. Vô hiệu hóa Markdown và biểu tượng cảm xúc nhằm tránh việc TTS đọc các ký hiệu hoặc dấu định dạng. /no_think dùng để tắt phần suy luận dài không cần thiết, giúp giảm thêm độ trễ của câu đầu tiên.
Mười lăm. Giảm tình trạng nói chen và ngắt lời nhầm
Điều khó điều chỉnh nhất trong hệ thống giọng nói thời gian thực thường không phải là mô hình, mà là “khi nào xác định người dùng đã nói xong”. Trong tiếng Trung thường có khoảng ngừng giữa câu; nếu thời gian xác định im lặng quá ngắn, hệ thống sẽ thường xuyên nói chen.
Có thể thử các tham số sau trong ~/setup/start-voice.sh:
MIN_SILENCE_MS=1200
VAD_THRESH=0.6
MIN_SPEECH_MS=500
SPEECH_PAD_MS=300Ý nghĩa các tham số:
MIN_SILENCE_MS: thời gian im lặng trước khi xác định một câu đã kết thúc; nên bắt đầu với 1200ms, nếu thấy phản hồi chậm thì giảm xuống 900ms;
VAD_THRESH: ngưỡng hoạt động giọng nói; trong môi trường ồn có thể tăng lên 0.7;
MIN_SPEECH_MS: lọc các âm thanh quá ngắn;
SPEECH_PAD_MS: giữ lại một khoảng đệm nhỏ trước và sau lời nói để giảm tình trạng mất chữ.
Theo dõi nhật ký:
tail -f ~/s2s/logs/s2s.log | grep -E "soft-ended|discard"Nếu hành vi trong nhật ký hoàn toàn không thay đổi sau khi sửa tham số, thường không phải do tham số không có hiệu lực mà do dịch vụ chưa thực sự được khởi động lại.
Mười sáu. Giảm tải khi không đủ VRAM
Có thể lần lượt thử theo mức độ hiệu quả từ cao xuống thấp:
Đổi Qwen3-14B thành Qwen3-8B, tiết kiệm khoảng 3GB;
Đổi thành Qwen3-4B, tiết kiệm khoảng 6GB;
Đổi mô hình nhận dạng giọng nói thành `medium`, tiết kiệm khoảng 1.5GB;
Giảm ngữ cảnh của llama.cpp từ `-c 8192` xuống `-c 4096`, tiết kiệm thêm khoảng 1GB;
Giữ lại Wav2Lip, không đổi sang mô hình khẩu hình nặng hơn khi VRAM đang hạn chế.
Mỗi lượt trò chuyện bằng giọng nói thường chỉ có hai hoặc ba câu. Khác biệt về “cảm nhận khi nghe” giữa 14B và 8B chưa chắc lớn hơn khác biệt trải nghiệm do thời gian chờ gây ra. Khi VRAM hạn chế, hãy ưu tiên sự ổn định và độ trễ thấp.
Mười bảy. Tra nhanh các sự cố thường gặp
Hiện tượng | Nguyên nhân và cách xử lý
bad interpreter hoặc xuất hiện ^M | Tập lệnh sử dụng ký tự xuống dòng của Windows, hãy thực thi `dos2unix *.sh
WebRTC liên tục không thể kết nối | Kiểm tra `hostAddressLoopback=true` trong `.wslconfig`, sau đó thực thi `wsl --shutdown`
Trang web báo lỗi phân tích JSON | Thường là do backend trả về lỗi 500, hãy xem lỗi thực tế trong terminal khởi động
malformed/uri:invalid scheme | Địa chỉ STUN bị trống hoặc không đúng định dạng, hãy truyền địa chỉ `stun:` hợp lệ
Có thể mở trang web nhưng nói không có phản hồi | Tắt hoặc giảm NOISE GATE, xác nhận trình duyệt đã được cấp quyền truy cập micro
Nhân vật số thường xuyên chen lời | Tăng `MIN_SILENCE_MS`, nên bắt đầu từ 1200ms
Câu trả lời không khớp với câu hỏi | Trước tiên xử lý lỗi ngắt câu, đồng thời xác nhận không bật đồng thời các quy trình chuyển giọng nói thành văn bản theo thời gian thực xung đột với nhau
Âm thanh khác biệt rất lớn mỗi lần | Kiểm tra có sử dụng mô hình TTS Base hay không, đồng thời đối chiếu âm thanh tham chiếu với bản chép lời
Giọng bị biến điệu | Kiểm tra cài đặt tần số lấy mẫu trong `avatar-sync.js`, thông thường phải nhất quán với âm thanh 16000Hz
Liên kết cổng thất bại nhưng không tìm thấy tiến trình | Xem phạm vi cổng được Hyper-V giữ lại và đổi sang một cổng chưa bị giữ
GPU bị sử dụng hết nhưng không có tiến triển trong thời gian dài | Có thể đã xảy ra việc bộ nhớ GPU tràn sang bộ nhớ hệ thống; hãy giảm kích thước mô hình hoặc kiểm tra chính sách tràn bộ nhớ hệ thống CUDA trong Bảng điều khiển NVIDIA
Không có micro khi sử dụng IP mạng cục bộ | Trình duyệt thường yêu cầu localhost hoặc HTTPS mới cho phép truy cập micro
Dịch vụ mất hiệu lực sau khi máy tính ngủ và thức dậy | Thực thi `wsl --shutdown`, sau đó khởi động lại ba dịch vụ
Khởi động lại báo cổng đang được sử dụng | Trước tiên chạy hai lệnh `stop`, xác nhận các tiến trình cũ đã kết thúc rồi khởi động lại
Mười tám, tùy chọn: tạo tập lệnh khởi động một lần nhấp
Sau khi xác nhận cả ba dịch vụ đều có thể chạy độc lập ổn định, bạn có thể tạo tệp start-ai-avatar.bat mới trong Windows:
@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/Thời gian chờ cần được điều chỉnh tùy theo máy tính của bạn. Khi triển khai lần đầu, đừng phụ thuộc ngay vào tập lệnh xử lý hàng loạt, nếu không sẽ khó xác định dịch vụ nào gặp sự cố khi một bước thất bại.
Mười chín, vấn đề bảo mật khi truy cập bằng điện thoại và mở ra Internet
Micro của trình duyệt là một quyền nhạy cảm. Khi mở trang web bằng IP mạng cục bộ thông thường, trình duyệt có thể từ chối cấp quyền vì trang không nằm trong ngữ cảnh bảo mật. Về mặt kỹ thuật, có thể sử dụng các công cụ như Cloudflare Tunnel để ánh xạ trang cục bộ sang địa chỉ HTTPS, ví dụ:
cloudflared tunnel --url http://localhost:7860Tuy nhiên, điều này cũng có nghĩa là dịch vụ cục bộ có thể bị truy cập từ Internet. Không được công khai hoặc phát tán địa chỉ tạm thời không có xác thực danh tính, càng không được trực tiếp phơi bày dịch vụ chứa giọng nói riêng tư, nhật ký hội thoại và tư liệu camera. Khi cần sử dụng từ xa, ít nhất phải bổ sung quyền kiểm soát truy cập và kịp thời đóng tunnel sau khi sử dụng xong.
Hai mươi, làm thế nào để xác định việc triển khai thực sự thành công
Đừng lấy việc “trang web có thể mở” làm tiêu chuẩn hoàn tất. Nên nghiệm thu theo thứ tự sau:
1. Cổng 8090 của llama.cpp có thể tạo phản hồi tiếng Trung bình thường;
2. Trang web thoại có thể nhận diện đầu vào từ micro và trả về giọng nói tổng hợp;
3. Nhân vật mẫu LiveTalking có thể phát âm thanh và tạo khẩu hình khớp;
4. Video chờ tùy chỉnh có thể được chuyển đổi thành Avatar thành công;
5. Sau khi kết nối ba dịch vụ, thời gian chờ câu đầu tiên khoảng 1–2 giây và hội thoại liên tục không thường xuyên bị chen lời;
6. Khi chạy trong thời gian dài, bộ nhớ GPU không tăng liên tục, các lệnh khởi động lại và dừng dịch vụ hoạt động hiệu quả.
Độ trễ của một câu trả lời thường đến từ nhiều phần cộng dồn: nhận dạng giọng nói, token đầu tiên của mô hình ngôn ngữ, tổng hợp giọng nói, suy luận khẩu hình và bộ đệm chờ toàn bộ âm thanh. Để tối ưu trải nghiệm, trước tiên nên dựa vào nhật ký để xác định phần nào chậm nhất, thay vì mù quáng thay đổi tất cả mô hình.
Lời kết:
Điểm thú vị thực sự của giải pháp này không chỉ là “khiến một bức ảnh lên tiếng”, mà còn là kết nối các mô-đun AI cục bộ thành một chuỗi tương tác thời gian thực hoàn chỉnh. Nó có thể được dùng làm bạn đồng hành ảo, hoặc cải biến thành hướng dẫn viên triển lãm, trợ lý giọng nói trên máy tính, nhân vật số livestream hay nguyên mẫu nhân vật.
Khi triển khai lần đầu, chiến lược ổn định nhất là kiểm tra từng phần: trước tiên chạy mô hình ngôn ngữ, sau đó kiểm tra giọng nói, tiếp theo kiểm tra khẩu hình, cuối cùng mới thay bằng nhân vật tùy chỉnh. Chỉ cần mỗi bước đều có tiêu chuẩn thành công rõ ràng, một hệ thống phức tạp cũng có thể được chia thành các vấn đề nhỏ, dễ xác định và tái hiện.
Cuối cùng, xin nhắc lại một lần nữa: hình ảnh và giọng nói của nhân vật số đều có thể liên quan đến quyền lợi cá nhân. Trước khi sử dụng cho mục đích trưng bày công khai hoặc thương mại, nhất thiết phải được người sở hữu quyền đối với tư liệu cho phép, đồng thời thông báo rõ rằng tư liệu được sử dụng trong hệ thống AI để tương tác và hội thoại với nhân vật.
