import gradio as gr import speech_recognition as sr import difflib # Hàm chuyển giọng nói thành văn bản từ file def transcribe_speech(audio_file, language_code): recognizer = sr.Recognizer() # Load audio file with sr.AudioFile(audio_file) as source: # Điều chỉnh tiếng ồn nền và ghi âm recognizer.adjust_for_ambient_noise(source, duration=1) audio = recognizer.record(source) try: # Chuyển giọng nói thành văn bản với ngôn ngữ được chọn text = recognizer.recognize_google(audio, language=language_code) return text except sr.UnknownValueError: return "Không thể nhận diện giọng nói" except sr.RequestError as e: return f"Lỗi kết nối dịch vụ Google: {e}" # Hàm so sánh văn bản chuyển đổi với văn bản mẫu def compare_transcription(transcribed_text, reference_text): transcribed_words = transcribed_text.split() reference_words = reference_text.split() incorrect_words = [] for i, word in enumerate(transcribed_words): if i >= len(reference_words) or word.lower() != reference_words[i].lower(): incorrect_words.append(word) matches = difflib.SequenceMatcher(None, transcribed_words, reference_words) accuracy = matches.ratio() * 100 return accuracy, incorrect_words # Hàm tích hợp để dùng trên Gradio def process_speech(reference_text, audio_file, language): # Map language selection to corresponding language code language_code = "vi-VN" if language == "Vietnamese" else "en-US" transcribed_text = transcribe_speech(audio_file, language_code) if "Lỗi" in transcribed_text or "Không thể nhận diện" in transcribed_text: return transcribed_text, None, None accuracy, incorrect_words = compare_transcription(transcribed_text, reference_text) return transcribed_text, f"{accuracy:.2f}%", ", ".join(incorrect_words) if incorrect_words else "Không có từ sai" # Tạo giao diện với Gradio def build_interface(): with gr.Blocks() as demo: # Input cho văn bản mẫu reference_text = gr.Textbox(label="Văn bản mẫu", value="Xin chào, tôi là ChatGPT", lines=2) # Input cho file âm thanh audio_input = gr.Audio(type="filepath", label="Tải lên file âm thanh") # Dropdown cho chọn ngôn ngữ language_selector = gr.Dropdown( choices=["English", "Vietnamese"], label="Chọn ngôn ngữ", value="Vietnamese" # Default value ) # Output hiển thị kết quả transcribed_text = gr.Textbox(label="Văn bản bạn nói") accuracy = gr.Textbox(label="Độ chính xác (%)") incorrect_words = gr.Textbox(label="Những từ nói sai") # Nút kiểm tra được kết nối với chức năng xử lý gr.Button("Ghi âm và kiểm tra").click( fn=process_speech, inputs=[reference_text, audio_input, language_selector], outputs=[transcribed_text, accuracy, incorrect_words] ) return demo # Chạy giao diện demo = build_interface() demo.launch()