Nguyen5 commited on
Commit
921fc8a
·
1 Parent(s): 9958eb5
.trae/documents/Khắc phục độ chính xác transcript âm thanh (Audio Fidelity Fix).md ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Danh sách file cần chỉnh sửa
2
+
3
+ * /Users/tramynguyen/Documents/GitHub/huggingface/chatbot1/app.py
4
+
5
+ * Phạm vi: khối UI Gradio (Blocks), các callback submit/change/stream; cấu trúc responsive; thêm State.
6
+
7
+ * Hàm/method: `chat_fn`, thêm `transcribe_to_textbox` (stream), bổ sung `AppState` và `gr.State`, cập nhật layout bottom bar, toggle Audio/Text, status hiển thị.
8
+
9
+ * /Users/tramynguyen/Documents/GitHub/huggingface/chatbot1/speech\_io.py
10
+
11
+ * Phạm vi: pipeline ASR/TTS, tiền xử lý audio, hậu xử lý từ vựng, tham số mô hình, thời lượng và VAD đơn giản.
12
+
13
+ * Hàm/method: `get_asr_pipeline`, `transcribe_audio`, helper `_fix_domain_terms`, thêm backend chọn theo ENV, hook để dùng Groq khi bật.
14
+
15
+ * (Tuỳ chọn) /Users/tramynguyen/Documents/GitHub/huggingface/chatbot1/requirements.txt
16
+
17
+ * Phạm vi: thêm phụ thuộc Groq/VAD khi `ASR_BACKEND=groq`.
18
+
19
+ * Mục: `groq`, `@ricky0123/vad-web` (gợi ý phía client), không cài bắt buộc; ghi chú sử dụng ENV.
20
+
21
+ ## Thay đổi chi tiết theo tiêu chí
22
+
23
+ ### app.py
24
+
25
+ 1. State Management
26
+
27
+ * Thêm `from dataclasses import dataclass` và `gr.State(AppState)`.
28
+
29
+ * `@dataclass AppState`: `conversation: list`, `recording_state: str`, `mode: str`, `last_record_path: str|None`, `status_text: str`.
30
+
31
+ * Truyền `state` vào các callback (submit/stream/change) để cập nhật trạng thái.
32
+
33
+ 1. UI giống ChatGPT, responsive
34
+
35
+ * Bottom bar pill: đặt nằm trong khung chat (dịch vị trí), icon `+`, mic `🎤`, nút gửi `➤` nhỏ gọn 32×32.
36
+
37
+ * Loại bỏ viền `chat_text`/`chat_audio`; nền trong suốt cho audio.
38
+
39
+ * Media queries cho mobile (ẩn sidebar, xếp dọc, tăng min‑height textarea).
40
+
41
+ * Đức hoá toàn bộ text/label/placeholder.
42
+
43
+ 1. Toggle Audio/Text
44
+
45
+ * Thêm `Radio("Eingabemodus", ["Audio","Text"])`; handler `toggle_mode` bật/tắt `chat_text`/`chat_audio`; cập nhật `status_text`.
46
+
47
+ 1. Streaming theo hướng dẫn Gradio Automatic Voice Detection
48
+
49
+ * `gr.Audio(..., format="wav", streaming=True)`.
50
+
51
+ * `chat_audio.stream(transcribe_to_textbox, ...)` để điền transcript liên tục.
52
+
53
+ * `chat_audio.change(...)` điền transcript khi kết thúc ghi; cập nhật player “Letzte Aufnahme” và status.
54
+
55
+ 1. Callback
56
+
57
+ * `chat_fn(text_input, audio_path, history, state, lang_sel, auto_tts)`:
58
+
59
+ * Nếu chế độ Audio và ô nhập trống: dùng transcript từ state.
60
+
61
+ * Gọi RAG `answer` và cập nhật `conversation` trong state.
62
+
63
+ * Phát TTS nếu người dùng bật.
64
+
65
+ ### speech\_io.py
66
+
67
+ 1. Pipeline ASR
68
+
69
+ * Cho phép chọn backend qua ENV: `ASR_BACKEND=local|groq`.
70
+
71
+ * Local (Transformers): tiny/base/small; tham số `chunk_length_s`, `stride_length_s` cân bằng tốc độ/độ chính xác.
72
+
73
+ * Groq: stub hàm `transcribe_with_groq(file_path)` để gửi WAV tới `whisper-large-v3-turbo` và đọc `verbose_json` (dùng `no_speech_prob` lọc im lặng).
74
+
75
+ 1. Tiền xử lý
76
+
77
+ * High‑pass 60 Hz, mono‑mix bằng trung bình kênh, chuẩn hoá biên độ, VAD đơn giản (cắt đầu/cuối theo ngưỡng), resample 16 kHz.
78
+
79
+ * Tăng thời lượng tối đa ghi thành 30s (cấu hình bằng ENV).
80
+
81
+ 1. Hậu xử lý từ vựng
82
+
83
+ * Mapping các lỗi nghe nhầm phổ biến sang thuật ngữ “Prüfung/Prüfungsordnung/…”.
84
+
85
+ * Sửa mờ bằng `difflib.get_close_matches` trên từ vựng miền với ngưỡng 0.82.
86
+
87
+ 1. Auto ngôn ngữ
88
+
89
+ * Nếu `ASR_LANGUAGE=auto`, không ép ngôn ngữ cho pipeline để Whisper auto‑detect.
90
+
91
+ ## Benchmark Whisper (không phá tương thích)
92
+
93
+ * Viết module benchmark (script riêng, không bắt buộc chạy runtime): cùng tập WAV, chạy local (tiny/base/small) vs Groq (large‑v3‑turbo), đo:
94
+
95
+ * WER/char‑acc,
96
+
97
+ * Latency end‑to‑end,
98
+
99
+ * CPU/RAM usage,
100
+
101
+ * Tỷ lệ `no_speech_prob` và bỏ lỡ phát ngôn.
102
+
103
+ * Xuất bảng kết quả và khuyến nghị default theo môi trường (local → tiny/base; Groq → large‑v3‑turbo).
104
+
105
+ ## Kiểm thử
106
+
107
+ * Unit:
108
+
109
+ * `transcribe_audio` với WAV tổng hợp (sin tone + giọng giả), kiểm `rms/peak`, VAD cắt lặng, sửa từ vựng.
110
+
111
+ * `toggle_mode` và `transcribe_to_textbox` đảm bảo đúng cập nhật UI.
112
+
113
+ * Integration:
114
+
115
+ * Luồng Audio→Text→RAG→TTS, kiểm tra state cập nhật, không crash.
116
+
117
+ * Responsive render (snapshot CSS) trên kích thước phổ biến.
118
+
119
+ * Regression:
120
+
121
+ * Đảm bảo `answer()` và hiển thị nguồn không đổi.
122
+
123
+ ## Định dạng & Convention
124
+
125
+ * Tuân thủ style Python (PEP8), sắp xếp import, giữ tên hàm/biến theo chuẩn hiện có.
126
+
127
+ * Format đồng nhất, indent 4 spaces, bỏ khoảng trắng thừa.
128
+
129
+ * Comment ngắn gọn ngay trên thay đổi quan trọng (theo yêu cầu người dùng).
130
+
131
+ ## Bản diff dự kiến
132
+
133
+ * app.py: thêm State, chỉnh cấu trúc Blocks, thêm streaming/handlers, CSS responsive; thay đổi nhỏ ở callback và labels.
134
+
135
+ * speech\_io.py: thêm backend Groq (tuỳ chọn), tinh chỉnh tiền/hậu xử lý, ENV cho tham số, tăng thời lượng tối đa.
136
+
137
+ * requirements.txt: thêm `groq` có điều kiện (ghi chú, không bắt buộc).
138
+
139
+ ## Ghi chú an toàn
140
+
141
+ * Không hardcode API key; dùng ENV.
142
+
143
+ * Không log dữ liệu âm thanh người dùng; cung cấp nút xoá bản ghi.
144
+
145
+ ## Tiếp theo
146
+
147
+ * Nếu đồng ý, tôi sẽ cập nhật mã nguồn theo bản kế hoạch này, thêm test tối thiểu và cung cấp diff chi tiết cho từng file.
148
+
app.py CHANGED
@@ -699,6 +699,13 @@ with gr.Blocks(title="Prüfungsrechts-Chatbot (RAG + Sprache) - Enhanced") as de
699
  on_audio_change,
700
  inputs=[chat_audio, vad_toggle],
701
  outputs=[chat_text, vad_indicator, status_display]
 
 
 
 
 
 
 
702
  )
703
 
704
  # Audio Streaming
@@ -706,6 +713,13 @@ with gr.Blocks(title="Prüfungsrechts-Chatbot (RAG + Sprache) - Enhanced") as de
706
  on_audio_change,
707
  inputs=[chat_audio, vad_toggle],
708
  outputs=[chat_text, vad_indicator, status_display]
 
 
 
 
 
 
 
709
  )
710
 
711
  # TTS Button
 
699
  on_audio_change,
700
  inputs=[chat_audio, vad_toggle],
701
  outputs=[chat_text, vad_indicator, status_display]
702
+ ).then(
703
+ process_chat,
704
+ inputs=[chat_text, chat_audio, chatbot, lang_selector, vad_toggle],
705
+ outputs=[chatbot, chat_text, chat_audio, status_display]
706
+ ).then(
707
+ lambda: update_vad_indicator(),
708
+ outputs=[vad_indicator]
709
  )
710
 
711
  # Audio Streaming
 
713
  on_audio_change,
714
  inputs=[chat_audio, vad_toggle],
715
  outputs=[chat_text, vad_indicator, status_display]
716
+ ).then(
717
+ process_chat,
718
+ inputs=[chat_text, chat_audio, chatbot, lang_selector, vad_toggle],
719
+ outputs=[chatbot, chat_text, chat_audio, status_display]
720
+ ).then(
721
+ lambda: update_vad_indicator(),
722
+ outputs=[vad_indicator]
723
  )
724
 
725
  # TTS Button