Hướng dẫn này demo quy trình: chia file âm thanh dài thành các đoạn nhỏ (chunks) → nhận diện giọng nói (Speech-to-Text) bằng Google Speech Recognition → lưu kết quả vào file text.
Cài đặt thư viện
pip install pydub pip install audioread pip install SpeechRecognition
Lưu ý: Cần cài FFmpeg hệ thống cho pydub (đọc/ghi nhiều định dạng). Trên Windows: tải ffmpeg.exe thêm vào PATH.
Mã nguồn hoàn chỉnh
import pydub
import speech_recognition as sr
# Load file âm thanh (WAV)
audio = pydub.AudioSegment.from_wav('audio.wav')
audio_length = len(audio) # milliseconds
print(f'Audio Length: {audio_length} ms')
# Cấu hình chia chunk
chunk_length_ms = 60000 # 60 giây
overlap_ms = 8000 # 8 giây overlap để không cắt từ giữa câu
chunk_counter = 1
audio_text = open('audio_text.txt', 'w+', encoding='utf-8')
start = 0
end = 0
flag = 0
for i in range(0, 2 * audio_length, chunk_length_ms):
if i == 0:
start = 0
end = chunk_length_ms
else:
start = end - overlap_ms
end = start + chunk_length_ms
if end >= audio_length:
end = audio_length
flag = 1
chunk = audio[start:end]
chunk_name = f'chunk_{chunk_counter}.wav'
chunk.export(chunk_name, format='wav')
print(f'{chunk_name} start: {start} end: {end}')
# Nhận diện giọng nói
recognizer = sr.Recognizer()
with sr.AudioFile(chunk_name) as source:
chunk_audio = recognizer.record(source)
try:
content = recognizer.recognize_google(chunk_audio, language='vi-VN') # hoặc 'en-US'
audio_text.write(content + '\n')
except sr.UnknownValueError:
print('Không nhận diện được âm thanh')
except sr.RequestError as e:
print(f'Lỗi kết nối Google API: {e}')
chunk_counter += 1
if flag == 1:
audio_text.close()
breakKết quả mẫu
Audio Length: 480052 chunk_1.wav start: 0 end: 60000 chunk_2.wav start: 52000 end: 112000 ... chunk_10.wav start: 468000 end: 480052
File audio_text.txt chứa văn bản nhận diện được.
Lưu ý quan trọng
- Google Speech Recognition API miễn phí có giới hạn request/ngày và yêu cầu internet.
- Overlap (đè lên) giúp không bị mất từ ở ranh giới chunk.
- Đối với file lớn, cân nhắc dùng Google Cloud Speech-to-Text (có free tier) hoặc mô hình offline như Vosk, Whisper.
- Chuyển đổi sample rate về 16kHz mono cho tối ưu nhận diện.
Kết luận
Kết hợp Pydub (xử lý âm thanh) và SpeechRecognition (STT) cho pipeline âm thanh -> văn bản tự động. Phù hợp cho podcast, meeting recording, lecture.