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.rhkb.cn/news/479669.html

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

相关文章

springboot视频网站系统的设计与实现(代码+数据库+LW)

摘 要 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在视频信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次开发的视频网站系统管理员功…

安装QT6.8(MSVC MinGW)+QT webengine+QT5.15.2

本篇主要针对只使用过QT5的qmake,没有用过MSVC,VS的老同学。 建议一部分一部分安装,全部勾选安装遇到问题会中断,前功尽弃。 我自己需要的是QT5,编出的软件用在公司设备上。 QT6:建议也安装学习&#xf…

自动驾驶目标检测融合全貌

1、early fusion 早期融合,特点用到几何空间转换3d到2d或者2d到3d的转换,用像素找点云或者用点云找像素。 2、deep fusion 深度融合,也是特征级别融合,也叫多模态融合,如bevfusion范式 3、late fusion 晚融合&#x…

Microsoft Excel如何插入多行

1.打开要编辑的excel表,在指定位置,鼠标右键点击“插入”一行 2.按住shift键,鼠标的光标箭头会变化成如下图所示 3.一直按住shift键和鼠标左键,往下拖动,直至到插入足够的行

node.js基础学习-http模块-创建HTTP服务器、客户端(一)

http模块式Node.js内置的模块,用于创建和管理HTTP服务器。Node.js使用JavaScript实现,因此性能更好。 使用http模块创建服务器,我们建议使用commonjs模块规范,因为很多第三方的组件都使用了这种规范。当然es6写法也支持。 下面就是…

2024御网杯信息安全大赛个人赛wp(misc方向)

目录 一.信息安全大赛的通知二、编码转换1. 第一部分2. 第二部分3. 第三部分 三、1.txt四、buletooth 题目附件以及工具链接: 通过网盘分享的文件:御网杯附件 链接: https://pan.baidu.com/s/1LNA6Xz6eZodSV0Io9jGSZg 提取码: jay1 –来自百度网盘超级会…

浅谈pdfbox2.0和pdfbox3.0的运用与区别

前言 Apache PDFBox 是一个开源的Java库,可以用来对PDF文档做一些基本操作,比如实际应用中的pdf读取、写入、合并、拆分、写文字、写图片、加水印等,甚至还应用到了电子签章。本文逐个介绍对pdf的操作,以备作为后续参考使用。 一…

《解锁计算机专业宝藏:核心编程语言与学习资料全解析》

在当今数字化浪潮汹涌澎湃、技术迭代日新月异的时代,计算机专业宛如一座蕴藏无尽宝藏与无限机遇的神秘殿堂🏰。对于莘莘学子而言,精准掌握核心编程语言,并手握优质学习资料,恰似寻得开启这扇殿堂大门的秘钥&#xff0c…

【计算机网络】多路转接之epoll

epoll也是一种linux中的多路转接方案(epoll也是只负责IO过程中的"等") 一、epoll相关接口的使用 1.epoll_create int epoll_create(int size); ​功能:创建一个epoll模型 ① int size:没意义了 >0就行 返回值:返回一个文件…

「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏

本篇将带你实现一个简单的数字猜谜游戏。用户输入一个数字,应用会判断是否接近目标数字,并提供提示“高一点”或“低一点”,直到用户猜中目标数字。这个小游戏结合状态管理和用户交互,是一个入门级的互动应用示例。 关键词 UI互…

Brain.js 用于浏览器的 GPU 加速神经网络

Brain.js 是一个强大的 JavaScript 库,它允许开发者在浏览器和 Node.js 环境中构建和训练神经网络 。这个库的目的是简化机器学习模型的集成过程,使得即使是没有深厚机器学习背景的开发者也能快速上手 。 概述 Brain.js 提供了易于使用的 API&#xff…

365天深度学习训练营-第P6周:VGG-16算法-Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺要求: 保存训练过…

预处理指令

1.预定义符号 预定义符号是在预处理阶段处理的。 1.__FILE__ // 进⾏编译的源⽂件 2.__LINE__ // ⽂件当前的⾏号 3.__DATE__ // ⽂件被编译的⽇期 4.__TIME__ // ⽂件被编译的时间 5.__STDC__ // 如果编译器遵循 ANSI C ,其值为 1 ,否则未定义…

Android 12.0新增自定义HIDL问题记录

代码 流程和代码可以参考这位大佬的 https://blog.csdn.net/learnframework/article/details/134621556 主要记录发现的问题以及解决方式。 1.首先最外层的bp不要使用update-makefiles.sh 去生成 ,基本上interface下面的文件夹都会被影响,可能会导致编…

(即插即用模块-Attention部分) 二十、(2021) GAA 门控轴向注意力

文章目录 1、Gated Axial-Attention2、代码实现 paper:Medical Transformer: Gated Axial-Attention for Medical Image Segmentation Code:https://github.com/jeya-maria-jose/Medical-Transformer 1、Gated Axial-Attention 论文首先分析了 ViTs 在训…

[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class 类名{ 访问权限: 属性 /行为 }…

韩顺平 一周学会Linux | Linux 实操篇-组管理和权限管理

一、Linux 组 1. 组基本介绍 在linux 中的每个用户必须属于一个组,不能独立于组外。在linux 中每个文件有所有者、所在组、其它组的概念。 2. 文件/目录 所有者 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。 1) 查看文件所有者&…

FBX福币交易所创业板指放量大涨2.73% 谷子经济概念持续爆发

查查配分析11月27日电 27日,A股三大指数探底回升,沪指涨逾1%,创业板指涨近3%。全市成交额较上个交易日放量至1.49万亿元。 截至收盘,上证指数涨1.53%,报3309.78点;深证成指涨2.25%,报10566.10点;创业板指涨2.73%,报2208.78点。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速…

前端性能优化之任务管理/调度

浏览器的一帧 前面我们提到如何使用requestAnimationFrame来检测是否产生了卡顿。除此之外,如果你也处理过简单的异步任务管理(闲时执行等),还可以使用requestIdleCallback来检测卡顿。其实,requestAnimationFrame和requestIdleCallback都会在浏览器的每一帧中被执行到,…

Ubuntu20.04安装kalibr

文章目录 环境配置安装wxPython下载编译测试报错1问题描述问题分析问题解决 参考 环境配置 Ubuntu20.04,python3.8.10,boost自带的1.71 sudo apt update sudo apt-get install python3-setuptools python3-rosinstall ipython3 libeigen3-dev libboost…