Gần đây Mistral ra mắt các mô hình âm thanh đa phương thức mã nguồn mở đầu tiên của họ, Voxtral Small và Voxtral Mini, được xây dựng trên kiến trúc Mistral 3B và tối ưu hóa riêng cho tác vụ hiểu và chuyển lời nói thành văn bản.
Bài viết này tập trung vào Voxtral Mini 3B, một mô hình gọn nhẹ, mã nguồn mở được thiết kế cho tác vụ âm thanh–sang–văn bản thời gian thực như phiên âm, tóm tắt và H&Đ. Với kích thước hiệu quả và khả năng xử lý ngữ cảnh dài, Voxtral Mini đặc biệt mạnh khi kết hợp với các framework suy luận thông lượng cao như vLLM, lý tưởng để xây dựng ứng dụng âm thanh nhanh, chạy ngoại tuyến.
Trong hướng dẫn này, tôi sẽ giới thiệu cách:
Chạy Voxtral Mini 3B với vLLM trên Colab Pro
Triển khai endpoint API thông qua ngrok để truy cập mô hình từ bất kỳ đâu
Xây dựng trợ lý âm thanh bằng Streamlit để phiên âm, tóm tắt và H&Đ từ đầu vào âm thanh thô
Chúng tôi luôn cập nhật cho độc giả về những tin tức AI mới nhất qua The Median, bản tin miễn phí mỗi thứ Sáu tóm lược các câu chuyện chính trong tuần. Đăng ký để nắm bắt nhanh chỉ trong vài phút mỗi tuần:
Voxtral của Mistral là gì?
Voxtral là họ mô hình âm thanh mã nguồn mở hoàn toàn của Mistral, được thiết kế cho khả năng hiểu lời nói mạnh mẽ. Voxtral có hai kích thước mô hình:
Voxtral Small: 24 B tham số, lý tưởng cho quy mô sản xuất, doanh nghiệp
Voxtral Mini: 3 B tham số, tối ưu để chạy cục bộ trên thiết bị biên
Voxtral nhận đầu vào âm thanh thô (như .wav hoặc .mp3) và được huấn luyện để tạo bản phiên âm và tóm tắt nội dung nói một cách hiệu quả. Voxtral là biến thể nhỏ hơn, tối ưu cho suy luận nhanh và triển khai ngoại tuyến.
Mô hình tuân theo định dạng của Mistral và tương thích với các framework suy luận thông lượng cao như vLLM, trở thành lựa chọn tuyệt vời cho phiên âm thời gian thực hoặc ứng dụng giọng nói gọn nhẹ.
Cách chạy Voxtral Mini 3B bằng vLLM
Phần này sẽ hướng dẫn bạn phục vụ Voxtral Mini 3B bằng vLLM trên Colab Pro với GPU T4. vLLM được chọn vì khả năng phục vụ thông lượng cao, độ trễ thấp, lý tưởng cho các mô hình như Voxtral cần phản hồi dạng stream nhanh kèm hỗ trợ âm thanh.
Ngoài ra, chúng ta sẽ dùng PyNGrok để mở vLLM server qua endpoint công khai, giúp ứng dụng trên máy cục bộ của bạn truy cập được.
Bước 1: Cài đặt phụ thuộc
Bắt đầu bằng việc cài các phụ thuộc trong môi trường Colab. Chạy lệnh sau trong ô Colab:
Chúng ta cài các thư viện cần thiết bằng uv, trình cài gói Python nhanh hơn. Lệnh này lấy bản nightly của vllm[audio] bao gồm hỗ trợ thử nghiệm cho các mô hình ngôn ngữ–âm thanh như Voxtral. Nếu môi trường của bạn chưa có uv, hãy cài uv trước bằng lệnh sau:
Tiếp theo, cài gói mistral-common, cung cấp các tiện ích thiết yếu để tương tác với Voxtral và các mô hình họ Mistral khác. Gói này gồm tokenizer khớp với triển khai chính thức và xác thực dựa trên Pydantic cho cấu trúc thông điệp.
Gói mistral-common chứa các mô-đun tiện ích cho Voxtral và các mô hình thuộc họ Mistral. Gồm tokenizer, thông điệp kiểu hóa theo định dạng Pydantic, và hàm trợ giúp âm thanh. Bước này đảm bảo tương thích với cách Voxtral xử lý nội bộ đầu vào âm thanh và thông điệp có cấu trúc.
Bước 3: Thiết lập VLLM
Khi các phụ thuộc Mistral cơ bản đã sẵn sàng, tiếp theo thiết lập vLLM bằng cách clone vào repository chính của nó.
Bước 3.1: Clone repository vLLM
Chúng ta clone repository GitHub chính thức của vLLM, nơi cung cấp các ví dụ âm thanh dựng sẵn và là nền tảng để khởi chạy suy luận ngoại tuyến hoặc dạng hosted.
!git clone https://github.com/vllm-project/vllm && cd vllmĐược hỗ trợ bởi
Bước 3.2: Chạy suy luận âm thanh mẫu
Hãy chạy kiểm tra nhanh để đảm bảo thiết lập của chúng ta đúng.
!python vllm/examples/offline_inference/audio_language.py --num-audios 2--model-type voxtralĐược hỗ trợ bởi
Tôi đã chạy ví dụ ngoại tuyến audio_language.py, ví dụ này thực hiện suy luận ngôn ngữ–âm thanh trên hai mẫu định sẵn bằng mô hình Voxtral và xác nhận việc giải mã âm thanh và sinh văn bản hoạt động đúng.
Bước 4: Thiết lập PyGrok
Sau khi thiết lập vLLM, hãy cấu hình PyNGrok để mở vLLM server trên Colab qua một địa chỉ internet công khai.
Cuộn xuống tab Connect, sao chép thẻ xác thực (ẩn trong ảnh dưới) và lưu nó như một secret trong Colab Secrets.
Tiếp đó, cài PyNGrok trong môi trường Colab và đặt token xác thực bằng NGROK token bạn đã sao chép. Nếu bạn đang làm bản thử nghiệm, có thể truyền trực tiếp token tại đây.
!pip install pyngrok -q
from pyngrok import ngrok
ngrok.set_auth_token("NGROK_TOKEN")Được hỗ trợ bởi
Bước 5: Phục vụ mô hình
Đây là bước chính, nơi chúng ta khởi chạy mô hình Voxtral Mini 3B qua vLLM.
--tokenizer_mode mistral: Dùng tokenizer đặc thù Mistral để tách token chính xác.
--config_format mistral và --load_format mistral: Đảm bảo cấu hình và trọng số mô hình được tải theo định dạng tùy biến của Mistral để duy trì tương thích.
--max-model-len 4864: Đặt độ dài ngữ cảnh đầu vào tối đa là 4864 token.
Lưu ý: Giữ ô này chạy vì đây là máy chủ mô hình đang hoạt động.
Bước 6: Lấy endpoint công khai NGrok
Khi máy chủ vLLM đã chạy, hãy thực thi từng dòng sau trong terminal Python:
from pyngrok import ngrok
ngrok.set_auth_token(NGROK_TOKEN)
public_url = ngrok.connect(8000)print("Public endpoint:", public_url)Được hỗ trợ bởi
Đoạn mã trên sẽ mở mô hình ra internet tại một URL công khai tạm thời như:
Phần này, chúng ta sẽ xây dựng giao diện Streamlit có thể:
Nhận âm thanh đầu vào (người dùng tải lên)
Gửi tới mô hình qua máy chủ vLLM
Hiển thị phiên âm, tóm tắt, và cho phép người dùng đặt câu hỏi
Bước 1: Thiết lập phụ thuộc
Trước khi xây dựng ứng dụng, ta liệt kê tất cả phụ thuộc cần thiết trong tệp requirements.txt. Việc này đảm bảo môi trường nhất quán giữa lần chạy cục bộ và sổ tay Colab.
streamlit>=1.28.0
openai>=1.0.0
mistral-common>=0.0.12
huggingface-hub>=0.19.0
pyngrok>=6.0.0
requests>=2.28.0
pydub>=0.25.1 Được hỗ trợ bởi
Lý do cần từng gói:
streamlit: Thư viện xây dựng giao diện tương tác cho âm thanh.
openai: Giao tiếp với máy chủ vLLM tương thích Voxtral bằng SDK OpenAI.
mistral-common: Cung cấp tiện ích đặc thù Voxtral như AudioChunk và TextChunk.
pyngrok: Mở máy chủ vLLM cục bộ ra internet để ứng dụng Streamlit truy cập.
Pydub: Hỗ trợ chuyển đổi tệp âm thanh phục vụ suy luận.
huggingface-hub và requests: Dùng để lấy mô hình và cấu hình (nếu cần).
Bước 2: Thiết lập biến môi trường
Để cấu hình gọn và dễ mang theo, ta lưu chi tiết API dưới dạng biến môi trường. Bạn có thể khai báo trong tệp .env:
VOXTRAL_API_KEY=dummy-key
VOXTRAL_API_BASE=NGROK_TOKEN/v1
VOXTRAL_MODEL_NAME=mistralai/Voxtral-Mini-3B-2507Được hỗ trợ bởi
VOXTRAL_API_BASE nên trỏ tới vLLM đang chạy của bạn, có thể là localhost (http://localhost:8000) hoặc endpoint công khai ngrok dạng https://80xxxxxxxxxx.ngrok-free.app.
Lưu ý: Hãy thêm /v1 vào cuối API base để tương thích OpenAI.
Bước 3: Thiết lập tệp cấu hình
Để ứng dụng mô-đun, dễ điều chỉnh và sẵn sàng cho sản xuất, ta định nghĩa lớp cấu hình trung tâm trong config.py. Tệp này kiểm soát thiết lập mô hình, truy cập API, định dạng âm thanh hỗ trợ, ngôn ngữ và tùy chọn UI.
Bước 3.1: Tải biến môi trường
Trước khi định nghĩa lớp cấu hình, ta tải các biến môi trường lưu trong tệp .env. Cách này giúp tách thông tin nhạy cảm khỏi mã nguồn.
import os
from typing import Optional
from pathlib import Path
# Load environment variables from .env file
env_file = Path(".env")if env_file.exists():withopen(env_file,'r')as f:for line in f:if line.strip()andnot line.startswith('#'):
key, value = line.strip().split('=',1)
os.environ[key]= valueĐược hỗ trợ bởi
Đoạn mã này kiểm tra tệp .env trong thư mục gốc. Nếu có, nó đọc cặp khóa–giá trị và đặt thành biến môi trường. Các giá trị này có thể truy cập qua os.getenv(), đảm bảo bí mật không bị hardcode vào ứng dụng.
Bước 3.2: Định nghĩa lớp Config
Giờ hãy gói tất cả thiết lập vào lớp Config gọn gàng để dễ truy cập và tái sử dụng.
Kết hợp lại, lớp Config là trung tâm điều khiển cho ứng dụng dùng Voxtral của bạn. Dù là cấu hình tham số mô hình, quản lý định dạng âm thanh, hay đặt chủ đề ứng dụng, thiết lập này giúp trừu tượng rõ ràng, tái sử dụng và dễ bảo trì.
Lớp bao gồm:
Phương thức get_api_config(): Tập trung mọi thông tin xác thực liên quan API. Bất cứ nơi nào ứng dụng gọi mô hình Voxtral, bạn chỉ cần dùng Config.get_api_config() để lấy đủ thông tin một lần.
Phương thức validate_config(): Trước khi suy luận, phương thức này cho phép bạn xác thực các giá trị cấu hình thiết yếu (như base URL) đã được định nghĩa đúng chưa. Nếu chưa, bạn có thể phát hiện sớm và cảnh báo người dùng.
Phương thức get_language_code(): Cho phép H&Đ đa ngôn ngữ mượt mà bằng cách ánh xạ tên ngôn ngữ thân thiện với người dùng từ UI (ví dụ “French”) sang mã ngôn ngữ ISO chuẩn (ví dụ “fr”). Nếu truyền vào ngôn ngữ không hỗ trợ, phương thức trả về None an toàn.
Bước 4: Xây dựng ứng dụng Streamlit
Hãy đi qua từng bước con để tạo giao diện và logic ứng dụng.
Bước 4.1: Thiết lập bố cục và kiểu dáng
Ở bước này, ta khởi tạo frontend Streamlit, nạp phụ thuộc, và thiết lập CSS. Đây là nền tảng trực quan và chức năng của ứng dụng.
Ta import các thư viện thiết yếu cho UI, xử lý tệp, và định dạng thông điệp âm thanh/văn bản bằng gói mistral_common của Voxtral.
Sau đó cấu hình bố cục ứng dụng Streamlit: giao diện hai cột với sidebar mở rộng mặc định.
Cuối cùng, chèn CSS tùy biến để phân tách trực quan các phần UI như tiêu đề, khu vực âm thanh, bong bóng chat và hộp tóm tắt, cải thiện trật tự thị giác bằng tiêu đề được tô điểm, hộp thông tin, và bong bóng chat riêng cho người dùng vs trợ lý.
Bước 4.2: Khởi tạo session và client
Tiếp theo, đảm bảo ứng dụng hoạt động nhất quán qua các lần tải lại bằng cách khởi tạo biến phiên và client.
definit_session_state():
defaults ={'transcription':"",'summary':"",'chat_history':[],'audio_file_path':None}for key, default_value in defaults.items():if key notin st.session_state:
st.session_state[key]= default_value
definitialize_client():
config = Config.get_api_config()
client = OpenAI(
api_key=config["api_key"],
base_url=config["base_url"],)# Test connectiontry:
models = client.models.list()return client
except Exception as e:
st.error(f"Failed to connect to Voxtral API: {str(e)}")
st.info("Make sure your ngrok tunnel is running in Google Colab")returnNoneĐược hỗ trợ bởi
Đoạn mã này thiết lập trạng thái nội bộ của ứng dụng và xử lý kết nối tới máy chủ API Voxtral. Có hai thành phần chính:
Khởi tạo phiên: Đảm bảo dữ liệu người dùng như bản phiên âm, tóm tắt và tệp âm thanh tải lên tồn tại đúng qua các tương tác và lần tải lại ứng dụng.
Khởi tạo client: Kết nối tới mô hình Voxtral Mini 3B chạy cục bộ qua endpoint tương thích OpenAI được vLLM mở ra (thông qua Ngrok). Nếu kết nối thất bại, UI sẽ hiển thị thông báo lỗi.
Bước 4.3: Chia khối âm thanh và phiên âm thời gian thực
Bước này xử lý logic cốt lõi: chuẩn bị tệp âm thanh và tạo bản phiên âm bằng Voxtral Mini 3B.
deffile_to_chunk(file_path:str)-> AudioChunk:
audio = Audio.from_file(file_path, strict=False)return AudioChunk.from_audio(audio)deftranscribe_audio(client, audio_file_path):try:withopen(audio_file_path,"rb")as f:
response = client.audio.transcriptions.create(file=f,
model=Config.MODEL_NAME,
response_format="text",
stream=True)
transcription =""
progress_bar = st.progress(0)
status_text = st.empty()# Collect all chunks first to get total count
chunks =list(response)
total_chunks =len(chunks)for i, chunk inenumerate(chunks):
delta = chunk.choices[0].get("delta",{}).get("content")if delta:
transcription += delta
progress =min((i +1)/max(total_chunks,1),1.0)
progress_bar.progress(progress)
status_text.text(f"Transcribing... {len(transcription)} characters")
progress_bar.empty()
status_text.empty()return transcription
except Exception as e:
st.error(f"Error during transcription: {str(e)}")returnNoneĐược hỗ trợ bởi
Có hai hàm chính ở đây:
Chuyển đổi sang khối âm thanh: Trước tiên, chuyển tệp âm thanh đã tải lên thành định dạng AudioChunk, là yêu cầu đầu vào cho API của Voxtral.
Phiên âm dạng stream với phản hồi tiến độ: Gửi âm thanh tới mô hình ở chế độ stream (stream=True) và giải mã từng khối. Thanh tiến trình cập nhật động theo token nhận được, cung cấp phản hồi thời gian thực về tiến độ phiên âm.
Bước 4.4: Tạo tóm tắt từ âm thanh
Bước này gửi đầu vào âm thanh kèm lời nhắc văn bản tới mô hình Voxtral, mô hình trả về bản tóm tắt cô đọng, có cấu trúc của nội dung âm thanh.
defgenerate_summary(client, audio_file_path):try:
audio_chunk = file_to_chunk(audio_file_path)
text_chunk = TextChunk(text="Please provide a comprehensive summary of this audio content, highlighting the key points and main themes discussed.")
user_msg = UserMessage(content=[audio_chunk, text_chunk]).to_openai()
response = client.chat.completions.create(
model=Config.MODEL_NAME,
messages=[user_msg],
temperature=Config.DEFAULT_TEMPERATURE,
top_p=Config.DEFAULT_TOP_P,)return response.choices[0].message.content
except Exception as e:
st.error(f"Error generating summary: {str(e)}")returnNoneĐược hỗ trợ bởi
Đoạn mã trên dùng một số phương thức và hàm chính để tạo tóm tắt từ âm thanh đã tải lên:
audio_chunk: Trước tiên chuyển tệp âm thanh đã tải lên thành AudioChunk để xử lý âm thanh của Voxtral.
text_chunk: Sau đó dùng lời nhắc văn bản để hướng dẫn mô hình tóm tắt nội dung một cách rõ ràng và đầy đủ.
UserMessage: Kết hợp audio_chunk và text_chunk thành một thông điệp đa phương thức theo định dạng tương thích OpenAI.
Response.choices[0].message.content: Truy xuất phần văn bản tóm tắt từ phản hồi của mô hình.
Bước 4.5: H&Đ đa ngôn ngữ dựa trên âm thanh
Sau khi có tóm tắt, hãy cho phép người dùng đặt câu hỏi ngôn ngữ tự nhiên về nội dung âm thanh đã tải lên. Điều này dùng khả năng đa phương thức của Voxtral bằng cách kết hợp âm thanh với lời nhắc văn bản để tạo câu trả lời theo ngữ cảnh.
Hàm sau cũng hỗ trợ phản hồi đa ngôn ngữ bằng cách điều chỉnh động lời nhắc dựa trên ngôn ngữ đã chọn.
defask_question(client, audio_file_path, question, language="English"):try:
audio_chunk = file_to_chunk(audio_file_path)if language !="English":
question =f"Please answer the following question in {language}: {question}"
text_chunk = TextChunk(text=question)
user_msg = UserMessage(content=[audio_chunk, text_chunk]).to_openai()
response = client.chat.completions.create(
model=Config.MODEL_NAME,
messages=[user_msg],
temperature=Config.DEFAULT_TEMPERATURE,
top_p=Config.DEFAULT_TOP_P,)return response.choices[0].message.content
except Exception as e:
st.error(f"Error asking question: {str(e)}")returnNoneĐược hỗ trợ bởi
Tóm lược những gì diễn ra:
Hàm ask_question() cho phép người dùng hỏi bất kỳ câu hỏi nào về âm thanh đã tải lên.
Bắt đầu bằng việc chuyển tệp đã tải lên thành AudioChunk bằng hàm tái sử dụng file_to_chunk(), chuẩn bị âm thanh theo định dạng API đa phương thức của Voxtral mong đợi.
Tiếp theo, kiểm tra ngôn ngữ đã chọn. Nếu không phải tiếng Anh, câu hỏi của người dùng được thêm hướng dẫn yêu cầu mô hình trả lời bằng ngôn ngữ mong muốn (ví dụ Hindi hoặc Tây Ban Nha).
Câu hỏi của người dùng được bọc trong TextChunk, và cả âm thanh lẫn văn bản được gộp vào UserMessage đa phương thức.
Gửi thông điệp này tới mô hình cùng với các giá trị temperature và top-p từ cấu hình để điều khiển chất lượng sinh.
Mô hình trả về phản hồi một lượt.
Bước 4.6: Thiết lập sidebar
Sidebar đóng vai trò bảng điều khiển, cho phép người dùng quản lý thiết lập phiên, chọn ngôn ngữ đầu ra, kiểm tra kết nối tới API Voxtral và tinh chỉnh hành vi phản hồi của mô hình qua các thanh trượt trực quan.
defrender_sidebar():with st.sidebar:
st.markdown('<h3 class="section-header">Configuration</h3>', unsafe_allow_html=True)# Connection status
st.markdown('<h4>Connection Status</h4>', unsafe_allow_html=True)if st.button("Test Connection"):
client = initialize_client()if client:
st.success("Connected to Voxtral API")else:
st.error("Connection failed")# Language selection
selected_language = st.selectbox("Select language for Q&A:", Config.SUPPORTED_LANGUAGES)# Model configuration
st.markdown('<h4>Model Settings</h4>', unsafe_allow_html=True)
temperature = st.slider("Temperature",0.0,1.0, Config.DEFAULT_TEMPERATURE,0.1)
top_p = st.slider("Top P",0.0,1.0, Config.DEFAULT_TOP_P,0.05)if st.button("Clear Session"):for key in['transcription','summary','chat_history','audio_file_path']:
st.session_state[key]=""if key in['transcription','summary']else[]if key =='chat_history'elseNone
st.rerun()return selected_language, temperature, top_pĐược hỗ trợ bởi
Phân tích đoạn mã trên:
Sidebar: Đối tượng st.sidebar mở một thanh bên có thể thu gọn nơi chứa công cụ cấu hình của ứng dụng.
Kiểm tra kết nối: Nút "Test Connection" gọi hàm initialize_client() để thử kết nối API Voxtral và báo thành công/thất bại bằng cảnh báo Streamlit.
Chọn ngôn ngữ: Menu thả cho phép chọn 1 trong 12 ngôn ngữ hỗ trợ. Lựa chọn này sẽ dùng để yêu cầu mô hình trả lời bằng ngôn ngữ đó.
Tham số mô hình: Thanh trượt cho phép điều khiển các tham số như:
temperature: Điều khiển mức sáng tạo. Giá trị thấp cho phản hồi quyết đoán hơn, giá trị cao cho đa dạng hơn.
top_p: Điều khiển nucleus sampling, giúp giới hạn sinh vào các token có xác suất cao nhất.
Đặt lại phiên: Nút "Clear Session" đặt lại mọi biến trạng thái phiên và chạy lại ứng dụng để bắt đầu mới.
Bước 4.7: Khu vực tải lên và xử lý âm thanh
Phần này cho phép người dùng tải lên tệp âm thanh (.mp3, .wav, v.v.), được lưu tạm thời. Sau khi tải lên, người dùng có thể chọn phiên âm hoặc tạo tóm tắt cấp cao.
Cấu trúc mô-đun giúp việc tải âm thanh, xử lý và lưu kết quả bền vững qua các tương tác trở nên dễ dàng. Cụ thể:
Bộ tải tệp: Cần bộ tải kéo–thả chấp nhận nhiều định dạng âm thanh như trong Config.SUPPORTED_AUDIO_FORMATS. Khi tệp được tải lên, nó được ghi vào tệp tạm và lưu đường dẫn tại st.session_state.audio_file_path.
Khởi tạo client: Khởi tạo client tương thích Voxtral để gọi tóm tắt và phiên âm.
Nút tóm tắt và phiên âm: Định nghĩa hai nút:
Tạo tóm tắt: Khi bấm, nút gửi âm thanh đã tải lên tới mô hình kèm lời nhắc tóm tắt. Hiển thị spinner tiến độ, và nếu thành công, lưu kết quả vào st.session_state.summary.
Phiên âm: Nút này gửi tệp âm thanh tới endpoint phiên âm. Tiến trình thời gian thực hiển thị bằng spinner và kết quả lưu vào st.session_state.transcription.
Cuối cùng, cả hai kết quả được hiển thị trong vùng văn bản.
Bước 4.8: H&Đ đa ngôn ngữ tương tác
Bước này cho phép người dùng đặt câu hỏi về âm thanh đã tải lên bằng nhiều ngôn ngữ (ví dụ: English, Hindi, Spanish). Ngôn ngữ được chọn dùng để định dạng phản hồi của mô hình, và mỗi cặp hỏi–đáp được lưu vào lịch sử hội thoại do session quản lý, hiển thị bằng bong bóng chat.
defrender_qa_section(selected_language):
st.markdown('<h3 class="section-header">Multilingual Q&A</h3>', unsafe_allow_html=True)if st.session_state.audio_file_path:
st.markdown(f'<div class="info-box">Selected language: <strong>{selected_language}</strong></div>', unsafe_allow_html=True)
question = st.text_input(f"Ask a question about the audio (in {selected_language}):",
placeholder="e.g., What is the main topic discussed?")if st.button("Ask Question",type="primary")and question:
client = initialize_client()with st.spinner("Processing your question..."):
answer = ask_question(client, st.session_state.audio_file_path, question, selected_language)if answer:# Chat history
st.session_state.chat_history.append({"question": question,"answer": answer,"language": selected_language,"timestamp": time.strftime("%H:%M:%S")})
st.success("Question answered!")else:
st.error("Failed to get answer. Please try again.")if st.session_state.chat_history:
st.markdown('<h4>Conversation History</h4>', unsafe_allow_html=True)for chat inreversed(st.session_state.chat_history):
st.markdown(f'<div class="chat-message user-message"><strong>Question:</strong> {chat["question"]}</div>', unsafe_allow_html=True)
st.markdown(f'<div class="chat-message assistant-message"><strong>Answer:</strong> {chat["answer"]}</div>', unsafe_allow_html=True)
st.markdown("---")else:
st.markdown('<div class="info-box">Please upload an audio file to start asking questions.</div>', unsafe_allow_html=True)Được hỗ trợ bởi
Phân tích đoạn mã trên:
Nút Ask Question: Ô nhập văn bản cho phép người dùng gõ câu hỏi bằng ngôn ngữ đã chọn và bấm nút Ask Question. Khi bấm, nó:
Khởi tạo client tương thích Voxtral.
Gửi câu hỏi kèm âm thanh đã tải lên tới mô hình.
Hiển thị spinner trong lúc chờ phản hồi của mô hình.
Xử lý phản hồi: Nếu nhận được phản hồi, nó sẽ:
Lưu vào st.session_state.chat_history kèm dấu thời gian.
Hiển thị với định dạng theo vai trò bằng CSS tùy biến (bong bóng người dùng vs trợ lý).
Nếu mô hình lỗi, hiển thị thông báo lỗi rõ ràng.
Lịch sử hội thoại: Nếu có các cặp H&Đ trước đó, chúng được hiển thị theo thứ tự thời gian ngược kèm đường phân cách.
Bước 4.9: Khởi chạy ứng dụng
Bước cuối cùng tập hợp mọi thành phần đã định nghĩa: khởi tạo trạng thái phiên, hiển thị sidebar, xử lý tải âm thanh, phiên âm, tóm tắt, và H&Đ bằng bố cục hai cột.
Khi máy chủ đã chạy và mọi phụ thuộc được cài, bước này đảm bảo ứng dụng được phục vụ tới trình duyệt qua Streamlit và sẵn sàng tương tác.
defmain():
st.markdown('<h1 class="main-header">🎵 Voxtral Audio Assistant</h1>', unsafe_allow_html=True)# Initialize session state
init_session_state()# Render sidebar and get configuration
selected_language, temperature, top_p = render_sidebar()
col1, col2 = st.columns([1,1])with col1:
render_audio_processing()with col2:
render_qa_section(selected_language)
st.markdown("---")
st.markdown("""
<div style="text-align: center;">
<p>Powered by <strong>Voxtral Mini 3B</strong> | Built with Streamlit</p>
<p>Supports multiple languages for audio analysis and Q&A</p>
</div>
""", unsafe_allow_html=True)if __name__ =="__main__":
main()Được hỗ trợ bởi
Hàm main() đóng vai trò điểm vào của ứng dụng. Nó điều phối bố cục, việc hiển thị, và đảm bảo mọi biến phiên cùng thành phần UI được khởi tạo đúng. Tóm tắt các hàm đã định nghĩa:
init_session_state(): Chuẩn bị giá trị mặc định như transcription, summary và chat_history để lưu trạng thái ứng dụng qua các tương tác.
render_sidebar(): Nạp các widget cấu hình gồm bộ chọn ngôn ngữ, kiểm tra kết nối và tham số mô hình.
render_audio_processing(): Cho phép tải và xử lý tệp âm thanh để phiên âm và tạo tóm tắt.
render_qa_section(): Kích hoạt H&Đ đa ngôn ngữ trên âm thanh đã tải lên.
Đảm bảo ứng dụng truy cập được qua URL chỉ định trong VOXTRAL_API_BASE bên trong config.py của bạn. Sau khi cài các phụ thuộc, chạy ứng dụng Streamlit bằng lệnh sau trong terminal:
Trình duyệt sẽ tự động mở giao diện. Ứng dụng giờ đã hoạt động đầy đủ với tải lên âm thanh, phiên âm thời gian thực, tóm tắt và H&Đ đa ngôn ngữ, được vận hành bởi Voxtral Mini 3B.
Bạn có thể tìm toàn bộ mã đã trình bày tại kho GitHub này mà tôi đã thiết lập.
Kết luận
Voxtral Mini 3B là mô hình hiệu quả, mở trọng số cho phiên âm và hiểu lời nói. Trong hướng dẫn này, chúng ta đã chạy nó bằng vLLM, thiết lập API và xây dựng ứng dụng tóm tắt âm thanh bằng Streamlit.
Dù bạn xây dựng bộ tóm tắt podcast, trợ lý cuộc họp hay ứng dụng lệnh giọng nói, Voxtral Mini có thể làm nền tảng cho suy luận âm thanh nhanh và cục bộ.
Tôi là Chuyên gia Google Developers trong lĩnh vực ML (Gen AI), Chuyên gia Kaggle 3x và Đại sứ Women Techmakers với hơn 3 năm kinh nghiệm trong ngành công nghệ. Tôi đồng sáng lập một startup công nghệ y tế vào năm 2020 và hiện đang theo học thạc sĩ khoa học máy tính tại Georgia Tech, chuyên sâu về học máy.
Gần đây Mistral ra mắt các mô hình âm thanh đa phương thức mã nguồn mở đầu tiên của họ, Voxtral Small và Voxtral Mini, được xây dựng trên kiến trúc Mistral 3B và tối ưu hóa riêng cho tác vụ hiểu và chuyển lời nói thành văn bản.
Bài viết này tập trung vào Voxtral Mini 3B, một mô hình gọn nhẹ, mã nguồn mở được thiết kế cho tác vụ âm thanh–sang–văn bản thời gian thực như phiên âm, tóm tắt và H&Đ. Với kích thước hiệu quả và khả năng xử lý ngữ cảnh dài, Voxtral Mini đặc biệt mạnh khi kết hợp với các framework suy luận thông lượng cao như vLLM, lý tưởng để xây dựng ứng dụng âm thanh nhanh, chạy ngoại tuyến.
Trong hướng dẫn này, tôi sẽ giới thiệu cách:
Chúng tôi luôn cập nhật cho độc giả về những tin tức AI mới nhất qua The Median, bản tin miễn phí mỗi thứ Sáu tóm lược các câu chuyện chính trong tuần. Đăng ký để nắm bắt nhanh chỉ trong vài phút mỗi tuần:
Voxtral của Mistral là gì?
Voxtral là họ mô hình âm thanh mã nguồn mở hoàn toàn của Mistral, được thiết kế cho khả năng hiểu lời nói mạnh mẽ. Voxtral có hai kích thước mô hình:
Nguồn: Mistral
Voxtral nhận đầu vào âm thanh thô (như .wav hoặc .mp3) và được huấn luyện để tạo bản phiên âm và tóm tắt nội dung nói một cách hiệu quả. Voxtral là biến thể nhỏ hơn, tối ưu cho suy luận nhanh và triển khai ngoại tuyến.
Mô hình tuân theo định dạng của Mistral và tương thích với các framework suy luận thông lượng cao như vLLM, trở thành lựa chọn tuyệt vời cho phiên âm thời gian thực hoặc ứng dụng giọng nói gọn nhẹ.
Cách chạy Voxtral Mini 3B bằng vLLM
Phần này sẽ hướng dẫn bạn phục vụ Voxtral Mini 3B bằng vLLM trên Colab Pro với GPU T4. vLLM được chọn vì khả năng phục vụ thông lượng cao, độ trễ thấp, lý tưởng cho các mô hình như Voxtral cần phản hồi dạng stream nhanh kèm hỗ trợ âm thanh.
Ngoài ra, chúng ta sẽ dùng PyNGrok để mở vLLM server qua endpoint công khai, giúp ứng dụng trên máy cục bộ của bạn truy cập được.
Bước 1: Cài đặt phụ thuộc
Bắt đầu bằng việc cài các phụ thuộc trong môi trường Colab. Chạy lệnh sau trong ô Colab:
Chúng ta cài các thư viện cần thiết bằng uv, trình cài gói Python nhanh hơn. Lệnh này lấy bản nightly của
vllm[audio]bao gồm hỗ trợ thử nghiệm cho các mô hình ngôn ngữ–âm thanh như Voxtral. Nếu môi trường của bạn chưa cóuv, hãy càiuvtrước bằng lệnh sau:Bước 2: Cài đặt Mistral-Common
Tiếp theo, cài gói
mistral-common, cung cấp các tiện ích thiết yếu để tương tác với Voxtral và các mô hình họ Mistral khác. Gói này gồm tokenizer khớp với triển khai chính thức và xác thực dựa trên Pydantic cho cấu trúc thông điệp.Gói mistral-common chứa các mô-đun tiện ích cho Voxtral và các mô hình thuộc họ Mistral. Gồm tokenizer, thông điệp kiểu hóa theo định dạng Pydantic, và hàm trợ giúp âm thanh. Bước này đảm bảo tương thích với cách Voxtral xử lý nội bộ đầu vào âm thanh và thông điệp có cấu trúc.
Bước 3: Thiết lập VLLM
Khi các phụ thuộc Mistral cơ bản đã sẵn sàng, tiếp theo thiết lập vLLM bằng cách clone vào repository chính của nó.
Bước 3.1: Clone repository vLLM
Chúng ta clone repository GitHub chính thức của vLLM, nơi cung cấp các ví dụ âm thanh dựng sẵn và là nền tảng để khởi chạy suy luận ngoại tuyến hoặc dạng hosted.
Bước 3.2: Chạy suy luận âm thanh mẫu
Hãy chạy kiểm tra nhanh để đảm bảo thiết lập của chúng ta đúng.
Tôi đã chạy ví dụ ngoại tuyến
audio_language.py, ví dụ này thực hiện suy luận ngôn ngữ–âm thanh trên hai mẫu định sẵn bằng mô hình Voxtral và xác nhận việc giải mã âm thanh và sinh văn bản hoạt động đúng.Bước 4: Thiết lập PyGrok
Sau khi thiết lập vLLM, hãy cấu hình PyNGrok để mở vLLM server trên Colab qua một địa chỉ internet công khai.
Tiếp đó, cài PyNGrok trong môi trường Colab và đặt token xác thực bằng NGROK token bạn đã sao chép. Nếu bạn đang làm bản thử nghiệm, có thể truyền trực tiếp token tại đây.
Bước 5: Phục vụ mô hình
Đây là bước chính, nơi chúng ta khởi chạy mô hình Voxtral Mini 3B qua vLLM.
Đoạn mã bao gồm vài cờ quan trọng:
--tokenizer_mode mistral: Dùng tokenizer đặc thù Mistral để tách token chính xác.--config_format mistralvà--load_format mistral: Đảm bảo cấu hình và trọng số mô hình được tải theo định dạng tùy biến của Mistral để duy trì tương thích.--max-model-len 4864: Đặt độ dài ngữ cảnh đầu vào tối đa là 4864 token.Lưu ý: Giữ ô này chạy vì đây là máy chủ mô hình đang hoạt động.
Bước 6: Lấy endpoint công khai NGrok
Khi máy chủ vLLM đã chạy, hãy thực thi từng dòng sau trong terminal Python:
Đoạn mã trên sẽ mở mô hình ra internet tại một URL công khai tạm thời như:
Hãy lưu URL này, nó sẽ được dùng trong
config.pycục bộ để kết nối tới mô hình từ xa. Sau khi chạy xong, hãy chấm dứt kết nối bằng lệnh:Xây dựng bản demo phiên âm và tóm tắt âm thanh
Phần này, chúng ta sẽ xây dựng giao diện Streamlit có thể:
Bước 1: Thiết lập phụ thuộc
Trước khi xây dựng ứng dụng, ta liệt kê tất cả phụ thuộc cần thiết trong tệp
requirements.txt. Việc này đảm bảo môi trường nhất quán giữa lần chạy cục bộ và sổ tay Colab.Lý do cần từng gói:
AudioChunkvàTextChunk.Bước 2: Thiết lập biến môi trường
Để cấu hình gọn và dễ mang theo, ta lưu chi tiết API dưới dạng biến môi trường. Bạn có thể khai báo trong tệp
.env:VOXTRAL_API_BASEnên trỏ tới vLLM đang chạy của bạn, có thể là localhost (http://localhost:8000) hoặc endpoint công khai ngrok dạng https://80xxxxxxxxxx.ngrok-free.app.Lưu ý: Hãy thêm
/v1vào cuối API base để tương thích OpenAI.Bước 3: Thiết lập tệp cấu hình
Để ứng dụng mô-đun, dễ điều chỉnh và sẵn sàng cho sản xuất, ta định nghĩa lớp cấu hình trung tâm trong
config.py. Tệp này kiểm soát thiết lập mô hình, truy cập API, định dạng âm thanh hỗ trợ, ngôn ngữ và tùy chọn UI.Bước 3.1: Tải biến môi trường
Trước khi định nghĩa lớp cấu hình, ta tải các biến môi trường lưu trong tệp
.env. Cách này giúp tách thông tin nhạy cảm khỏi mã nguồn.Đoạn mã này kiểm tra tệp
.envtrong thư mục gốc. Nếu có, nó đọc cặp khóa–giá trị và đặt thành biến môi trường. Các giá trị này có thể truy cập quaos.getenv(), đảm bảo bí mật không bị hardcode vào ứng dụng.Bước 3.2: Định nghĩa lớp Config
Giờ hãy gói tất cả thiết lập vào lớp
Configgọn gàng để dễ truy cập và tái sử dụng.Kết hợp lại, lớp
Configlà trung tâm điều khiển cho ứng dụng dùng Voxtral của bạn. Dù là cấu hình tham số mô hình, quản lý định dạng âm thanh, hay đặt chủ đề ứng dụng, thiết lập này giúp trừu tượng rõ ràng, tái sử dụng và dễ bảo trì.Lớp bao gồm:
get_api_config(): Tập trung mọi thông tin xác thực liên quan API. Bất cứ nơi nào ứng dụng gọi mô hình Voxtral, bạn chỉ cần dùng Config.get_api_config() để lấy đủ thông tin một lần.validate_config(): Trước khi suy luận, phương thức này cho phép bạn xác thực các giá trị cấu hình thiết yếu (như base URL) đã được định nghĩa đúng chưa. Nếu chưa, bạn có thể phát hiện sớm và cảnh báo người dùng.get_language_code(): Cho phép H&Đ đa ngôn ngữ mượt mà bằng cách ánh xạ tên ngôn ngữ thân thiện với người dùng từ UI (ví dụ “French”) sang mã ngôn ngữ ISO chuẩn (ví dụ “fr”). Nếu truyền vào ngôn ngữ không hỗ trợ, phương thức trả về None an toàn.Bước 4: Xây dựng ứng dụng Streamlit
Hãy đi qua từng bước con để tạo giao diện và logic ứng dụng.
Bước 4.1: Thiết lập bố cục và kiểu dáng
Ở bước này, ta khởi tạo frontend Streamlit, nạp phụ thuộc, và thiết lập CSS. Đây là nền tảng trực quan và chức năng của ứng dụng.
Trong đoạn Python và CSS trên:
mistral_commoncủa Voxtral.Bước 4.2: Khởi tạo session và client
Tiếp theo, đảm bảo ứng dụng hoạt động nhất quán qua các lần tải lại bằng cách khởi tạo biến phiên và client.
Đoạn mã này thiết lập trạng thái nội bộ của ứng dụng và xử lý kết nối tới máy chủ API Voxtral. Có hai thành phần chính:
Bước 4.3: Chia khối âm thanh và phiên âm thời gian thực
Bước này xử lý logic cốt lõi: chuẩn bị tệp âm thanh và tạo bản phiên âm bằng Voxtral Mini 3B.
Có hai hàm chính ở đây:
AudioChunk, là yêu cầu đầu vào cho API của Voxtral.stream=True) và giải mã từng khối. Thanh tiến trình cập nhật động theo token nhận được, cung cấp phản hồi thời gian thực về tiến độ phiên âm.Bước 4.4: Tạo tóm tắt từ âm thanh
Bước này gửi đầu vào âm thanh kèm lời nhắc văn bản tới mô hình Voxtral, mô hình trả về bản tóm tắt cô đọng, có cấu trúc của nội dung âm thanh.
Đoạn mã trên dùng một số phương thức và hàm chính để tạo tóm tắt từ âm thanh đã tải lên:
audio_chunk: Trước tiên chuyển tệp âm thanh đã tải lên thànhAudioChunkđể xử lý âm thanh của Voxtral.text_chunk: Sau đó dùng lời nhắc văn bản để hướng dẫn mô hình tóm tắt nội dung một cách rõ ràng và đầy đủ.UserMessage: Kết hợpaudio_chunkvàtext_chunkthành một thông điệp đa phương thức theo định dạng tương thích OpenAI.Response.choices[0].message.content: Truy xuất phần văn bản tóm tắt từ phản hồi của mô hình.Bước 4.5: H&Đ đa ngôn ngữ dựa trên âm thanh
Sau khi có tóm tắt, hãy cho phép người dùng đặt câu hỏi ngôn ngữ tự nhiên về nội dung âm thanh đã tải lên. Điều này dùng khả năng đa phương thức của Voxtral bằng cách kết hợp âm thanh với lời nhắc văn bản để tạo câu trả lời theo ngữ cảnh.
Hàm sau cũng hỗ trợ phản hồi đa ngôn ngữ bằng cách điều chỉnh động lời nhắc dựa trên ngôn ngữ đã chọn.
Tóm lược những gì diễn ra:
ask_question()cho phép người dùng hỏi bất kỳ câu hỏi nào về âm thanh đã tải lên.AudioChunkbằng hàm tái sử dụngfile_to_chunk(), chuẩn bị âm thanh theo định dạng API đa phương thức của Voxtral mong đợi.TextChunk, và cả âm thanh lẫn văn bản được gộp vàoUserMessageđa phương thức.Bước 4.6: Thiết lập sidebar
Sidebar đóng vai trò bảng điều khiển, cho phép người dùng quản lý thiết lập phiên, chọn ngôn ngữ đầu ra, kiểm tra kết nối tới API Voxtral và tinh chỉnh hành vi phản hồi của mô hình qua các thanh trượt trực quan.
Phân tích đoạn mã trên:
st.sidebarmở một thanh bên có thể thu gọn nơi chứa công cụ cấu hình của ứng dụng.initialize_client()để thử kết nối API Voxtral và báo thành công/thất bại bằng cảnh báo Streamlit.temperature: Điều khiển mức sáng tạo. Giá trị thấp cho phản hồi quyết đoán hơn, giá trị cao cho đa dạng hơn.top_p: Điều khiển nucleus sampling, giúp giới hạn sinh vào các token có xác suất cao nhất.Bước 4.7: Khu vực tải lên và xử lý âm thanh
Phần này cho phép người dùng tải lên tệp âm thanh (.mp3, .wav, v.v.), được lưu tạm thời. Sau khi tải lên, người dùng có thể chọn phiên âm hoặc tạo tóm tắt cấp cao.
Cấu trúc mô-đun giúp việc tải âm thanh, xử lý và lưu kết quả bền vững qua các tương tác trở nên dễ dàng. Cụ thể:
Config.SUPPORTED_AUDIO_FORMATS. Khi tệp được tải lên, nó được ghi vào tệp tạm và lưu đường dẫn tạist.session_state.audio_file_path.st.session_state.summary.st.session_state.transcription.Bước 4.8: H&Đ đa ngôn ngữ tương tác
Bước này cho phép người dùng đặt câu hỏi về âm thanh đã tải lên bằng nhiều ngôn ngữ (ví dụ: English, Hindi, Spanish). Ngôn ngữ được chọn dùng để định dạng phản hồi của mô hình, và mỗi cặp hỏi–đáp được lưu vào lịch sử hội thoại do session quản lý, hiển thị bằng bong bóng chat.
Phân tích đoạn mã trên:
Ask Question: Ô nhập văn bản cho phép người dùng gõ câu hỏi bằng ngôn ngữ đã chọn và bấm nút Ask Question. Khi bấm, nó:st.session_state.chat_historykèm dấu thời gian.Bước 4.9: Khởi chạy ứng dụng
Bước cuối cùng tập hợp mọi thành phần đã định nghĩa: khởi tạo trạng thái phiên, hiển thị sidebar, xử lý tải âm thanh, phiên âm, tóm tắt, và H&Đ bằng bố cục hai cột.
Khi máy chủ đã chạy và mọi phụ thuộc được cài, bước này đảm bảo ứng dụng được phục vụ tới trình duyệt qua Streamlit và sẵn sàng tương tác.
Hàm
main()đóng vai trò điểm vào của ứng dụng. Nó điều phối bố cục, việc hiển thị, và đảm bảo mọi biến phiên cùng thành phần UI được khởi tạo đúng. Tóm tắt các hàm đã định nghĩa:init_session_state(): Chuẩn bị giá trị mặc định nhưtranscription,summaryvàchat_historyđể lưu trạng thái ứng dụng qua các tương tác.render_sidebar(): Nạp các widget cấu hình gồm bộ chọn ngôn ngữ, kiểm tra kết nối và tham số mô hình.render_audio_processing(): Cho phép tải và xử lý tệp âm thanh để phiên âm và tạo tóm tắt.render_qa_section(): Kích hoạt H&Đ đa ngôn ngữ trên âm thanh đã tải lên.Khi mọi thứ sẵn sàng, chạy ứng dụng bằng:
Đảm bảo ứng dụng truy cập được qua URL chỉ định trong
VOXTRAL_API_BASEbên trongconfig.pycủa bạn. Sau khi cài các phụ thuộc, chạy ứng dụng Streamlit bằng lệnh sau trong terminal:Trình duyệt sẽ tự động mở giao diện. Ứng dụng giờ đã hoạt động đầy đủ với tải lên âm thanh, phiên âm thời gian thực, tóm tắt và H&Đ đa ngôn ngữ, được vận hành bởi Voxtral Mini 3B.