File size: 3,315 Bytes
009db83
 
 
 
e6d5013
66233bc
009db83
 
e6d5013
 
009db83
 
e6d5013
009db83
 
66233bc
 
009db83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66233bc
 
 
 
 
009db83
 
 
 
 
 
 
 
 
 
 
 
 
e6d5013
 
 
 
66233bc
 
 
 
 
 
 
009db83
 
 
 
 
66233bc
e6d5013
 
66233bc
e6d5013
 
009db83
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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()