phamhapa101 commited on
Commit
5ef7464
·
verified ·
1 Parent(s): 2d03897

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +51 -30
app.py CHANGED
@@ -1,13 +1,15 @@
1
  import gradio as gr
2
- import whisper
3
  import os
4
  import pandas as pd
5
  from pydub import AudioSegment
6
  import zipfile
7
  import shutil
 
8
 
9
  # Tạo thư mục tạm để xử lý
10
  TEMP_DIR = "temp_dataset"
 
11
 
12
  def format_audio_for_piper(audio_segment):
13
  """
@@ -18,7 +20,7 @@ def format_audio_for_piper(audio_segment):
18
  audio_segment = audio_segment.set_sample_width(2) # 16-bit
19
  return audio_segment
20
 
21
- def create_dataset(audio_path, model_size, speaker_name):
22
  # Kiểm tra đầu vào
23
  if audio_path is None:
24
  return None, 0, pd.DataFrame()
@@ -31,17 +33,28 @@ def create_dataset(audio_path, model_size, speaker_name):
31
  wavs_dir = os.path.join(TEMP_DIR, "wavs")
32
  os.makedirs(wavs_dir, exist_ok=True)
33
 
34
- print(f"Đang tải model Whisper: {model_size}...")
35
  try:
36
- # Load model Whisper
37
- model = whisper.load_model(model_size)
 
 
 
 
 
 
 
38
  except Exception as e:
39
- return None, 0, pd.DataFrame(columns=["Lỗi"], data=[[str(e)]])
40
 
41
- print("Đang xử lý audio...")
42
- # Transcribe audio để lấy text và timestamps
43
- result = model.transcribe(audio_path, language="vi")
44
- segments = result["segments"]
 
 
 
 
45
 
46
  # Load audio gốc bằng pydub
47
  original_audio = AudioSegment.from_file(audio_path)
@@ -49,37 +62,47 @@ def create_dataset(audio_path, model_size, speaker_name):
49
  metadata_rows = []
50
  preview_data = []
51
 
52
- print(f"Tìm thấy {len(segments)} câu. Đang cắt và lưu...")
53
 
54
- for i, segment in enumerate(segments):
55
- start_time = segment["start"] * 1000 # pydub dùng mili giây
56
- end_time = segment["end"] * 1000
57
- text = segment["text"].strip()
 
 
 
 
 
 
 
 
 
58
 
59
- # Bỏ qua các đoạn quá ngắn hoặc không có chữ
60
  if (end_time - start_time) < 500 or len(text) < 2:
61
  continue
62
 
63
  # Cắt audio
64
- chunk = original_audio[start_time:end_time]
65
 
66
  # Chuẩn hóa format cho Piper
67
- chunk = format_audio_for_piper(chunk)
68
 
69
- # Đặt tên file: 0001.wav, 0002.wav...
70
- filename = f"{i:04d}.wav"
71
  save_path = os.path.join(wavs_dir, filename)
72
 
73
- chunk.export(save_path, format="wav")
74
 
75
  # Format Piper: filename|speaker|text
76
  file_id = filename.replace(".wav", "")
77
  row_str = f"{file_id}|{speaker_name}|{text}"
78
  metadata_rows.append(row_str)
79
 
80
- # Data cho bảng xem trước (chỉ lấy 10 dòng đầu để hiển thị nhanh)
81
  if len(preview_data) < 10:
82
  preview_data.append([file_id, speaker_name, text])
 
 
83
 
84
  # Ghi file metadata.csv
85
  csv_path = os.path.join(TEMP_DIR, "metadata.csv")
@@ -98,27 +121,25 @@ def create_dataset(audio_path, model_size, speaker_name):
98
  return zip_filename, len(metadata_rows), pd.DataFrame(preview_data, columns=["ID", "Speaker", "Text"])
99
 
100
  # Giao diện Gradio
101
- with gr.Blocks(title="Auto Piper Dataset Maker") as demo:
102
- gr.Markdown("## 🎧 Tự động tạo Dataset cho Piper TTS")
103
- gr.Markdown("Upload file âm thanh dài -> Tự động cắt câu & nhận dạng chữ (ASR) -> Xuất file ZIP chuẩn Piper.")
 
104
 
105
  with gr.Row():
106
  with gr.Column():
107
  audio_input = gr.Audio(type="filepath", label="Upload Audio Gốc")
108
  speaker_name = gr.Textbox(value="vner", label="Tên người đọc (Speaker Name)")
109
- # Mặc định chọn small hoặc medium để cân bằng tốc độ trên CPU
110
- model_size = gr.Dropdown(choices=["base", "small", "medium"], value="small", label="Whisper Model Size")
111
- btn_submit = gr.Button("🚀 Xử lý & Tạo Dataset", variant="primary")
112
 
113
  with gr.Column():
114
  output_zip = gr.File(label="Tải về Dataset (.zip)")
115
  info_text = gr.Number(label="Số lượng câu đã cắt")
116
- # Đã sửa lỗi: Bỏ tham số max_rows
117
  preview_table = gr.Dataframe(label="Xem trước Metadata (10 câu đầu)", headers=["ID", "Speaker", "Text"])
118
 
119
  btn_submit.click(
120
  fn=create_dataset,
121
- inputs=[audio_input, model_size, speaker_name],
122
  outputs=[output_zip, info_text, preview_table]
123
  )
124
 
 
1
  import gradio as gr
2
+ from transformers import pipeline
3
  import os
4
  import pandas as pd
5
  from pydub import AudioSegment
6
  import zipfile
7
  import shutil
8
+ import torch
9
 
10
  # Tạo thư mục tạm để xử lý
11
  TEMP_DIR = "temp_dataset"
12
+ MODEL_ID = "kelvinbksoh/whisper-large-v2-vietnamese-lyrics-transcription"
13
 
14
  def format_audio_for_piper(audio_segment):
15
  """
 
20
  audio_segment = audio_segment.set_sample_width(2) # 16-bit
21
  return audio_segment
22
 
23
+ def create_dataset(audio_path, speaker_name):
24
  # Kiểm tra đầu vào
25
  if audio_path is None:
26
  return None, 0, pd.DataFrame()
 
33
  wavs_dir = os.path.join(TEMP_DIR, "wavs")
34
  os.makedirs(wavs_dir, exist_ok=True)
35
 
36
+ print(f"Đang tải model: {MODEL_ID}...")
37
  try:
38
+ # Load model bằng Transformers Pipeline
39
+ # Sử dụng CPU (device=-1) cho Space Free. Nếu có GPU thì chỉnh device=0
40
+ device = "cuda" if torch.cuda.is_available() else "cpu"
41
+ pipe = pipeline(
42
+ "automatic-speech-recognition",
43
+ model=MODEL_ID,
44
+ device=device,
45
+ chunk_length_s=30
46
+ )
47
  except Exception as e:
48
+ return None, 0, pd.DataFrame(columns=["Lỗi"], data=[[f"Lỗi tải model: {str(e)}"]])
49
 
50
+ print("Đang xử lý audio (Model Large rất nặng, vui lòng chờ)...")
51
+
52
+ # Transcribe audio: return_timestamps=True là bắt buộc để cắt
53
+ try:
54
+ output = pipe(audio_path, return_timestamps=True, generate_kwargs={"language": "vi"})
55
+ chunks = output["chunks"] # Lấy danh sách các đoạn đã nhận diện
56
+ except Exception as e:
57
+ return None, 0, pd.DataFrame(columns=["Lỗi"], data=[[f"Lỗi xử lý audio: {str(e)}"]])
58
 
59
  # Load audio gốc bằng pydub
60
  original_audio = AudioSegment.from_file(audio_path)
 
62
  metadata_rows = []
63
  preview_data = []
64
 
65
+ print(f"Tìm thấy {len(chunks)} câu. Đang cắt và lưu...")
66
 
67
+ file_counter = 0
68
+
69
+ for chunk in chunks:
70
+ # Transformers trả về timestamp dạng tuple (start, end) đơn vị giây
71
+ timestamp = chunk["timestamp"]
72
+ text = chunk["text"].strip()
73
+
74
+ # Kiểm tra timestamp hợp lệ (đôi khi model trả về None ở cuối)
75
+ if timestamp[0] is None or timestamp[1] is None:
76
+ continue
77
+
78
+ start_time = timestamp[0] * 1000
79
+ end_time = timestamp[1] * 1000
80
 
81
+ # Bỏ qua các đoạn quá ngắn (dưới 0.5s) hoặc không có chữ
82
  if (end_time - start_time) < 500 or len(text) < 2:
83
  continue
84
 
85
  # Cắt audio
86
+ audio_chunk = original_audio[start_time:end_time]
87
 
88
  # Chuẩn hóa format cho Piper
89
+ audio_chunk = format_audio_for_piper(audio_chunk)
90
 
91
+ # Đặt tên file
92
+ filename = f"{file_counter:04d}.wav"
93
  save_path = os.path.join(wavs_dir, filename)
94
 
95
+ audio_chunk.export(save_path, format="wav")
96
 
97
  # Format Piper: filename|speaker|text
98
  file_id = filename.replace(".wav", "")
99
  row_str = f"{file_id}|{speaker_name}|{text}"
100
  metadata_rows.append(row_str)
101
 
 
102
  if len(preview_data) < 10:
103
  preview_data.append([file_id, speaker_name, text])
104
+
105
+ file_counter += 1
106
 
107
  # Ghi file metadata.csv
108
  csv_path = os.path.join(TEMP_DIR, "metadata.csv")
 
121
  return zip_filename, len(metadata_rows), pd.DataFrame(preview_data, columns=["ID", "Speaker", "Text"])
122
 
123
  # Giao diện Gradio
124
+ with gr.Blocks(title="Auto Piper Dataset (Large Model)") as demo:
125
+ gr.Markdown(f"## 🎧 Auto Piper Dataset Maker")
126
+ gr.Markdown(f"Model sử dụng: `{MODEL_ID}` (Whisper Large V2 Fine-tuned)")
127
+ gr.Markdown("⚠️ **Lưu ý:** Model này rất nặng. Quá trình xử lý sẽ chậm hơn nhiều so với model Small.")
128
 
129
  with gr.Row():
130
  with gr.Column():
131
  audio_input = gr.Audio(type="filepath", label="Upload Audio Gốc")
132
  speaker_name = gr.Textbox(value="vner", label="Tên người đọc (Speaker Name)")
133
+ btn_submit = gr.Button("🚀 Xử (Chờ khoảng 2-5 phút)", variant="primary")
 
 
134
 
135
  with gr.Column():
136
  output_zip = gr.File(label="Tải về Dataset (.zip)")
137
  info_text = gr.Number(label="Số lượng câu đã cắt")
 
138
  preview_table = gr.Dataframe(label="Xem trước Metadata (10 câu đầu)", headers=["ID", "Speaker", "Text"])
139
 
140
  btn_submit.click(
141
  fn=create_dataset,
142
+ inputs=[audio_input, speaker_name],
143
  outputs=[output_zip, info_text, preview_table]
144
  )
145