Spaces:
Sleeping
Sleeping
| import whisper | |
| import librosa | |
| import numpy as np | |
| import os | |
| import warnings | |
| warnings.filterwarnings("ignore") | |
| def analyze_speaking_audio(audio_path): | |
| print(f"🎤 Đang phân tích file: {audio_path}") | |
| # --- 1. Load Model Whisper (ASR) --- | |
| print("⏳ Đang tải model Whisper (có thể lâu lần đầu)...") | |
| model = whisper.load_model("base") | |
| # --- 2. Transcribe (Chuyển giọng thành chữ) --- | |
| print("📝 Đang chuyển đổi giọng nói...") | |
| result = model.transcribe(audio_path, fp16=False) | |
| transcript = result["text"].strip() | |
| print("\n" + "="*40) | |
| print("TRANSCRIPT:") | |
| print(f"'{transcript}'") | |
| print("="*40 + "\n") | |
| # --- 3. Phân tích Fluency (Trôi chảy) --- | |
| # Dùng librosa để phân tích tín hiệu âm thanh | |
| y, sr = librosa.load(audio_path) | |
| duration = librosa.get_duration(y=y, sr=sr) | |
| # Đếm số từ | |
| word_count = len(transcript.split()) | |
| # Tính tốc độ nói (Words Per Minute - WPM) | |
| wpm = (word_count / duration) * 60 | |
| # Phát hiện khoảng lặng (Pauses) | |
| # top_db: ngưỡng decibel để coi là im lặng | |
| non_silent_intervals = librosa.effects.split(y, top_db=20) | |
| silent_duration = duration - sum([ (end-start)/sr for start, end in non_silent_intervals ]) | |
| pause_ratio = silent_duration / duration | |
| print("ACOUSTIC METRICS:") | |
| print(f"- Thời lượng (Duration): {duration:.2f} giây") | |
| print(f"- Số từ (Word Count): {word_count}") | |
| print(f"- Tốc độ (Speed): {wpm:.2f} WPM (Chuẩn IELTS 6.0+ thường > 100 WPM)") | |
| print(f"- Thời gian im lặng: {silent_duration:.2f} giây ({pause_ratio*100:.1f}%)") | |
| # --- 4. Đánh giá sơ bộ --- | |
| fluency_score_est = 0 | |
| if wpm > 120: fluency_score_est = 7.0 | |
| elif wpm > 100: fluency_score_est = 6.0 | |
| elif wpm > 80: fluency_score_est = 5.0 | |
| else: fluency_score_est = 4.0 | |
| print(f"\n💡 Đánh giá sơ bộ Fluency: ~{fluency_score_est}") | |
| return { | |
| "transcript": transcript, | |
| "wpm": wpm, | |
| "pause_ratio": pause_ratio | |
| } | |
| if __name__ == "__main__": | |
| sample_audio = "data/test_speaking.m4a" | |
| if os.path.exists(sample_audio): | |
| analyze_speaking_audio(sample_audio) | |
| else: | |
| print(f"Không tìm thấy file '{sample_audio}'.") | |
| print("Hãy tạo một file ghi âm tiếng Anh, lưu vào đó và chạy lại.") |