whisper-api语音识别语音翻译高性能兼容openai接口协议的开源项目

whisper-api

介绍

使用openai的开源项目winsper语音识别开源模型封装成openai chatgpt兼容接口

软件架构

使用uvicorn、fastapi、openai-whisper等开源库实现高性能接口

更多介绍 [https://blog.csdn.net/weixin_40986713/article/details/138712293](https://blog.csdn.net/weixin_40986713/article/details/138712293)

使用说明
  1. 下载代码
  2. 安装 ffmpeg https://ffmpeg.org/download.html
  3. 安装依赖 项目根目录下执行命令 pip install -r requirements.txt
  4. 运行代码 项目根目录下执行命令 python main.py

这里的 http://0.0.0.0:3003 就是连接地址。

启动类代码
import atexit
import json
import os
import tempfile
import timeimport uvicorn
from fastapi import FastAPI, UploadFile, File, Security, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentialsfrom whisper_script import WhisperHandlerapp = FastAPI()
security = HTTPBearer()
env_bearer_token = 'sk-tarzan'
model_size = os.getenv("MODEL_SIZE", "base")
language = os.getenv("LANGUAGE", "Chinese")def cleanup_temp_file(path):if os.path.exists(path):os.remove(path)with open('options.json', 'r') as options:# 使用json.load()函数读取并解析文件内容load_options = json.load(options)# 语音识别
@app.post("/v1/audio/transcriptions")
async def transcribe(file: UploadFile = File(...), credentials: HTTPAuthorizationCredentials = Security(security)):if env_bearer_token is not None and credentials.credentials != env_bearer_token:raise HTTPException(status_code=401, detail="Invalid token")file_bytes = await file.read()return {"text": audio_to_text(file_bytes, 'transcribe')}# 语音翻译
@app.post("/v1/audio/translations")
async def translate(file: UploadFile = File(...), credentials: HTTPAuthorizationCredentials = Security(security)):if env_bearer_token is not None and credentials.credentials != env_bearer_token:raise HTTPException(status_code=401, detail="Invalid token")file_bytes = await file.read()return {"text": audio_to_text(file_bytes, 'translate')}def audio_to_text(file_bytes, task):start_time = time.time()max_file_size = 500 * 1024 * 1024if len(file_bytes) > max_file_size:raise HTTPException(status_code=400, detail="File is too large")temp_path = Nonetry:with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_audio:temp_audio.write(file_bytes)temp_path = temp_audio.namemodel_size = load_options.get("model_size")language = load_options.get("language")prompts = {"verbose": load_options.get("verbose"),"temperature": load_options.get("temperature"),"compression_ratio_threshold": load_options.get("compression_ratio_threshold"),"logprob_threshold": load_options.get("logprob_threshold"),"no_speech_threshold": load_options.get("no_speech_threshold"),"condition_on_previous_text": load_options.get("condition_on_previous_text"),"initial_prompt": load_options.get("initial_prompt"),"word_timestamps": load_options.get("word_timestamps"),"prepend_punctuations": load_options.get("prepend_punctuations"),"append_punctuations": load_options.get("append_punctuations")}print('temp_path', temp_path)handler = WhisperHandler(temp_path, model_size=model_size, language=language, task=task, prompt=prompts)result = handler.transcribe()except Exception as e:raise HTTPException(status_code=500, detail=str(e))finally:atexit.register(cleanup_temp_file, temp_path)end_time = time.time()print(f"audio to text took {end_time - start_time:.2f} seconds")return result['text']if __name__ == "__main__":token = os.getenv("ACCESS_TOKEN")if token is not None:env_bearer_token = tokentry:uvicorn.run("main:app", reload=True, host="0.0.0.0", port=3003)except Exception as e:print(f"API启动失败!\n报错:\n{e}")
docker
  1. docker打包命令
docker build -t whisper .

2.docker命令启动

gpu显卡模式

docker run -itd --name whisper-api -p 3003:3003 --gpus all --restart=always whisper
  • 默认 ACCESS_TOKEN=sk-tarzan

cpu模式

docker run -itd --name whisper-api -p 3003:3003 --restart=always whisper
  • 默认 ACCESS_TOKEN=sk-tarzan

鉴权模式

docker run -itd --name whisper-api -p 3003:3003-e ACCESS_TOKEN=yourtoken --gpus all --restart=always whisper
docker run -itd --name whisper-api -p 3003:3003-e ACCESS_TOKEN=yourtoken --restart=always whisper
  • yourtoken 修改你设置的鉴权token,接口调用header 里传 Authorization:Bearer sk-tarzan

docker日志查看

docker logs -f [容器id或容器名称]
配置文件

options.json

{"model_size": "base","language": "Chinese"
}
  • 可结合one-api,接入FastGPT等rag开源项目使用,使用教程如下:
    《Fastgpt接入Whisper本地模型实现语音输入》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode-46. 全排列

题目描述 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#xf…

【ELK+Kafka+filebeat分布式日志收集】分布式日志收集详解

分布式日志收集是一种用于在分布式系统中收集、聚合、存储和分析日志数据的技术。随着系统规模的扩大和分布式架构的普及,单节点的日志收集和处理方案已经难以满足需求。因此,分布式日志收集系统应运而生。以下是分布式日志收集的详细讲解: 一、背景 1、为什么需要分布式日…

百日筑基第二十三天-23种设计模式-创建型总汇

百日筑基第二十三天-23种设计模式-创建型总汇 前言 设计模式可以说是对于七大设计原则的实现。 总体来说设计模式分为三大类: 创建型模式,共五种:单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式,共…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎:内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测,针对完整的数据包,进行内容的识别和检测 1、基于特征子的检…

Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​​​​链接点击跳转博客主页 目录 列表视图(ListView) 控件类型 初始化控件环境 示例代码 列表视图(ListView) 控件类型 详细信息视图(Report View):数据以列的形式显示&…

Collections.unmodifiableList

Collections.unmodifiableList 是 Java Collections Framework 提供的一个方法,用于创建一个不可修改的视图(unmodifiable view)列表。这个方法返回的列表是对原始列表的一个包装,任何对这个包装列表的修改操作都会抛出 Unsupport…

数据分析01——系统认识数据分析

1.数据分析的全貌 1.1观测 1.1.1 观察 (1)采集数据 a.采集数据:解析系统日志 当你在看视频的时候———就会产生日志———解析日志———得到数据 b.采集数据:埋点获取新数据(自定义记录新的信息) 日志…

vue3中的watch函数

watch函数 作用&#xff1a;监听数一个或者多个数据的变化&#xff0c;数据变化时执行回调函数&#xff0c;两个额外的参数&#xff1a;1、immediate&#xff08;立即执行&#xff09;2、deep&#xff08;深度监听&#xff09; 监听单个数据&#xff1a; <script setup&g…

【Vue】Vue3 安装 Tailwind CSS 入门

初始化 Vue 3 项目 npm install -g vue/cli vue create my-project安装 Tailwind CSS 进入你的项目目录&#xff0c;然后安装 Tailwind CSS 和其依赖项&#xff1a; npm install -D tailwindcss postcss autoprefixer配置 PostCSS Tailwind CSS 需要通过 PostCSS 进行处理。…

Python酷库之旅-第三方库Pandas(029)

目录 一、用法精讲 74、pandas.api.interchange.from_dataframe函数 74-1、语法 74-2、参数 74-3、功能 74-4、返回值 74-5、说明 74-6、用法 74-6-1、数据准备 74-6-2、代码示例 74-6-3、结果输出 75、pandas.Series类 75-1、语法 75-2、参数 75-3、功能 75-4…

单例模式 单例模式在多线程中是否线程安全, 如何保证线程安全。

单例模式 顾名思义就是在整个运行时域&#xff0c;一个类只有一个实例对象 懒汉式和饿汉式 1.懒汉式&#xff1a;类加载时不实例化&#xff0c;在第一次被调用时才进行实例化 下面展示一个 单例模式懒汉式代码片。 package com.haina.java08;public class Single {//构造器私…

mybatis-plus getMap sum求和 between时间查询

oracle 语法 QueryWrapper<Xxxx> eq new QueryWrapper<Xxxx>().select("NVL(sum(AAA),0) AS AA","NVL(sum(BBB),0) AS BB","NVL(sum(CCC),0) AS CC").eq("T_ID", id).apply("CREATE_TIME between to_date({0}, YYYY…

牛客 7.13 月赛(留 C逆元 Ddp)

B-最少剩几个&#xff1f;_牛客小白月赛98 (nowcoder.com) 思路 奇数偶数 奇数&#xff1b;奇数*偶数 奇数 所以在既有奇数又有偶数时&#xff0c;两者结合可以同时删除 先分别统计奇数&#xff0c;偶数个数 若偶个数大于奇个数&#xff0c;答案是偶个数-奇个数 若奇个数…

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…

【17】Android 线程间通信(二) - Handler

概述 记得上篇文章我们留下的问题吗&#xff1f;如果还没有看过上一篇讲解Handler基本原理文章的同学可以补一下知识。Android 线程间通信(一) - Handler 回到正题&#xff0c;这次我们将一下上一篇文章留下问题中的几个&#xff0c;idleHandler & syncBarrier。 同步屏…

PyCharm查看文件或代码变更记录

背景&#xff1a; Mac笔记本上有一个截图的定时任务在运行&#xff0c;本地Python使用的是PyCharm IDE&#xff0c;负责的同事休假&#xff0c;然后定时任务运行的结果不符合预期&#xff0c;一下子不知道问题出现在哪里。 定位思路&#xff1a; 1、先确认网络、账号等基本的…

Qt 快速保存配置的方法

Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下&#xff0c;Qt界面开发时&#xff0c;快速保存界面上一些参数配置的方法。 因为我在做实验的时候&#xff0c;界面上可能涉及到很多参数的配置&#xff0c;我…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

django学习入门系列之第四点《BootStrap依赖》

文章目录 往期回顾 BootStrap依赖于JavaScript的类库&#xff0c;JQuery下载 下载JQuery&#xff0c;在界面上应用JQuery 在页面上应用BootStrap和avaScript的类库【JQuery是avaScript的类库】 JQuery的官网&#xff1a; jQuery 如果要应用JQuery 则要在body里面导入文件…

[Java后端面试题1]2024-07-16

TIME_WAIT与CLOSE_WAIT的区别 TIME_WAIT 和 CLOSE_WAIT 是 TCP 连接状态的一部分&#xff0c;用于描述连接在不同阶段的状态。它们有以下主要区别&#xff1a; TIME_WAIT 定义: 这是主动关闭连接的一方在发送了最后一个 ACK 后进入的状态。出现原因: 确保远程 TCP 协议收到最…