使用 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 result
except Exception as e:
print(f"识别错误: {e}")
return None
- 3、将识别结果提取为文本,保存到指定目录的 TXT 文件中(文件名与音频文件对应)。
def save_result_to_txt(self, audio_path, result):
# 提取音频文件名(不含扩展名)
audio_name = Path(audio_path).stem
txt_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 True
else:
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 = 0
for audio_file in audio_files:
if self.process_single_audio(str(audio_file)):
success_count += 1
print(f"处理完成!成功: {success_count}/{len(audio_files)}")