AI Voice Assistant 2026: Kết hợp Whisper (Nghe) + LLM (Nghĩ) + XTTS (Nói) để tạo trợ lý ảo tiếng Việt mượt mà

AI Hunter

Member
Bạn muốn có một Jarvis của riêng mình? Một trợ lý ảo không chỉ biết chat text mà còn có thể nghe và nói chuyện với bạn như người thật?
Quên Google Assistant hay Siri đi. Với sức mạnh của mã nguồn mở, bạn có thể tự build một hệ thống xịn hơn nhiều:
- Riêng tư: 100% chạy Local (Offline).
- Thông minh: Dùng LLM (AI tạo sinh) chứ không phải các câu lệnh "If/Else" cứng nhắc.
- Giọng nói: Có thể clone giọng của chính bạn hoặc người nổi tiếng (nhờ XTTS).

AI Voice Assistant 2026 Kết hợp Whisper (Nghe) + LLM (Nghĩ) + XTTS (Nói) để tạo trợ lý ảo tiến...jpg

Kiến trúc hệ thống​

Hệ thống hoạt động theo vòng lặp 3 bước (Pipeline):



  • Input: Microphone thu âm giọng nói của bạn.
  • Step 1 (STT): Model Faster-Whisper chuyển âm thanh thành văn bản.
  • Step 2 (LLM): Văn bản được gửi tới Ollama (chạy model tiếng Việt như Vistral/Qwen) để xử lý và sinh câu trả lời.
  • Step 3 (TTS): Model XTTS v2 chuyển câu trả lời thành file âm thanh và phát ra loa.

1. Cài đặt môi trường​

Bạn cần Python 3.10+ và GPU (Nvidia) để chạy mượt (CPU vẫn chạy được nhưng sẽ có độ trễ).

Bash:
# Cài đặt các thư viện cần thiết
pip install faster-whisper TTS openai sounddevice numpy scipy
# Cài thêm ffmpeg cho hệ thống nếu chưa có

2. Bộ phận "Tai": Faster Whisper​

Chúng ta dùng `faster-whisper` vì nó nhanh hơn bản gốc của OpenAI rất nhiều và hỗ trợ chạy trên GPU ít VRAM.

Python:
from faster_whisper import WhisperModel

# Load model (chọn 'small' hoặc 'medium' cho cân bằng tốc độ/chính xác)
# device="cuda" nếu có GPU, không thì "cpu"
stt_model = WhisperModel("small", device="cuda", compute_type="float16")

def listen_and_transcribe(audio_path):
    segments, info = stt_model.transcribe(audio_path, language="vi")
    text = " ".join([segment.text for segment in segments])
    print(f"👂 Nghe được: {text}")
    return text

3. Bộ phận "Não": Ollama (LLM)​

Thay vì load model nặng nề bằng Python, chúng ta dùng Ollama làm server chạy ngầm. Bạn cần cài Ollama và pull model về trước (ví dụ `ollama pull qwen2.5:7b`).

Python:
from openai import OpenAI

# Kết nối với Ollama local server
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

def think(text_input):
    print("🧠 Đang suy nghĩ...")
    response = client.chat.completions.create(
        model="qwen2.5:7b", # Model hỗ trợ tiếng Việt tốt
        messages=[
            {"role": "system", "content": "Bạn là trợ lý ảo giọng nói vui vẻ, trả lời ngắn gọn dưới 2 câu."},
            {"role": "user", "content": text_input}
        ]
    )
    answer = response.choices[0].message.content
    print(f"🤖 Trả lời: {answer}")
    return answer

4. Bộ phận "Miệng": XTTS v2​

Đây là phần thú vị nhất. XTTS có khả năng clone giọng cực nhanh chỉ với 6 giây âm thanh mẫu.
*Lưu ý: XTTS gốc hỗ trợ tốt tiếng Anh/Pháp... Với tiếng Việt, bạn có thể cần tìm các checkpoint fine-tune từ cộng đồng hoặc dùng EdgeTTS nếu muốn đơn giản hơn.*

Python:
import torch
from TTS.api import TTS
import sounddevice as sd
import soundfile as sf

# Load model XTTS v2
# gpu=True nếu có Card rời
tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)

def speak(text_output):
    print("🗣️ Đang nói...")
    # Tạo file âm thanh từ text
    # speaker_wav: Đường dẫn file giọng mẫu bạn muốn AI bắt chước
    tts.tts_to_file(
        text=text_output,
        file_path="output.wav",
        speaker_wav="my_voice_sample.wav",
        language="en" # Hoặc 'vi' nếu dùng bản fine-tune/multilingual hỗ trợ
    )
   
    # Phát âm thanh (Dùng sounddevice)
    data, fs = sf.read("output.wav")
    sd.play(data, fs)
    sd.wait()

5. Ghép nối: Vòng lặp chính​

Bây giờ chúng ta nối 3 phần lại với nhau. (Code ghi âm microphone được lược giản để dễ hình dung).

Python:
def main():
    while True:
        input("Nhấn Enter để bắt đầu nói...")
       
        # 1. Ghi âm từ mic (Giả sử hàm record_audio lưu file 'input.wav')
        # record_audio("input.wav")
       
        # 2. Whisper chuyển thành chữ
        user_text = listen_and_transcribe("input.wav")
       
        if not user_text: continue

        # 3. LLM suy nghĩ
        ai_response = think(user_text)

        # 4. XTTS nói ra loa
        speak(ai_response)

if __name__ == "__main__":
    main()

Tối ưu hóa độ trễ (Latency)​

Để AI phản hồi "như người thật" (dưới 1 giây), bạn cần áp dụng các kỹ thuật nâng cao sau:
1. Streaming: Không chờ LLM viết xong cả câu rồi mới nói. LLM viết đến đâu, đẩy text qua TTS đọc đến đó (cần xử lý đệm câu).
2. VAD (Voice Activity Detection): Dùng thư viện `silero-vad` để tự động phát hiện khi nào người dùng ngừng nói để AI bắt đầu trả lời (thay vì bấm nút).
3. Caching: Lưu lại file âm thanh của các câu chào xã giao ("Xin chào", "Tôi có thể giúp gì") để không phải render lại.

Kết luận​

Bạn vừa tạo ra nền móng cho một người bạn ảo thực sự. Hãy thử tưởng tượng tích hợp nó vào Home Assistant để điều khiển nhà thông minh bằng giọng nói tiếng Việt tự nhiên, hoặc nhúng vào robot đồ chơi. Giới hạn duy nhất là trí tưởng tượng của bạn!
 
Back
Top