本專案包含自動語音識別 (ASR) 和命名實體識別 (NER) 兩個主要功能模組。
本專案需分別建立兩個 Python3.10 環境,因 Nemo 與 Whisper 相關套件互斥,請分開安裝:
pip install -U nemo_toolkit["asr"]
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
pip install seqeval datasets pytorch-crfpip install -r requirements_Whisper.txt
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
⚠️ 重要提醒
除非執行 Whisper 相關功能,否則所有操作皆於 Nemo 環境進行,僅在需要使用 Whisper 時才需切換至 Whisper 環境。
下載連結: 請見隨附txt檔
└── AICUP/
├── ASR/ # 自動語音辨識 (Automatic Speech Recognition)
│ ├── fintuned_model/
│ │ └── Speech_To_Text_Finetuning.nemo # parakeet-tdt-0.6b-v2.nemo 微調後模型(需要手動放置)
│ ├── nemo_experiments/ # nemo 微調預設存放位置
│ ├── test_result/ # 預測結果
│ │ ├── task1_answer_en.txt # task1 的答案 (英文)(需要手動放置,因為ASR存在一定隨機性,不放置會跑不出我們的結果)
│ │ └── task1_answer_en.json # task1 的答案 (英文時間戳)(需要手動放置,因為ASR存在一定隨機性,不放置會跑不出我們的結果)
│ ├── train_config/
│ │ └── speech_to_text_finetune.yaml # 微調參數設定檔
│ ├── lang_detect.py # 中英文分割程式
│ ├── parakeet_asr_predictor.py # 英文 ASR 預測
│ ├── speech_to_text_finetune.py # 英文 ASR 訓練
│ └── parakeet-tdt-0.6b-v2.nemo # 預訓練權重(需要手動放置)
│
├── ChineseASR/
│ ├── test_result/ # 預測結果
│ │ ├── task1_answer_zh.txt # task1 的答案 (中文)(需要手動放置,因為ASR存在一定隨機性,不放置會跑不出我們的結果)
│ │ └── task1_answer_zh.json # task1 的答案 (中文時間戳)(需要手動放置,因為ASR存在一定隨機性,不放置會跑不出我們的結果)
│ └── predict.py # 中文 ASR 預測
│
├── datasets/
│ ├── train80/
│ │ ├── audio/ # train1+train2 (英文,不含編號 80000 開始的) 的所有音檔(需要手動放置)
│ │ ├── audio_16k/ # 執行 createManifest.py 後的 16k 音檔(可手動放置或自己產生)
│ │ ├── audio_NoBGM/ # audio 內的音檔經過去人聲處理(可手動放置或自己產生)
│ │ ├── task1_answer.txt # train1+train2 (英文,不含編號 80000 開始的) 的轉錄檔合成(需要手動放置)
│ │ ├── task2_answer.txt # train1+train2 (英文,不含編號 80000 開始的) 的 task2 label(需要手動放置)
│ │ └── train_manifest.json # 執行 createManifest.py 後的 json檔
│ ├── val20/
│ │ ├── audio/ # val 的所有音檔(需要手動放置)
│ │ ├── audio_16k/ # 執行 createManifest.py 後的 16k 音檔(可手動放置或自己產生)
│ │ ├── audio_NoBGM/ # audio 內的音檔經過去人聲處理(可手動放置或自己產生)
│ │ ├── task1_answer.txt # 官方val文件(需要手動放置)
│ │ ├── task2_answer.txt # 官方val文件(需要手動放置)
│ │ └── val_manifest.json # 執行 createManifest.py 後的 json檔
│ ├── test/
│ │ ├── audio/ # test 的所有音檔(需要手動放置)
│ │ ├── audio_NoBGM/ # audio 內的音檔經過去人聲處理(需要手動放置)(可手動放置或自己產生)
│ │ ├── en/ # 使用 lang_detect.py 創建 (沒有去背景音)(可手動放置或自己產生)
│ │ └── zh/ # 使用 lang_detect.py 創建 (有去背景音)(可手動放置或自己產生)
│ ├── convert_audio.py # 轉換音訊至16k
│ ├── createManifest.py # 創建英文微調資料
│ └── rename_script.py # nobgm 改名
│
└── NER/ # 命名實體識別 (Named Entity Recognition)
├── Chinese/
│ ├── datasets/ # 所需所有資料 (中文 NER)
│ │ ├── createBIO.py # 創建NER需要的訓練資料
│ │ ├── chinese_bio.json # 訓練資料(可手動放置或自己產生)
│ │ ├── 中文增強task1.txt # 手動生成的資料 task1
│ │ └── 中文增強task2.txt # 手動生成的資料 task2
│ ├── test_result/ # 預測結果
│ │ └── task2_answer_zh.txt # task2 的答案 (中文)
│ ├── results_ner_microsoft/ # mdeberta-v3-base-crf 微調後模型(需要手動放置)
│ ├── train.py # 訓練 mdeberta-v3-base-crf
│ └── predict.py # 中文 NER 預測
└── Task2/ # 英文 NER (通常 Task2 指的是英文相關任務)
├── datasets/ # 所需所有資料 (英文 NER)
│ ├── createBIO.py # 創建NER需要的訓練資料
│ ├── train_bio.json # 訓練資料(可手動放置或自己產生)
│ ├── val_bio.json # 驗證資料(可手動放置或自己產生)
│ ├── prompt.txt # 生成資料使用的Prompt
│ └── augmented_300.txt # 生成的資料
├── test_result/ # 預測結果
│ └── task2_answer_en.txt # task2 的答案 (英文)
├── results_ner_microsoft/ # mdeberta-v3-base-crf 微調後模型 (需要手動放置)
├── train.py # 訓練 deberta-v3-large-crf
├── predict.py # 英文 NER 預測
├── stacking_predict.py # stacking(未使用)
└── stacking_trainer.py # stacking(未使用)
使用 Ultimate Vocal Remover 軟體去除音訊中的背景音樂。
主要設定:
- 處理方法: MDX-Net
- 分段大小: 256
- 重疊: Default
- 輸出格式: WAV
模型選擇:
- MDX-NET 模型: UVR-MDX-NET Inst HQ 3
選項設定:
- ✅ GPU Conversion (GPU 轉換)
- ⬜ Instrumental Only (僅伴奏)
- ✅ Vocals Only (僅人聲)
- ⬜ Sample Mode (30s) (樣本模式)
重新命名檔案:
將軟體產生的檔案名稱從 {id}_{origName}_(Vocals) 轉換回 {origName}
執行指令:
cd AICUP/datasets
python rename_script.py使用語言檢測模型將音檔分離成中文和英文兩個部分。
修改 lang_detect.py 變數:
AUDIO_DIR: 去除背景音樂的音訊資料夾路徑CHINESE_DIR: 中文音檔輸出路徑ENGLISH_DIR: 英文音檔輸出路徑
執行指令:
cd AICUP/ASR
python lang_detect.py注意: 僅處理英文音檔,中文不做訓練
將音訊轉換為 16kHz 單聲道格式並產生訓練所需的 manifest 檔案。
設定 createManifest.py 變數:
AUDIO_DIR: 去除背景音樂的音訊資料夾路徑TRANSCRIPT_ORIGINAL: task1_answer.txt 路徑MANIFEST_OUTPUT: 輸出 MANIFEST 路徑CONVERTED_AUDIO_DIR: 輸出 16k 音訊路徑
執行指令:
cd AICUP/datasets
python createManifest.py修改 AICUP/ASR/train_config/speech_to_text_finetune.yaml 檔案中的 train_ds 和 validation_ds 的 manifest_filepath
- 下載模型:parakeet-tdt-0.6b-v2.nemo
- 放置在
AICUP/ASR目錄下
cd AICUP/ASR
python speech_to_text_finetune.pyparser.add_argument('--audio_dir', default="../datasets/Test/audio_16k", type=str, help='音頻文件目錄路徑')
parser.add_argument('--output', type=str, help='詳細輸出文件路徑')
parser.add_argument('--labels', default="../datasets/val/task1_answer.txt", type=str, help='標籤文件路徑(用於計算MER)若沒有可以不填')
parser.add_argument('--output_label', type=str, default='test_result/task1_answer_en.txt', help='輸出標籤文件路徑(預設為output_label.txt)')
parser.add_argument('--json_output', default="test_result/task1_answer_en.json", type=str, help='JSON時間戳輸出文件路徑')
parser.add_argument('--model', type=str, default=r'./fintuned_model/Speech_To_Text_Finetuning.nemo', help='模型名稱,若要使用不微調版本使用 AICUP/ASR/parakeet-tdt-0.6b-v2.nemo')cd AICUP/ASR
python parakeet_asr_predictor.pyVAL_AUDIO_DATA_DIR = "要預測的音檔資料夾"
VAL_LABEL_FILE_PATH = "要預測的音檔Label"
OUTPUT_FILE_PATH = "輸出task1_answer.txt路徑"
OUTPUT_JSON_FILE_PATH = "輸出timestamp的路徑"cd AICUP/ChineseASR
python predict.py進入 NER 資料集目錄:
cd AICUP/NER/Task2/datasets修改 createBIO.py,設定以下參數:
bio_json = convert_to_bio_json(
r'../../datasets/val/task1_answer.txt',
r'../../datasets/val/task2_answer.txt',
'./val_bio_raw.json'
)
training_data = convert_to_training_format(
bio_json,
'./val_bio.json'
)參數說明:
- 第一個參數: task1 的 label 檔案路徑
- 第二個參數: task2 的 label 檔案路徑
- 第三個參數: raw bio 的輸出路徑
- 第四個參數: 用來訓練的 bio 輸出路徑
修改 train.py 中的以下參數:
train_file_path: 前面轉換出的 bio 檔案路徑eval_file_path: 前面轉換出的 bio 檔案路徑output_dir: 模型權重輸出資料夾路徑
python train.py修改 predict.py 中的以下參數:
MODEL_PATH: CHECKPOINT 的資料夾路徑INPUT_JSON_PATH: ASR 輸出的帶有_timestamp後綴的 .json 檔案路徑OUTPUT_TXT_PATH: 輸出檔案路徑
執行 NER 預測腳本
進入中文 NER 資料集目錄:
cd AICUP/NER/Chinese/datasets修改 createBIO.py,設定參數:
bio_json = convert_to_bio_json(
r'../../datasets/val/task1_answer.txt',
r'../../datasets/val/task2_answer.txt',
'./val_bio_raw.json'
)
training_data = convert_to_training_format(
bio_json,
'./val_bio.json'
)參數說明:
- 第一個參數: task1 的 label 檔案路徑
- 第二個參數: task2 的 label 檔案路徑
- 第三個參數: raw bio 的輸出路徑
- 第四個參數: 用來訓練的 bio 輸出路徑
修改 train.py 中的以下參數:
train_file_path: 前面轉換出的 bio 檔案路徑eval_file_path: 前面轉換出的 bio 檔案路徑output_dir: 模型權重輸出資料夾路徑
python train.py- 環境管理: 請確實分離 Nemo 和 Whisper 環境
- 路徑設定: 所有檔案路徑請根據實際環境調整
- 模型下載: 確保預訓練模型已正確下載並放置在指定位置
- 資料格式: 注意音訊檔案格式和採樣率要求