保姆级教程:SenseVoice语音识别镜像快速部署与API调用实战
1. 为什么选择SenseVoice语音识别服务?
在开始部署之前,我们先了解一下SenseVoice语音识别服务的核心优势。这个基于ONNX量化的多语言语音识别解决方案,在实际应用中表现出几个显著特点。
1.1 多语言支持能力
SenseVoice支持超过50种语言的自动检测,特别对中文、粤语、英语、日语和韩语有专门优化。这意味着:
- 无需预先指定语言类型
- 混合语言场景下也能准确识别
- 特别适合国际化业务需求
1.2 高效的推理性能
经过量化后的模型体积仅230MB,但性能表现优异:
- 10秒音频推理仅需70毫秒
- 支持批量处理提升吞吐量
- 内存占用显著降低
1.3 丰富的输出功能
除了基础语音转文字外,还提供:
- 情感识别分析
- 音频事件检测(笑声、掌声等)
- 逆文本正则化(ITN)处理
2. 环境准备与快速部署
2.1 系统要求
确保你的系统满足以下基本要求:
- Linux系统(推荐Ubuntu 18.04+)
- Python 3.8或更高版本
- 至少2GB可用内存
- 500MB磁盘空间
2.2 安装依赖
执行以下命令安装所需依赖:
pip install funasr-onnx gradio fastapi uvicorn soundfile jieba这些包各自的作用:
funasr-onnx:核心语音识别推理库gradio:快速构建Web界面fastapi和uvicorn:构建REST API服务soundfile:音频文件处理jieba:中文分词处理
2.3 启动服务
创建app.py文件,内容如下:
from funasr_onnx import SenseVoiceSmall import gradio as gr from fastapi import FastAPI, UploadFile, File from fastapi.responses import JSONResponse import uvicorn import tempfile import os # 初始化模型 model_path = "/root/ai-models/danieldong/sensevoice-small-onnx-quant" model = SenseVoiceSmall(model_path, batch_size=10, quantize=True) app = FastAPI(title="SenseVoice语音识别服务") # Gradio界面 def transcribe_audio(audio_file, language="auto", use_itn=True): if audio_file is None: return "请上传音频文件" try: result = model([audio_file], language=language, use_itn=use_itn) return result[0] except Exception as e: return f"识别失败: {str(e)}" # 创建Gradio界面 interface = gr.Interface( fn=transcribe_audio, inputs=[ gr.Audio(type="filepath", label="上传音频文件"), gr.Dropdown( choices=["auto", "zh", "en", "yue", "ja", "ko"], value="auto", label="语言选择" ), gr.Checkbox(value=True, label="启用逆文本正则化(ITN)") ], outputs=gr.Textbox(label="识别结果"), title="SenseVoice语音识别", description="上传音频文件进行多语言语音识别" ) # FastAPI路由 @app.post("/api/transcribe") async def api_transcribe( file: UploadFile = File(...), language: str = "auto", use_itn: bool = True ): """API转写接口""" with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as tmp_file: content = await file.read() tmp_file.write(content) tmp_path = tmp_file.name try: result = model([tmp_path], language=language, use_itn=use_itn) return JSONResponse({ "status": "success", "text": result[0], "language": language }) finally: os.unlink(tmp_path) @app.get("/health") async def health_check(): return {"status": "healthy"} # 将Gradio挂载到FastAPI app = gr.mount_gradio_app(app, interface, path="/") if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=7860)启动服务:
python3 app.py --host 0.0.0.0 --port 78603. 服务接口使用指南
3.1 Web界面使用
访问http://localhost:7860可以看到直观的Web界面:
- 点击上传按钮或直接拖放音频文件
- 选择语言(默认自动检测)
- 勾选是否启用ITN处理
- 点击提交查看识别结果
3.2 API接口调用
服务提供了标准的REST API接口,可以通过以下方式调用:
curl -X POST "http://localhost:7860/api/transcribe" \ -F "file=@audio.wav" \ -F "language=auto" \ -F "use_itn=true"API返回示例:
{ "status": "success", "text": "今天的天气真好", "language": "zh" }3.3 Python SDK调用
你也可以直接在Python代码中调用:
from funasr_onnx import SenseVoiceSmall model = SenseVoiceSmall( "/root/ai-models/danieldong/sensevoice-small-onnx-quant", batch_size=10, quantize=True ) result = model(["audio.wav"], language="auto", use_itn=True) print(result[0])4. 实际应用示例
4.1 批量处理音频文件
以下代码演示如何批量处理目录中的音频文件:
import os from pathlib import Path def batch_process(input_dir, output_dir): input_dir = Path(input_dir) output_dir = Path(output_dir) output_dir.mkdir(exist_ok=True) model = SenseVoiceSmall( "/root/ai-models/danieldong/sensevoice-small-onnx-quant", batch_size=8, quantize=True ) audio_files = [] for ext in [".wav", ".mp3", ".m4a"]: audio_files.extend(input_dir.glob(f"*{ext}")) results = [] for audio in audio_files: try: text = model([str(audio)], language="auto")[0] output_file = output_dir / f"{audio.stem}.txt" with open(output_file, "w") as f: f.write(text) results.append((audio.name, "success")) except Exception as e: results.append((audio.name, f"failed: {str(e)}")) return results4.2 实时语音转写
对于实时音频流处理,可以使用以下方法:
import numpy as np import sounddevice as sd class RealTimeTranscriber: def __init__(self, model_path, sample_rate=16000): self.model = SenseVoiceSmall(model_path) self.sample_rate = sample_rate self.buffer = [] def callback(self, indata, frames, time, status): self.buffer.append(indata.copy()) if len(self.buffer) >= 5: # 每5个块处理一次 audio = np.concatenate(self.buffer) text = self.model([audio], language="auto")[0] print("识别结果:", text) self.buffer = [] def start(self): with sd.InputStream( callback=self.callback, channels=1, samplerate=self.sample_rate, blocksize=int(0.5 * self.sample_rate) # 0.5秒的块 ): print("开始录音...按任意键停止") input() # 使用示例 transcriber = RealTimeTranscriber( "/root/ai-models/danieldong/sensevoice-small-onnx-quant" ) transcriber.start()5. 常见问题解决
5.1 模型下载问题
如果服务启动时卡在模型下载环节,可以:
- 手动下载模型并放到指定路径
- 使用国内镜像源加速下载
- 检查网络连接是否正常
5.2 音频格式支持
服务支持常见音频格式:
- WAV(推荐)
- MP3
- M4A
- FLAC
如果遇到不支持的格式,可以使用ffmpeg转换:
ffmpeg -i input.amr -ar 16000 -ac 1 output.wav5.3 性能调优建议
根据硬件环境调整以下参数:
batch_size:根据内存大小调整quantize:确保设置为True使用量化模型- 启用GPU加速(如果可用)
6. 总结
通过本教程,你已经学会了:
- 如何快速部署SenseVoice语音识别服务
- 通过Web界面和API使用语音识别功能
- 实现批量处理和实时转写的代码示例
- 常见问题的解决方法
SenseVoice-small-onnx凭借其多语言支持、高效推理和丰富功能,非常适合以下场景:
- 智能客服语音转写
- 会议记录自动生成
- 多媒体内容分析
- 语音交互应用开发
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。