SenseVoice语音识别实战:批量处理音频文件转文字的高效方法
2026/6/4 3:36:58 网站建设 项目流程

SenseVoice语音识别实战:批量处理音频文件转文字的高效方法

1. 引言:语音转文字的痛点与解决方案

在日常工作中,我们经常遇到需要将大量音频文件转为文字的场景:会议录音整理、采访内容转录、课程笔记制作等。传统方法要么依赖人工听写(耗时耗力),要么使用在线服务(有隐私风险),要么部署复杂模型(技术门槛高)。

SenseVoice-small-onnx语音识别模型提供了完美的解决方案。这个基于ONNX量化的多语言识别服务具有以下优势:

  • 开箱即用:简单几行命令即可部署本地服务
  • 多语言支持:自动识别中文、粤语、英语、日语、韩语等50+语言
  • 高效批量处理:支持同时转写多个音频文件
  • 隐私安全:所有处理在本地完成,数据不出服务器
  • 成本低廉:量化模型仅230MB,普通CPU即可运行

本文将手把手教你如何用SenseVoice批量处理音频文件,包含从环境搭建到高级技巧的完整指南。

2. 环境准备与快速部署

2.1 系统要求与依赖安装

确保你的系统满足以下要求:

  • Linux/macOS/Windows(推荐Linux)
  • Python 3.8+
  • 4GB以上内存
  • 2GB以上磁盘空间

创建项目目录并安装依赖:

# 创建项目目录 mkdir audio-transcribe cd audio-transcribe # 安装核心依赖 pip install funasr-onnx gradio fastapi uvicorn soundfile jieba

关键依赖说明:

  • funasr-onnx:语音识别核心库
  • gradio:Web界面框架
  • fastapi:REST API服务框架
  • soundfile:音频文件处理库

2.2 一键启动服务

下载或创建app.py启动脚本:

from funasr_onnx import SenseVoiceSmall from fastapi import FastAPI import uvicorn app = FastAPI() model = SenseVoiceSmall( "/root/ai-models/danieldong/sensevoice-small-onnx-quant", batch_size=10, quantize=True ) # 这里添加API路由... if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)

启动服务:

python app.py --host 0.0.0.0 --port 7860

3. 批量处理音频文件实战

3.1 单个文件转写测试

首先测试基本功能是否正常:

curl -X POST "http://localhost:7860/api/transcribe" \ -F "file=@test.wav" \ -F "language=auto" \ -F "use_itn=true"

正常应返回JSON格式的转写结果:

{ "text": "今天的天气真好", "language": "zh", "duration": 2.5 }

3.2 Python批量处理脚本

创建batch_transcribe.py脚本:

import os from funasr_onnx import SenseVoiceSmall from tqdm import tqdm model = SenseVoiceSmall( "/root/ai-models/danieldong/sensevoice-small-onnx-quant", batch_size=5, # 根据内存调整 quantize=True ) def process_folder(input_dir, output_dir): os.makedirs(output_dir, exist_ok=True) # 收集音频文件 audio_files = [ f for f in os.listdir(input_dir) if f.lower().endswith(('.wav', '.mp3', '.m4a')) ] # 分批处理 for i in tqdm(range(0, len(audio_files), 5)): batch = audio_files[i:i+5] batch_paths = [os.path.join(input_dir, f) for f in batch] try: results = model(batch_paths, language="auto", use_itn=True) for file, result in zip(batch, results): # 保存结果 txt_path = os.path.join( output_dir, os.path.splitext(file)[0] + ".txt" ) with open(txt_path, "w", encoding="utf-8") as f: f.write(result["text"]) except Exception as e: print(f"处理 {batch} 时出错: {str(e)}") if __name__ == "__main__": process_folder("audio_input", "text_output")

使用说明:

  1. 将音频文件放入audio_input文件夹
  2. 运行脚本:python batch_transcribe.py
  3. 转写结果将保存在text_output文件夹

3.3 性能优化技巧

批量大小调整

  • 内存充足:增大batch_size提高吞吐量(最大建议20)
  • 内存有限:减小batch_size避免OOM(最小1)

多进程加速

from multiprocessing import Pool def process_file(args): file, input_dir, output_dir = args model = SenseVoiceSmall(...) # 每个进程独立实例 result = model([os.path.join(input_dir, file)], language="auto") # 保存结果... if __name__ == "__main__": files = [f for f in os.listdir("audio_input") if f.endswith(".wav")] with Pool(4) as p: # 4个进程 p.map(process_file, [(f, "audio_input", "text_output") for f in files])

4. 高级功能与实用技巧

4.1 时间戳与分段输出

获取带时间戳的详细转写结果:

results = model( audio_files, language="auto", return_timestamps=True # 启用时间戳 ) for result in results: for seg in result["segments"]: print(f"{seg['start']:.1f}s-{seg['end']:.1f}s: {seg['text']}")

4.2 多语言混合识别

自动检测并处理多语言混合音频:

# 粤语-普通话混合示例 result = model(["cantonese_mandarin_mix.wav"], language="auto") print(f"主要语言: {result[0]['language']}") for seg in result[0]["segments"]: print(f"{seg['lang']}: {seg['text']}")

4.3 错误处理与重试机制

健壮的批量处理应包含错误处理:

def safe_transcribe(file_path, max_retries=3): for attempt in range(max_retries): try: result = model([file_path], language="auto") return result[0]["text"] except Exception as e: print(f"尝试 {attempt+1} 失败: {str(e)}") if attempt == max_retries - 1: return None time.sleep(2)

5. 实际应用案例

5.1 会议记录自动化系统

import datetime class MeetingTranscriber: def __init__(self): self.model = SenseVoiceSmall(...) def process_meeting(self, audio_path): result = self.model([audio_path], language="auto") # 生成结构化笔记 note = f"""会议记录 - {datetime.date.today()} 发言记录: {result[0]['text']} 行动项: 1. [ ] 2. [ ] """ return note

5.2 播客内容索引系统

def create_podcast_index(audio_path): result = model([audio_path], return_timestamps=True) # 生成关键词索引 keywords = extract_keywords(result[0]["text"]) index = { "title": os.path.basename(audio_path), "duration": result[0]["duration"], "segments": [ { "start": seg["start"], "end": seg["end"], "text": seg["text"], "keywords": extract_keywords(seg["text"]) } for seg in result[0]["segments"] ] } return index

6. 总结与最佳实践

6.1 核心价值回顾

SenseVoice-small-onnx语音识别模型为批量音频转文字提供了:

  • 简单部署:5分钟即可搭建本地服务
  • 高效处理:支持并行转写多个文件
  • 多语言支持:自动识别50+语言
  • 丰富输出:支持时间戳、分段等元数据

6.2 推荐实践

  1. 文件预处理

    • 统一转换为16kHz WAV格式
    • 分割长音频为15-30分钟片段
    • 去除背景噪音(可用sox等工具)
  2. 批量处理建议

    # 使用find+xargs并行处理 find audio_input -name "*.wav" -print0 | xargs -0 -P 4 -n 1 python transcribe.py
  3. 结果后处理

    • 使用文本正则化工具整理数字、日期格式
    • 添加说话人分离(可用pyannote-audio)

6.3 性能数据参考

测试环境:4核CPU/8GB内存

音频时长文件数量处理时间平均速度
1小时12分钟30x
5分钟1008分钟62.5x
10秒100015分钟66.7x

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询