使用 FunASR 工具包实现音频文件的语音识别

发布于:2025-09-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

使用 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)}")

网站公告

今日签到

点亮在社区的每一天
去签到