Ubuntu24.04/Whisper/Docker Compose 本地部署

Ubuntu24.04/Whisper/Docker Compose 本地部署

简介

Whisper 是 OpenAI 于 2022 年 9 月开源的一款自动语音识别系统。它最突出的特点在于其鲁棒性,即使在面对口音、背景噪音或专业术语等复杂场景时,也能保持较高的识别准确性,在英语语音识别上已接近人类水平 。

核心技术与工作原理

Whisper 的强大能力源于其独特的技术设计,主要包括以下几点:

  • 端到端的 Transformer 架构:Whisper 采用编码器-解码器的 Transformer 模型架构 。输入音频被分割成30秒的片段并转换为对数梅尔频谱图,然后由编码器提取特征,解码器根据这些特征预测对应的文本 。
  • 大规模多任务训练:模型在从互联网收集的、高达68万小时的多语言(支持近百种语言)和多任务监督数据上进行训练,数据集的巨大规模和多样性是其强大泛化能力的基础 。训练时,模型会交替执行多项任务,如多语言语音转录、语音翻译(到英语)、语言识别以及生成带短语级时间戳的文本等 。
  • 统一的多任务格式:通过引入特殊的标记,Whisper 使用一个统一的模型来处理所有任务。这些标记指示模型当前需要执行的具体任务,这种设计使得单个模型能够替代传统语音处理流程中的多个阶段 。

模型规格与选择

Whisper 提供了多种规模的模型,以适应不同场景下对速度和精度的权衡需求 。下面的表格整理了可用的模型及其大致参数,你可以根据实际需求(如对准确率的要求、可用的计算资源)进行选择。

模型名称参数量磁盘空间适用场景
tiny约 39 M~75 MB快速演示,对资源极度敏感
base约 74 M~140 MB平衡速度与基本准确率
small约 244 M~480 MB良好准确率与速度的折中
medium约 769 M~1.5 GB追求较高准确率
large约 1550 M~3 GB最高准确率,支持所有任务

主要应用场景

凭借其高准确率和多语言支持,Whisper 可应用于多种场景:

  • 会议记录与转录:自动生成会议纪要,将音频内容转换为可编辑的文本,提高效率 。
  • 视频字幕生成:为视频内容自动生成字幕,提升内容的可访问性和传播效果 。
  • 多语言翻译与转录:支持将多种语言的语音直接转录或翻译成英语文本,便于跨语言沟通 。
  • 语音助手与智能客服:作为语音接口的核心,提升语音助手对指令理解的准确性 。
  • 无障碍技术:通过实时语音转文本服务,为听障人士提供沟通便利 。

如何使用 Whisper

Whisper 的使用非常灵活,主要有以下几种方式:

  • 命令行直接使用:安装后,可通过简单的命令处理音频文件,例如 whisper audio.wav --model small --language Chinese
  • 在 Python 代码中调用:在 Python 项目中集成语音识别功能通常只需几行代码,非常方便 。
  • 通过 API 调用:OpenAI 也提供了 Whisper 的 API 接口,适合不希望本地部署的云端应用 。

总结与优势

总而言之,Whisper 的核心优势可以概括为三点:

  1. 高鲁棒性:得益于海量多样的训练数据,在嘈杂环境、口音等方面表现出色 。
  2. 多功能性:一个模型支持转录、翻译、时间戳等多种任务,覆盖近百种语言 。
  3. 开放与便捷:完全开源,支持本地部署以保护数据隐私,并提供从命令行到 API 的多种易用接口 。

本地部署

  • 运行效果:使用 small 模型以及使用精确的转录参数;整体识别还可以,但依旧有很多同韵母的字和同音字会识别错误;使用 medium 模型会出现一个奇怪的问题,转录文字为繁体字;large 模型运行时间较长(3060 显卡)
  • 优化:音频预处理、优化转录参数、阶段处理
    • 结果也大差不差,最终生成的文本或多或少都有点问题,还是直接交给大模型根据语义做修正并分析吧
  • 转 FastAPI 服务
      • 增加 fastapi、uvicorn、python-multipart 依赖
      • 修改 Dockerfile 程序挂载
      • 修改 docker-compose.yml 端口映射

测试语句:

curl -X POST "http://localhost:7862/transcribe" -F "[email protected]"

更新配置:

# whisper_fastapi.pyfrom fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse import whisper import tempfile import os import numpy as np from scipy import signal import librosa import uvicorn import soundfile as sf # 初始化FastAPI应用 app = FastAPI( title="Whisper音频转录API", description="基于OpenAI Whisper的高级音频转录服务", version="1.0.0")# 初始化全局变量 model =Nonedefload_whisper_model():global model if model isNone: model = whisper.load_model("large")return model defpreprocess_audio(audio_path):""" 音频预处理:重采样、降噪、标准化 """try:# 加载音频 y, sr = librosa.load(audio_path, sr=16000)# 重采样到16kHz# 应用高通滤波器去除低频噪声 b, a = signal.butter(4,100,'highpass', fs=sr) y = signal.filtfilt(b, a, y)# 音频标准化 y = y / np.max(np.abs(y))# 保存处理后的临时文件 temp_path = tempfile.mktemp(suffix='.wav') sf.write(temp_path, y, sr)return temp_path except Exception as e:print(f"音频预处理失败: {str(e)}")return audio_path # 如果预处理失败,返回原始文件@app.on_event("startup")asyncdefstartup_event():"""应用启动时加载模型"""print("正在加载Whisper模型...") load_whisper_model()print("Whisper模型加载完成!")@app.post("/transcribe", summary="音频转录", description="上传音频文件并返回转录文本")asyncdeftranscribe_audio(file: UploadFile = File(...)):""" 转录音频文件为文本,使用优化参数 - **file**:音频文件,支持MP3、WAV、OGG、M4A、FLAC等格式 """# 更灵活的文件类型检查 valid_extensions ={'.mp3','.wav','.ogg','.m4a','.flac','.aac','.m4b'} file_extension = os.path.splitext(file.filename)[1].lower()if file_extension notin valid_extensions:raise HTTPException( status_code=400, detail=f"不支持的文件类型: {file_extension}。请上传音频文件: {valid_extensions}") temp_path =None processed_audio =Nonetry:# 保存上传文件到临时位置with tempfile.NamedTemporaryFile( delete=False, suffix=file_extension )as temp_file: content =awaitfile.read() temp_file.write(content) temp_path = temp_file.name # 音频预处理 processed_audio = preprocess_audio(temp_path)# 加载模型 model = load_whisper_model()# 使用优化的转录参数 result = model.transcribe( processed_audio, language="zh",# 指定中文语言 task="transcribe", beam_size=5,# 增加束搜索大小以提高准确性 best_of=5,# 生成多个候选结果选择最佳 temperature=0.0,# 使用确定性输出 patience=1.0,# 束搜索耐心参数 suppress_tokens=[-1]# 抑制不必要的token)# 返回转录结果return JSONResponse(content={"status":"success","text": result["text"],"language": result.get("language","zh"),"file_name":file.filename })except Exception as e:raise HTTPException(status_code=500, detail=f"转录过程中出现错误: {str(e)}")finally:# 清理临时文件if temp_path and os.path.exists(temp_path): os.unlink(temp_path)if processed_audio and processed_audio != temp_path and os.path.exists(processed_audio): os.unlink(processed_audio)@app.get("/health", summary="健康检查", description="检查服务是否正常运行")asyncdefhealth_check():"""健康检查端点"""return JSONResponse(content={"status":"healthy","model_loaded": model isnotNone})@app.get("/", summary="根端点", description="API基本信息")asyncdefroot():"""根端点,返回API基本信息"""return{"message":"Whisper音频转录API服务","version":"1.0.0","endpoints":{"transcribe":"/transcribe (POST)","health":"/health (GET)","docs":"/docs (GET)","redoc":"/redoc (GET)"},"model":"large","supported_languages":"近百种语言,支持中文转录"}if __name__ =="__main__": uvicorn.run( app, host="0.0.0.0", port=7862)
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04 # 设置工作目录 WORKDIR /app RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list # 安装系统依赖 RUN apt-get update && apt-get install -y \ ffmpeg \ python3 \ python3-pip \ python3-venv \ && rm -rf /var/lib/apt/lists/* \ && ln -sf /usr/bin/python3 /usr/bin/python # 复制依赖文件 COPY requirements.txt . # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 复制应用代码(修改为 FastAPI 文件) COPY whisper_fastapi.py . # 暴露 FastAPI 端口 EXPOSE 7862 # 设置环境变量:模型缓存路径 ENV WHISPER_MODEL_CACHE=/root/.cache/whisper # 启动应用(修改为 FastAPI 启动命令) CMD ["uvicorn", "whisper_fastapi:app", "--host", "0.0.0.0", "--port", "7862"] 
# docker-compose.ymlservices:whisper-api:build: . container_name: whisper-fastapi ports:-"7862:7862"volumes:# 持久化缓存模型- ./model_cache:/root/.cache/whisper # 可选:挂载音频文件目录- ./audio_files:/app/audio_files environment:- WHISPER_MODEL=medium restart: unless-stopped # 可选:设置资源限制deploy:resources:reservations:devices:-driver: nvidia count:2capabilities:[gpu]
在这里插入图片描述


在这里插入图片描述

Gradio 服务

# whisper_gradio.pyimport gradio as gr import whisper import tempfile import os import numpy as np from scipy import signal import librosa # 初始化全局变量 model =Nonedefload_whisper_model():global model if model isNone: model = whisper.load_model("medium")return model defpreprocess_audio(audio_path):""" 音频预处理:重采样、降噪、标准化 """try:# 加载音频 y, sr = librosa.load(audio_path, sr=16000)# 重采样到16kHz# 应用高通滤波器去除低频噪声 b, a = signal.butter(4,100,'highpass', fs=sr) y = signal.filtfilt(b, a, y)# 音频标准化 y = y / np.max(np.abs(y))# 保存处理后的临时文件 temp_path = tempfile.mktemp(suffix='.wav') librosa.output.write_wav(temp_path, y, sr)return temp_path except Exception as e:print(f"音频预处理失败: {str(e)}")return audio_path # 如果预处理失败,返回原始文件deftranscribe_audio(audio_file):""" 转录音频文件为文本,使用优化参数 """# 加载模型 model = load_whisper_model()# 安全检查上传的文件if audio_file isNone:return"错误:请上传一个音频文件。"try:# 音频预处理 processed_audio = preprocess_audio(audio_file)# 使用优化的转录参数 result = model.transcribe( processed_audio, language="zh",# 指定中文语言 task="transcribe", beam_size=5,# 增加束搜索大小以提高准确性 best_of=5,# 生成多个候选结果选择最佳 temperature=0.0,# 使用确定性输出 patience=1.0,# 束搜索耐心参数 suppress_tokens=[-1]# 抑制不必要的token)# 清理临时文件if processed_audio != audio_file:try: os.unlink(processed_audio)except:passreturn result["text"]except Exception as e:returnf"转录过程中出现错误:{str(e)}"# 创建Gradio界面with gr.Blocks(title="Whisper音频转录")as demo: gr.Markdown("# 🎤 Whisper音频转录") gr.Markdown("上传MP3、WAV、OGG等音频文件,使用优化的参数将其转换为文本")with gr.Row():with gr.Column(): audio_input = gr.Audio( sources=["upload"],type="filepath", label="上传音频文件", interactive=True) submit_btn = gr.Button("开始转录", variant="primary")with gr.Column(): text_output = gr.Textbox( label="转录结果", placeholder="转录文本将显示在这里...", lines=10, max_lines=15)# 处理提交动作 submit_btn.click( fn=transcribe_audio, inputs=audio_input, outputs=text_output )# 附加说明 gr.Markdown(""" ### 使用说明 1. 点击"上传音频文件"或拖放文件到上传区域 2. 支持格式:MP3, WAV, OGG, M4A, FLAC等 3. 点击"开始转录"按钮 4. 等待转录结果出现在右侧文本框中 **注意**:首次使用需要下载Whisper Large模型,请耐心等待。转录过程可能需要较长时间。 """)if __name__ =="__main__": demo.launch( server_name="0.0.0.0", server_port=7862, share=False)

Docker 配置

FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04 # 设置工作目录 WORKDIR /app RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \ sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list # 安装系统依赖 RUN apt-get update && apt-get install -y \ ffmpeg \ python3 \ python3-pip \ python3-venv \ && rm -rf /var/lib/apt/lists/* \ && ln -sf /usr/bin/python3 /usr/bin/python # 复制依赖文件 COPY requirements.txt . # 安装Python依赖 RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 复制应用代码 COPY whisper_gradio.py . # 暴露Gradio默认端口 EXPOSE 7862 # 设置环境变量:禁用Gradio分析,缓存模型 ENV GRADIO_ANALYTICS_ENABLED=False ENV WHISPER_MODEL_CACHE=/root/.cache/whisper # 启动应用 CMD ["python", "whisper_gradio.py"] 
# docker-compose.ymlservices:whisper-app:build: . ports:-"29999:7862"volumes:# 可选:持久化缓存模型,避免每次重启下载- ./cache:/root/.cache/whisper environment:- GRADIO_SERVER_NAME=0.0.0.0 - GRADIO_SERVER_PORT=7862 restart: unless-stopped 
# requirements.txt torch openai-whisper gradio ffmpeg-python pydub scipy librosa numpy soundfile fastapi uvicorn python-multipart 

Read more

一、FPGA到底是什么???(一篇文章让你明明白白)

一句话概括 FPGA(现场可编程门阵列) 是一块可以通过编程来“变成”特定功能数字电路的芯片。它不像CPU或GPU那样有固定的硬件结构,而是可以根据你的需求,被配置成处理器、通信接口、控制器,甚至是整个片上系统。 一个生动的比喻:乐高积木 vs. 成品玩具 * CPU(中央处理器):就像一个工厂里生产好的玩具机器人。它的功能是固定的,你只能通过软件(比如按不同的按钮)来指挥它做预设好的动作(走路、跳舞),但你无法改变它的机械结构。 * ASIC(专用集成电路):就像一个为某个特定任务(比如只会翻跟头)而专门设计和铸造的金属模型。性能极好,成本低(量产时),但一旦制造出来,功能就永远无法改变。 * FPGA:就像一盒万能乐高积木。它提供了大量基本的逻辑单元(逻辑门、触发器)、连线和接口模块。你可以通过“编程”(相当于按照图纸搭建乐高)将这些基本模块连接起来,构建出你想要的任何数字系统——可以今天搭成一个CPU,明天拆了重新搭成一个音乐播放器。 “现场可编程”

Stable Yogi Leather-Dress-Collection实操手册:生成历史保存与本地图片批量导出

Stable Yogi Leather-Dress-Collection实操手册:生成历史保存与本地图片批量导出 1. 工具概述 Stable Yogi Leather-Dress-Collection是一款基于Stable Diffusion v1.5和Anything V5动漫底座模型开发的2.5D皮衣穿搭生成工具。它通过动态加载不同皮衣款式LoRA权重、智能提取服装关键词生成提示词,并深度优化显存占用,为用户提供高效的动漫风格皮衣穿搭生成体验。 1.1 核心特性 * 动态LoRA管理:自动扫描并加载指定目录下的皮衣LoRA文件 * 智能提示词生成:从LoRA文件名中提取服装关键词并嵌入默认提示词 * 显存优化:采用多种技术手段降低显存占用,适配低配显卡 * 本地运行:无需网络依赖,所有操作均在本地完成 2. 准备工作 2.1 环境要求 * 硬件配置: * 显卡:NVIDIA显卡,显存≥4GB(推荐8GB以上) * 内存:≥16GB * 存储:≥20GB可用空间 * 软件依赖: * Python 3.8+

(6-4-02)IMU融合与机体状态估计:综合实战:腿式机器人的IMU关节融合与状态估计(2)

(6-4-02)IMU融合与机体状态估计:综合实战:腿式机器人的IMU关节融合与状态估计(2)

6.4.3  状态估计 “src”目录包含本项目状态估计的核心算法实现和工具模块,涵盖惯性导航与人形机器人运动状态估计的完整流程,包括EKF状态预测与更新、IMU数据补偿与积分、机器人足端运动学计算、静态初始对准、导航结果与误差输出、数据流生成及可视化工具,整体提供从原始传感器数据到导航状态估计和分析的全链路功能,实现机器人高精度运动导航和状态监控。 1. IMU数据的传播与补偿 文件src/imuPropagation.py的功能是提供IMU数据的传播与补偿机制,用于惯性导航系统(INS)中状态更新。INSMech 类实现了基于前一时刻和当前IMU测量的速度、位置和姿态传播,同时对IMU角速度和加速度进行偏差与缩放误差补偿。_wrap_yaw_inplace用于将偏航角限制在 -π,π 范围内。 import numpy as np from scipy.spatial.transform import Rotation as R def _wrap_yaw_inplace(euler_

ubuntu上安装OpenClaw并接入飞书机器人

ubuntu上安装OpenClaw并接入飞书机器人

大家好,我是一根甜苦瓜。今天来分享如何在本地安装openclaw并接入飞书,实现让AI给我打工。 最近AI圈更新太快了,从github copilot到cursor 到claud code ,再到codex,然后是最近火爆了的小龙虾(OpenClaw),可谓是百花齐放,应接不暇。本人也是github copilot+codex的深度用户,确实不错,所以最近打算折腾一下小龙虾,顺带教大家如何把智谱GLM 接入OpenClaw。 1. 前言 1.1 什么是openclaw 2026 年开年,AI 圈突然冒出一匹“野生黑马”——OpenClaw。这个开源个人 AI 助手项目在 GitHub 上只用了 两周时间就狂揽 15 万 Star,速度堪比开挂。 简单说,它就像给你配了一个 24 小时不下班的数字打工人: 把它部署在自己的电脑或服务器上,它就能接入 WhatsApp、Telegram、