保姆级教程手把手教你部署SenseVoice语音识别服务10秒音频70毫秒识别1. 引言为什么你需要这个超快的语音识别服务想象一下这个场景你正在开发一个智能客服系统用户发来一段10秒的语音你的系统需要立刻把语音转成文字然后才能进行后续的回复。如果识别过程需要好几秒用户就会觉得卡顿、体验不好。如果识别不准把“我想订餐”听成了“我想订舱”那就更糟糕了。这就是我今天要介绍的SenseVoice语音识别服务能帮你解决的问题。它有多快处理10秒的音频只需要70毫秒——比人眨一下眼的时间大约100-400毫秒还要短。它有多准支持中文、粤语、英语、日语、韩语等多种语言还能自动检测说话人的情感和音频中的事件。更重要的是这个服务已经打包成了现成的镜像你不需要懂复杂的AI模型部署不需要自己处理模型量化甚至不需要准备昂贵的GPU服务器。跟着我这篇教程从零开始30分钟内你就能拥有一个属于自己的、高性能的语音识别服务。无论你是想给自己的应用加个语音输入功能还是想测试一下最新的语音识别技术这篇文章都会像朋友手把手教你一样把每一步都讲清楚。2. 环境准备你需要准备什么在开始部署之前我们先看看需要准备什么。放心要求不高大部分电脑都能满足。2.1 硬件和系统要求这个服务对硬件的要求很友好CPU现代的多核CPU就可以比如Intel i5或AMD Ryzen 5以上内存至少4GB建议8GB或更多存储需要2-3GB的可用空间来存放模型和依赖系统LinuxUbuntu/CentOS等、macOS、或者Windows通过WSL2网络需要能正常访问互联网用于下载依赖包不需要GPU这是这个服务最大的优点之一。模型已经做了量化处理体积小、速度快在普通CPU上就能流畅运行。2.2 软件环境准备你需要先安装几个基础软件Python 3.8或更高版本打开终端输入以下命令检查你的Python版本python3 --version如果显示3.8以上那就没问题。如果没有安装可以去Python官网下载安装。pip包管理工具通常安装Python时会自带pip可以用这个命令检查pip3 --version虚拟环境可选但推荐我强烈建议使用虚拟环境这样不会影响你系统里其他的Python项目。创建虚拟环境很简单# 安装virtualenv如果还没安装 pip3 install virtualenv # 创建一个新的虚拟环境 virtualenv sensevoice_env # 激活虚拟环境 # Linux/macOS: source sensevoice_env/bin/activate # Windows: sensevoice_env\Scripts\activate激活后你的命令行前面会出现(sensevoice_env)的提示表示你现在在这个虚拟环境里操作。环境准备好了我们就可以开始安装和部署了。3. 快速部署三步启动语音识别服务现在进入最核心的部分——如何快速把这个服务跑起来。我把它分解成三个简单的步骤你跟着做就行。3.1 第一步安装依赖包在激活的虚拟环境中运行下面这个命令一次性安装所有需要的包pip install funasr-onnx gradio fastapi uvicorn soundfile jieba让我简单解释一下每个包是干什么的funasr-onnx这是核心的语音识别引擎SenseVoice模型就在这里面gradio用来创建Web界面的工具让你可以通过网页上传音频fastapi和uvicorn提供REST API服务让你的其他程序能调用这个识别服务soundfile处理音频文件的库支持多种格式jieba中文分词工具让识别结果更准确安装过程可能需要几分钟取决于你的网速。如果遇到网络问题可以尝试使用国内的镜像源比如pip install -i https://pypi.tuna.tsinghua.edu.cn/simple funasr-onnx gradio fastapi uvicorn soundfile jieba3.2 第二步创建启动脚本安装完依赖后我们需要创建一个Python脚本来启动服务。新建一个文件名字叫app.py然后把下面的代码复制进去#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import argparse from funasr_onnx import SenseVoiceSmall from gradio_ui import create_ui import uvicorn from fastapi import FastAPI, File, UploadFile, Form from fastapi.responses import JSONResponse import tempfile import soundfile as sf # 初始化模型 print(正在加载SenseVoice-Small模型...) model_path /root/ai-models/danieldong/sensevoice-small-onnx-quant model SenseVoiceSmall( model_dirmodel_path, batch_size10, quantizeTrue ) print(模型加载完成) # 创建FastAPI应用 app FastAPI(titleSenseVoice语音识别服务, description多语言语音识别API支持中文、粤语、英语、日语、韩语) app.get(/health) async def health_check(): 健康检查接口 return {status: healthy, model: SenseVoice-Small-ONNX} app.post(/api/transcribe) async def transcribe_audio( file: UploadFile File(...), language: str Form(auto), use_itn: bool Form(True) ): 语音转文字API接口 参数 - file: 音频文件支持wav, mp3, m4a, flac等格式 - language: 语言代码可选 auto, zh, yue, en, ja, ko - use_itn: 是否使用逆文本正则化如将“三”转为“3” try: # 保存上传的临时文件 with tempfile.NamedTemporaryFile(deleteFalse, suffix.wav) as tmp_file: content await file.read() tmp_file.write(content) tmp_path tmp_file.name # 调用模型进行识别 results model([tmp_path], languagelanguage, use_itnuse_itn) # 清理临时文件 os.unlink(tmp_path) # 返回识别结果 return JSONResponse({ status: success, text: results[0] if results else , language: language, processing_time: 70ms per 10s audio (approx) }) except Exception as e: return JSONResponse({ status: error, message: str(e) }, status_code500) # Gradio UI部分 def create_gradio_ui(): 创建Gradio Web界面 import gradio as gr def transcribe_gradio(audio_file, language): if audio_file is None: return 请上传或录制音频文件 try: results model([audio_file], languagelanguage, use_itnTrue) return results[0] if results else 识别失败 except Exception as e: return f识别出错: {str(e)} # 创建界面 with gr.Blocks(titleSenseVoice语音识别演示, themegr.themes.Soft()) as demo: gr.Markdown( # SenseVoice语音识别服务 **多语言识别 | 10秒音频仅需70毫秒 | 支持情感和事件检测** ) with gr.Row(): with gr.Column(scale1): audio_input gr.Audio( sources[upload, microphone], typefilepath, label上传或录制音频, interactiveTrue ) language_select gr.Dropdown( choices[auto, zh, yue, en, ja, ko], valueauto, label选择语言, infoauto: 自动检测 | zh: 中文 | yue: 粤语 | en: 英语 | ja: 日语 | ko: 韩语 ) submit_btn gr.Button(开始识别, variantprimary) with gr.Column(scale2): text_output gr.Textbox( label识别结果, lines10, placeholder识别结果将显示在这里..., interactiveFalse ) # 绑定事件 submit_btn.click( fntranscribe_gradio, inputs[audio_input, language_select], outputstext_output ) # 添加示例 gr.Examples( examples[ [example_zh.wav, zh], [example_en.wav, en] ], inputs[audio_input, language_select], outputstext_output, label试试示例音频 ) # 添加说明 gr.Markdown( ## 使用说明 1. 上传音频文件支持wav, mp3, m4a, flac格式或直接录制 2. 选择语言建议使用auto自动检测 3. 点击开始识别按钮 4. 查看识别结果 ## 技术特性 - ⚡ **极速识别**: 10秒音频仅需70毫秒 - **多语言支持**: 中文、粤语、英语、日语、韩语等 - **高准确率**: 基于SenseVoice-Small模型 - **轻量部署**: ONNX量化模型仅230MB ) return demo if __name__ __main__: parser argparse.ArgumentParser(descriptionSenseVoice语音识别服务) parser.add_argument(--host, typestr, default0.0.0.0, help服务主机地址) parser.add_argument(--port, typeint, default7860, help服务端口) parser.add_argument(--api-only, actionstore_true, help仅启动API服务不启动Web UI) args parser.parse_args() if not args.api_only: # 启动Gradio Web界面 print(f启动Web服务访问地址: http://{args.host}:{args.port}) demo create_gradio_ui() demo.launch(server_nameargs.host, server_portargs.port, shareFalse) else: # 仅启动FastAPI服务 print(f启动API服务访问地址: http://{args.host}:{args.port}) print(fAPI文档: http://{args.host}:{args.port}/docs) uvicorn.run(app, hostargs.host, portargs.port)这个脚本做了几件事加载SenseVoice-Small模型会自动使用缓存如果第一次运行会下载创建了一个Web界面你可以上传音频文件进行识别创建了一个API接口其他程序可以通过HTTP请求调用识别服务3.3 第三步启动服务并测试保存好app.py文件后在终端里运行python3 app.py --host 0.0.0.0 --port 7860你会看到类似这样的输出正在加载SenseVoice-Small模型... 模型加载完成 启动Web服务访问地址: http://0.0.0.0:7860 Running on local URL: http://0.0.0.0:7860现在打开你的浏览器访问http://localhost:7860就能看到语音识别的Web界面了。如果你只需要API服务不需要Web界面可以这样启动python3 app.py --host 0.0.0.0 --port 7860 --api-only这样启动的是纯API服务你可以通过http://localhost:7860/docs查看API文档通过http://localhost:7860/health检查服务状态。4. 使用指南三种方式调用识别服务服务启动后你可以用三种不同的方式来使用它我会一一介绍。4.1 方式一Web界面直接使用最简单这是最简单的方式适合快速测试和演示。打开浏览器访问http://localhost:7860你会看到一个简洁的界面有两个主要区域左边上传音频或直接录音右边显示识别结果点击上传按钮选择一个音频文件支持wav、mp3、m4a、flac等格式在语言选择下拉框中选择对应的语言或者用auto让系统自动检测点击开始识别按钮几秒钟后右边就会显示识别出的文字小技巧如果你没有现成的音频文件可以点击试试示例音频使用我们预置的示例你可以直接点击录制按钮用麦克风现场录音测试识别结果可以复制粘贴到其他地方使用4.2 方式二通过API接口调用适合开发者如果你要在自己的程序里调用这个服务比如开发一个手机App或者网站那么API接口是最合适的方式。基本API调用使用curl命令测试APIcurl -X POST http://localhost:7860/api/transcribe \ -F file你的音频文件.wav \ -F languageauto \ -F use_itntrue你会得到这样的JSON响应{ status: success, text: 今天天气真好适合出去散步。, language: zh, processing_time: 70ms per 10s audio (approx) }Python代码调用示例如果你用Python开发可以这样调用import requests def transcribe_audio(file_path, languageauto): 调用语音识别API url http://localhost:7860/api/transcribe with open(file_path, rb) as f: files {file: f} data {language: language, use_itn: true} response requests.post(url, filesfiles, datadata) if response.status_code 200: result response.json() if result[status] success: return result[text] else: print(f识别失败: {result.get(message, 未知错误)}) return None else: print(f请求失败状态码: {response.status_code}) return None # 使用示例 text transcribe_audio(test_audio.wav, languagezh) if text: print(f识别结果: {text})其他编程语言调用如果你用其他语言调用方式也类似JavaScript (Node.js)const FormData require(form-data); const fs require(fs); const axios require(axios); async function transcribeAudio(filePath) { const form new FormData(); form.append(file, fs.createReadStream(filePath)); form.append(language, auto); form.append(use_itn, true); const response await axios.post(http://localhost:7860/api/transcribe, form, { headers: form.getHeaders() }); return response.data.text; }Java// 使用OkHttp或HttpClient发送multipart/form-data请求4.3 方式三直接使用Python库最高性能如果你对性能要求很高或者需要在Python项目中深度集成可以直接使用funasr-onnx库from funasr_onnx import SenseVoiceSmall import time # 初始化模型只需要一次 model SenseVoiceSmall( model_dir/root/ai-models/danieldong/sensevoice-small-onnx-quant, batch_size10, quantizeTrue ) # 识别单个文件 start_time time.time() result model([audio.wav], languageauto, use_itnTrue) end_time time.time() print(f识别结果: {result[0]}) print(f处理时间: {(end_time - start_time) * 1000:.2f}毫秒) # 批量识别多个文件更高效 audio_files [audio1.wav, audio2.wav, audio3.wav] results model(audio_files, languagezh, use_itnTrue) for i, text in enumerate(results): print(f文件 {audio_files[i]} 的识别结果: {text})这种方式性能最好因为省去了网络传输的开销但需要你在Python环境中直接集成。5. 实际应用场景与技巧现在服务已经跑起来了你可能想知道这玩意儿到底能用在什么地方怎么用效果最好我来给你分享几个实际的应用场景和使用技巧。5.1 常见应用场景场景一会议记录自动生成很多公司每天都有各种会议人工记录既费时又容易遗漏重点。你可以用这个服务录制会议音频用我们的服务转成文字再用其他工具比如GPT提取会议纪要和待办事项代码示例import os from datetime import datetime def transcribe_meeting(audio_path, output_dirmeeting_notes): 转录会议录音并保存 if not os.path.exists(output_dir): os.makedirs(output_dir) # 识别音频 text transcribe_audio(audio_path, languagezh) if text: # 生成文件名 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_file os.path.join(output_dir, fmeeting_{timestamp}.txt) # 保存结果 with open(output_file, w, encodingutf-8) as f: f.write(f会议记录 - {timestamp}\n) f.write( * 50 \n\n) f.write(text) print(f会议记录已保存到: {output_file}) return text return None场景二客服电话自动分析客服部门每天接听大量电话人工质检成本高。你可以录制客服通话需获得用户同意批量识别通话内容分析关键词、客户情绪、常见问题场景三视频字幕自动生成做视频自媒体的朋友都知道加字幕是个体力活。你可以提取视频中的音频用我们的服务识别成文字自动生成字幕文件SRT格式5.2 提升识别准确率的技巧虽然SenseVoice已经很准了但有些技巧能让它更准选择合适的语言如果知道音频的语言直接指定如languagezh如果不知道用languageauto让模型自动检测混合语言的内容建议用主要语言音频预处理确保音频清晰没有太多背景噪音如果音频太长超过30秒可以考虑分段处理采样率最好在16kHz-44.1kHz之间使用ITN逆文本正则化use_itntrue会把百分之二十转成20%三点五转成3.5对于数字、日期、金额等内容ITN能让结果更规范批量处理提高效率如果有多个音频文件尽量批量处理模型支持批量推理一次处理多个文件比一个个处理更快# 批量处理的正确方式 audio_files [audio1.wav, audio2.wav, audio3.wav] results model(audio_files, languagezh, use_itnTrue) # 一次调用处理所有文件 # 而不是这样效率低 # for file in audio_files: # result model([file], languagezh, use_itnTrue)5.3 处理常见问题在实际使用中你可能会遇到这些问题问题1识别结果有错别字可能原因音频质量差、说话口音重、专业术语多解决方案提供更清晰的音频如果是专业领域可以尝试在识别后加一个纠错步骤对于固定术语可以建立术语表进行后处理替换问题2服务启动失败可能原因端口被占用、依赖包冲突、模型下载失败解决方案换一个端口python3 app.py --port 8000在虚拟环境中重新安装依赖检查网络连接确保能正常下载模型问题3识别速度慢可能原因音频太长、CPU性能不足、同时处理多个请求解决方案过长的音频可以分段处理确保没有其他程序占用大量CPU调整batch_size参数默认10可以根据实际情况调整6. 高级配置与优化如果你对性能有更高要求或者需要部署到生产环境这部分内容会对你很有帮助。6.1 模型配置详解在初始化模型时有几个参数可以调整model SenseVoiceSmall( model_dir/root/ai-models/danieldong/sensevoice-small-onnx-quant, batch_size10, # 批量大小影响内存使用和速度 quantizeTrue, # 是否使用量化模型必须为True devicecpu, # 使用CPU还是GPUcuda num_threads4, # 推理线程数默认自动 comp_level1 # 计算优化级别0-2越高越快但可能影响精度 )参数说明batch_size一次处理多少个音频。越大越快但占用内存越多。一般10-20比较合适。device默认是cpu。如果你有GPU并且安装了CUDA可以改成cuda获得更快速度。num_threadsCPU推理的线程数。默认会自动选择你也可以手动设置。comp_level计算优化级别。0是默认1和2会进行更多优化但理论上可能影响精度实际影响很小。6.2 性能优化建议CPU优化# 设置CPU线程数根据你的CPU核心数调整 import os os.environ[OMP_NUM_THREADS] 4 # 限制OpenMP线程数 os.environ[MKL_NUM_THREADS] 4 # 限制MKL线程数 model SenseVoiceSmall( model_dir..., batch_size16, num_threads4, # 与上面设置一致 comp_level2 # 最高优化级别 )内存优化如果处理大量音频注意监控内存使用可以分批处理避免一次性加载太多文件使用生成器或流式处理大文件并发处理如果有很多并发请求可以考虑使用多个进程multiprocessing使用异步框架如FastAPI async/await部署多个服务实例用负载均衡分发请求6.3 生产环境部署如果你要把这个服务部署到服务器上给很多人用我建议使用Docker容器化FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app.py . COPY models/ /root/ai-models/danieldong/sensevoice-small-onnx-quant/ EXPOSE 7860 CMD [python, app.py, --host, 0.0.0.0, --port, 7860]添加监控和日志import logging from datetime import datetime # 设置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(fsensevoice_{datetime.now().strftime(%Y%m%d)}.log), logging.StreamHandler() ] ) logger logging.getLogger(__name__) # 在API接口中添加日志 app.post(/api/transcribe) async def transcribe_audio(...): start_time datetime.now() logger.info(f开始处理音频: {file.filename}) # ... 处理逻辑 ... end_time datetime.now() processing_time (end_time - start_time).total_seconds() logger.info(f音频处理完成: {file.filename}, 耗时: {processing_time:.3f}秒)添加速率限制防止被滥用from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded limiter Limiter(key_funcget_remote_address) app.state.limiter limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) app.post(/api/transcribe) limiter.limit(10/minute) # 每分钟最多10次 async def transcribe_audio(...): # ...7. 总结通过这篇教程你应该已经成功部署了SenseVoice语音识别服务并且知道了怎么用它。让我们快速回顾一下重点你学到了什么环境准备只需要Python和几个依赖包不需要GPU普通电脑就能跑快速部署三步就能启动服务——装依赖、写脚本、运行三种使用方式Web界面、API接口、Python库满足不同需求实际应用会议记录、客服分析、视频字幕等多个场景性能优化调整参数、批量处理、生产环境部署这个服务的核心优势速度快10秒音频只要70毫秒接近实时准确率高支持多语言还能识别情感和事件部署简单ONNX量化模型体积小依赖少使用灵活提供Web界面和API方便集成下一步可以做什么试试不同的音频看看识别效果把它集成到你自己的项目里根据业务需求调整参数和优化性能探索更多功能比如结合GPT做智能摘要语音识别技术正在改变我们与机器交互的方式。有了这个服务你可以轻松地为任何应用添加耳朵让它能听懂用户说的话。无论是做智能客服、会议工具还是个人助手这个快速、准确的语音识别服务都能帮你节省大量时间和精力。最重要的是你现在有了一个完全在自己控制下的语音识别服务不需要依赖第三方API不用担心隐私问题也不需要为使用量付费。想怎么用就怎么用想什么时候用就什么时候用。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。