使用 FunASR 工具包實現音頻文件的語音識別,并將識別結果保存為文本文件,支持單文件處理和批量處理。電腦環境需要配置,我使用的PyTorch版本: 2.4.1+cu121,CUDA可用: True。
FunASR 是一個功能強大、性能卓越、面向工業應用的語音識別開源項目。?? 它憑借其非自回歸的 Paraformer 模型提供了極快的推理速度。如果您正在尋找一個能夠進行高性能、低延遲、離線部署的中文(也支持英文和多語言)語音識別解決方案,FunASR 是一個非常好的選擇。
主要流程
- 1、創建識別器實例,加載預訓練的語音識別模型,并自動選擇運行設備(GPU 優先)。
class FunASRRecognizer:def __init__(self):# 打印環境信息print(f"PyTorch版本: {torch.__version__}")print(f"CUDA可用: {torch.cuda.is_available()}")# 加載模型(指定預訓練模型和運行設備)self.model = AutoModel(model="iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch",device="cuda" if torch.cuda.is_available() else "cpu")
- 2、接收音頻文件路徑,調用模型進行語音識別,返回識別結果。
def recognize_audio(self, audio_path):try:# 調用模型生成識別結果(核心識別邏輯)result = self.model.generate(input=audio_path)return resultexcept Exception as e:print(f"識別錯誤: {e}")return None
- 3、將識別結果提取為文本,保存到指定目錄的 TXT 文件中(文件名與音頻文件對應)。
def save_result_to_txt(self, audio_path, result):# 提取音頻文件名(不含擴展名)audio_name = Path(audio_path).stemtxt_path = f"res2/{audio_name}.txt" # 保存路徑# 提取文本內容(處理模型返回的結果格式)if isinstance(result, list) and len(result) > 0:text = result[0].get('text', '')else:text = str(result)# 寫入文件with open(txt_path, 'w', encoding='utf-8') as f:f.write(text)return txt_path
- 4、整合 “識別” 與 “保存” 步驟,檢查文件存在性,輸出處理狀態。
def process_single_audio(self, audio_path):# 檢查文件是否存在if not os.path.exists(audio_path):print(f"音頻文件不存在: {audio_path}")return False# 調用識別方法result = self.recognize_audio(audio_path)# 若識別成功,保存結果并打印if result:self.save_result_to_txt(audio_path, result)print(f"識別文本: {result[0].get('text', '')}")return Trueelse:print("識別失敗")return False
- 5、批量文件處理,掃描指定文件夾中的所有音頻文件(支持多種格式),逐個調用單文件處理邏輯。
def process_multiple_audios(self, audio_folder, extensions=['.mp3', '.wav', '.flac', '.m4a']):# 檢查文件夾存在性if not os.path.exists(audio_folder):print(f"文件夾不存在: {audio_folder}")return# 收集所有指定格式的音頻文件(含大小寫擴展名)audio_files = []for ext in extensions:audio_files.extend(Path(audio_folder).glob(f"*{ext}"))audio_files.extend(Path(audio_folder).glob(f"*{ext.upper()}"))# 逐個處理音頻文件并統計成功數量success_count = 0for audio_file in audio_files:if self.process_single_audio(str(audio_file)):success_count += 1print(f"處理完成!成功: {success_count}/{len(audio_files)}")