OpenAI Whisper 语音识别 模型部署及接口封装

环境配置:

一、安装依赖:
pip install -U openai-whisper

或者,以下命令会从这个存储库拉取并安装最新的提交,以及其Python依赖项:

pip install git+https://github.com/openai/whisper.git 
二、安装ffmpeg:
cd /opt
# 下载 5.1 版本的 ffmpeg
wget http://www.ffmpeg.org/releases/ffmpeg-5.1.tar.gz
# 解压下载的压缩包
tar -zxvf ffmpeg-5.1.tar.gz
# 进入解压后的文件夹
cd ffmpeg-5.1
# 安装ffplay需要的依赖
sudo apt-get install libx11-dev xorg-dev libsdl2-2.0 libsdl2-dev
sudo apt install clang libfdk-aac-dev libspeex-dev libx264-dev libx265-dev libnuma-dev
sudo apt install yasm pkg-config libopencore-amrnb-dev libopencore-amrwb-dev
# 查看帮助文档确定需要安装的相关参数
./configure --help
./configure --enable-gpl --enable-version3 --enable-nonfree --enable-ffplay --enable-ffprobe --enable-libx264 --enable-libx265 --enable-debug
# 编译ffmpeg
make
# 安装编译
sudo make install
# 设置环境变量
# 查看当前路径
pwd
# 将当前路径添加到环境变量当中
export PATH="$PATH:/opt/ffmpeg-5.1/ffmpeg"
# 测试
# 查看ffmpeg的版本
ffmpeg -version
ffplay -version
ffprobe -version

OpenAI Whisper链接icon-default.png?t=O83Ahttps://gitcode.com/gh_mirrors/whisp/whisper/overview?utm_source=csdn_github_accelerator&isLogin=1

三、下载并运行模板:
# 引用whisper模块
import whisper
# 下载模型到指定路径
# model = whisper.load_model("base", download_root="/opt/Whisper/models") # 基座模型
model = whisper.load_model("large", download_root="/opt/Whisper/models")  # 大模型
# 使用模型
result = model.transcribe("音频文件绝对路径")
print(result["text"])

这样模型文件就会被下载到/opt/Whisper/models路径

四、接口封装:

# 引用whisper模块
import whisper
from flask import Flask,request
import datetime
import requests
import torch
import os# 语音识别模型
# model = whisper.load_model("large", download_root="/opt/Whisper/models")    # 同时下载模型
#device = torch.device("cpu")    
device = torch.device("cuda:0")                                                  # 使用CPU加载模型
model = whisper.load_model("/opt/Whisper/models/tiny.pt", device=device)  # 加载模型
#model = whisper.load_model("D:\\whisper\\models\\tiny\\tiny.pt", device=device)  # 加载本地模型# 实例化一个web服务对象
app = Flask(__name__)
# 构造一个接受post请求的响应
@app.route('/',methods=['POST'])
def postRequest():data = {}data['data'] = {'text':'Not Found!'}data['code'] = 404# # 验证秘钥是否通过# key = request.form.get('key')# if key != "OpenAI Whisper":#     data['data'] = {'text':'No permissions!'}#     data['code'] = 400#     return data# 判断翻译类型lang = 'zh'lang_ = request.form.get('lang')if lang_ == 'en':lang = 'en'# 验证是否上传文件,未上传文件使用远程地址或本地地址if 'file' not in request.files:# 获取路径path = request.form.get('path')if path.lower().endswith((".wav", ".WAV",".mp3",".MP3")) is False:data['data'] = {'text':'No wav or mp3!'}data['code'] = 400return datatyp = request.form.get('typ') # url/path# 如果是使用连接,则远程拷贝链接文件到指定地址if typ == 'url':# 指定地址fileName = '/opt/Whisper/voice/' + datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.wav'#fileName = 'D:\\whisper\\voice\\' + datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.wav'downlaod(path, fileName)res = toLang(lang, fileName) # model.transcribe(fileName,language='Chinese')data['data'] = resdata['code'] = 200# 如果是使用本地文件,则直接读取elif typ == 'path':res = toLang(lang, path) # model.transcribe(path,language='Chinese')data['data'] = resdata['code'] = 200# 如果通过上传文件else:file = request.files['file']if file.filename == '':data['data'] = {'text':'No file!'}data['code'] = 400return data# 指定文件保存路径file_extension = file.filename.split(".")[-1]if file_extension != 'wav' and file_extension!= 'WAV' and file_extension != 'mp3' and file_extension!= 'MP3':data['data'] = {'text':'No Voice!'}data['code'] = 400return data# 指定地址fileName = '/opt/Whisper/voice/' + datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.' + file_extension#fileName = 'D:\\whisper\\voice\\' + datetime.datetime.now().strftime('%Y%m%d_%H%M%S') + '.' + file_extensionfile.save(fileName)# 确保文件被写入磁盘with open(fileName, 'a') as f:f.flush()os.fsync(f.fileno())#语音钻文字    res = toLang(lang, fileName) # model.transcribe(fileName,language='Chinese')data['data'] = resdata['code'] = 200return data# 文件下载
def downlaod(url, file_path):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0"}r = requests.get(url=url, headers=headers)with open(file_path, "wb") as f:f.write(r.content)f.flush()# 识别
def toLang(lang, file_path):print(file_path)if lang == 'en':prompt = 'is English'transcription = model.transcribe(file_path, language='en',verbose=True, initial_prompt=prompt)print(transcription["text"])else:prompt = '以下是普通话的句子'transcription = model.transcribe(file_path, language='zh',verbose=True, initial_prompt=prompt)print(transcription["text"])# 删除临时文件try:os.remove(file_path)print(f"Deleted file: {file_path}")except Exception as e:print(f"Failed to delete file: {file_path}, Error: {str(e)}")return transcriptionif __name__ == '__main__':# 运行服务,并确定服务运行的IP和端口app.run('0.0.0.0', '8000')
五、后台运行:

        1、创建新的conda环境,进行隔离:


conda create -n whisper python=3.8source activate whisper
nohup /home/wwwccczzz/anaconda3/envs/whisper/bin/python /opt/Whisper/speech.py > /opt/Whisper/speech.log 2>&1 &
六、开机自启:
方法一:使用 crontab:

        1、编辑 crontab 文件: 打开终端并输入以下命令来编辑 crontab 文件:

  crontab -e

       2、 添加开机启动任务: 在 crontab 文件中添加以下行:

@reboot nohup /home/wwwccczzz/anaconda3/envs/whisper/bin/python /opt/Whisper/speech.py > /opt/Whisper/speech.log 2>&1 &

这行命令的意思是在系统重启时运行 nohup 命令,并将标准输出和标准错误重定向到 /opt/Whisper/speech.log 文件。

        3、保存并退出: 保存文件并退出编辑器。对于 vi 编辑器,可以按 Esc 键,然后输入 :wq 并按回车键。

方法二:使用 systemd 服务:

        1、创建 systemd 服务文件: 在 /etc/systemd/system/ 目录下创建一个新的服务文件,例如 speech.service:

 sudo nano /etc/systemd/system/speech.service

        2、编辑服务文件: 在文件中添加以下内容:

[Unit]
# 描述服务的功能
Description=Speech to Text Service
# 确保网络服务已经启动后再启动此服务
After=network.target[Service]
# 指定运行服务的用户
User=wwwccczzz
# 设置工作目录
WorkingDirectory=/opt/Whisper
# 指定启动命令
ExecStart=/home/wwwccczzz/anaconda3/envs/whisper/bin/python /opt/Whisper/speech.py
# 如果服务停止,则自动重启
Restart=always
# 将标准输出重定向到系统日志
StandardOutput=syslog
# 将标准错误重定向到系统日志
StandardError=syslog
# 设置系统日志的标识符,便于查找日志
SyslogIdentifier=speech[Install]
# 指定服务在多用户模式下启动
WantedBy=multi-user.target

        3、重新加载 systemd 配置: 保存文件并退出编辑器,然后重新加载 systemd 配置:

   sudo systemctl daemon-reload

        4、开机自动启用服务: 启用服务以使其在系统启动时自动运行:

  sudo systemctl enable speech.service

        5、启动服务/检查服务状态:

   sudo systemctl start speech.servicesudo systemctl status speech.service

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

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

相关文章

⽂件操作详解

⽬录 一 文件操作的引入 1 为什么使⽤⽂件? 2 什么是⽂件? 3 文件分类(1 从⽂件功能的⻆度来分类:程序⽂件/数据⽂件 2根据数据的组织形式:为⽂本⽂件/⼆进制⽂件) 二 ⽂件的打开和关闭 1 …

gitee:解决vs文件权限被拒问题

报错问题 分析原因 git上传要忽略vs文件, Git因致命错误而失败。权限被拒绝 无法处理的路径。 解决方法 1、项目根目录下->右击空白->Open Git Bash here 2、 创建.gitignore文件 命令 touch .gitignore 3、 文件开头输入 .vs保存 参考地址 VS2017 Git fa…

【03】Selenium+Python 八种定位元素方法

操作元素,需要先查找定位到对应的元素。 查找单个元素:driver.find_element() 返回是一个web element 对象 查找多个元素:driver.find_elements() 返回是一个list对象 By 是 Selenium 中一个非常重要的类,用于定位网页元素。 使…

【linux学习指南】详解Linux进程信号保存

文章目录 📝保存信号🌠 信号其他相关常⻅概念🌉在内核中的表⽰ 🌠 sigset_t🌠信号集操作函数🌉sigprocmask🌉sigpending 🚩总结 📝保存信号 🌠 信号其他相关常…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点,有原生态的反序列化,还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化,这部分内容对于没Java基础的来说可能有点难,包括我。 序列化与反序列化 序列化:将内存…

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档 本项目采用以下架构: NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制,确保文档安全。Git服务器: 负责存储文档版本历史&#x…

智能堆叠,集群和IRF

堆叠和IRF其实可以近似看成同一种技术,只是华三叫IRF,华为叫智能堆叠 智能堆叠(iStack):支持堆叠特性的交换机通过堆叠线缆连接在一起,从逻辑上变成一台交换设备,作为一个整体参与数据转发&…

go使用mysql实现增删改查操作

1、安装MySQL驱动 go get -u github.com/go-sql-driver/mysql2、go连接MySQL import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动 )type Users struct {ID intName stringEmail string }var db *sql.DBfu…

springboot中使用mongodb完成评论功能

pom文件中引入 <!-- mongodb --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> yml中配置连接 data:mongodb:uri: mongodb://admin:1234561…

layui-vue第三方库表格列事件怎么写

插槽写入列点击事件 <div class"le-table-box" ref"TableBoxRef" :style"{ height: ShowPage ? calc(100% - 60px) : 100% }"><lay-table row-double"dbRowClick" :columns"TableColumn" :data-source"Table…

[在线实验]-Redis Docker镜像的下载与部署

镜像下载 dockerredis镜像资源-CSDN文库 加载镜像 使用以下命令从redis.tar文件中加载Docker镜像 docker load --input redis.tar 创建映射目录 为了确保Redis的数据能够持久化&#xff0c;我们需要创建一个本地目录来存储这些数据 mkdir -p datasource/docker/redis 运…

Flink CDC 使用实践以及遇到的问题

背景 最近公司在做一些业务上的架构调整&#xff0c;有一部分是数据从mysql采集到Starrocks&#xff0c;之前的一套方法是走 debezium 到 puslar 到 starrocks,这一套下来比较需要配置很多东西&#xff0c;而且出现问题以后&#xff0c;需要修改很多配置&#xff0c;而且现阶段…

配置idea环境进行scala编程

这里用的jdk是jdk-8u161,scala版本是2.12.0 在d盘新建一个本地仓库用来存放下载的maven包&#xff0c;在里面创建如下两个文件 更改settings文件为下面的样子 点击左下角的设置&#xff0c;更改maven本地仓库的位置&#xff08;默认在c盘用户目录下的.m2文件中&#xff0c;更改…

0017. shell命令--tac

目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容&#xff0c;与 cat 命令的输出顺序相反。非常有趣&#xff0c;好记。也就是说&#xff0c;当我们使用tac命令查看文件内…

mimic插件使用

最近搞机械臂的末端夹具&#xff0c;本来想用吸盘的插件的&#xff0c;不知道为什么吸盘吸不起来可乐瓶&#xff0c;后面就换成夹爪了。 因为原厂的urdf文件中提供夹爪是用mimic标签控制剩下的5个joint关节的&#xff0c;网上参考的资料太少了&#xff0c;也是废了好多力 气&am…

Spring boot之BeanDefinition介绍

在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程&#xff0c;它并不像我们创建对象一样只是直接new一下就行&#xff0c;虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中&#xff0c;BeanDefinition作…

redis基础spark操作redis

Redis内存淘汰策略 将Redis用作缓存时&#xff0c;如果内存空间用满&#xff0c;就会自动驱逐老的数据。 为什么要使用内存淘汰策略呢&#xff1f; 当海量数据涌入redis&#xff0c;导致redis装不下了咋办&#xff0c;我们需要根据redis的内存淘汰策略&#xff0c;淘汰一些不那…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…

力扣--LCR 150.彩灯装饰记录II

题目 代码 if(root null){ return new ArrayList<>(); } Queue<TreeNode> queue new LinkedList<>();List<List<Integer>> res new ArrayList<>();queue.add(root);while(!queue.isEmpty()){int k queue.size();List<Integer> …

RFdiffusion Potential类解读

1. Potential 类 功能 Potential 是一个接口类(抽象类),用于定义潜在函数的接口,要求继承它的类必须实现 compute 方法。它的设计遵循 面向对象编程的多态性原则,通过抽象接口确保子类实现特定功能,同时定义了一个通用的 API(即 compute 方法)。源代码: class Poten…