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'] = 400
            return data
        typ = 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'] = res
            data['code'] = 200
        # 如果是使用本地文件,则直接读取
        elif typ == 'path':
            res = toLang(lang, path) # model.transcribe(path,language='Chinese')
            data['data'] = res
            data['code'] = 200

    # 如果通过上传文件
    else:
        file = request.files['file']
        if file.filename == '':
            data['data'] = {'text':'No file!'}
            data['code'] = 400
            return 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'] = 400
            return 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_extension
        file.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'] = res
        data['code'] = 200
        
    return 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 transcription

if __name__ == '__main__':
    # 运行服务,并确定服务运行的IP和端口
    app.run('0.0.0.0', '8000')
五、后台运行:

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


conda create -n whisper python=3.8

source 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.service
   sudo systemctl status speech.service

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer

第33周:运动鞋识别(Tensorflow实战第五周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 1.3 查看数据 二、数据预处理 2.1 加载数据 2.2 可视化数据 2.3 再次检查数据 2.4 配置数据集 2.4.1 基本概念介绍 2.4.2 代码完成 三、构建CNN网络 四、训练模型 4.1 设置动态学习率 4.2 早停与保存最佳模型…

云轴科技ZStack助力 “上科大智慧校园信创云平台”入选上海市2024年优秀信创解决方案

近日,为激发创新活⼒,促进信创⾏业⾼质量发展,由上海市经济信息化委会同上海市委网信办、上海市密码管理局、上海市国资委等主办的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕。云轴科技ZStack支持的“上科大智慧校园信创云平台”…

Linux 服务器使用指南:诞生与演进以及版本(一)

一、引言 在当今信息技术的浪潮中,Linux 操作系统无疑是一个关键的支柱😎。无论是在服务器管理、软件开发还是大数据处理领域,Linux 都以其卓越的适应性和优势脱颖而出👍。然而,对于许多新手而言,Linux 系统…

基于树莓派3B+的简易智能家居小项目(WiringPi库 + C语言开发)

github主页:https://github.com/snqx-lqh 本项目github地址:https://github.com/snqx-lqh/RaspberryPiSmartHome 硬件开源地址:https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban 欢迎交流 树莓派智能家居项目,学习树莓派的…

YOLOv8-Pose NCNN安卓部署

YOLOv8-Pose NCNN安卓部署 前言 YOLOv8-Pose NCNN安卓部署 目前的帧率可以稳定在30帧左右,下面是这个项目的github地址:https://github.com/gaoxumustwin/ncnn-android-yolov8-pose 介绍 在做YOLOv8-Pose NCNN安卓部署的时候,在github上…

【热门主题】000077 物联网智能项目:开启智能未来的钥匙

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

【STM32学习】TB6612FNG驱动芯片的学习,驱动电路的学习

目录 1、TB6612电机驱动芯片 1.1如下是芯片的引脚图: 1.2如下图是电机的控制逻辑: 1.3MOS管运转逻辑 1.3典型应用电路 2、H桥驱动电路 2.1、单极模式 2.2、双极模式 2.3、高低端MOS管导通条件 2.4、H桥电路设计 2.5、自举电路 3、电气特性 3…

day01(Linux底层)基础知识

目录 导学 基础知识 1、Bootloader是什么 2、Bootloader的基本作用 3、入式中常见的Bootloader有哪些 4、Linux系统移植为什么要使用bootloader 5、uboot和Bootloader之间的关系 6.Uboot的获取 7、uboot版本命名 8、uboot版本选择 9、uboot的特点 10.Uboot使用 导学…

OpenFeign 服务调用

1.简介 微服务架构中使用 OpenFeign 进行服务调用, OpenFeign 提供了一种简洁的方式来定义和处理服 务间的调用。 OpenFeign 作为一个声明式的、模块化的 HTTP 客户端,通过 「接口」 的定义和 「注解」 的使用,简化了微服务之间的通信调用。…

superset load_examples加载失败解决方法

如果在执行load_examples命令后,出现上方图片情况,或是相似报错(url error\connection error),大概率原因是python程序请求github数据,无法访问. 因此我们可以将数据下载在本地来解决. 1.下载zip压缩文件,存放到本地 官方示例地址:GitHub - apache-superset/examples-data …

k8s集成skywalking

如果能科学上网的话,安装应该不难,如果有问题可以给我留言 本篇文章我将给大家介绍“分布式链路追踪”的内容,对于目前大部分采用微服务架构的公司来说,分布式链路追踪都是必备的,无论它是传统微服务体系亦或是新一代…

深度学习Python基础(2)

二 数据处理 一般来说PyTorch中深度学习训练的流程是这样的: 1. 创建Dateset 2. Dataset传递给DataLoader 3. DataLoader迭代产生训练数据提供给模型 对应的一般都会有这三部分代码 # 创建Dateset(可以自定义) dataset face_dataset # Dataset部分自定义过的…

【Git教程 之 安装】

Git教程 之 安装 Git教程 之 安装Windows系统安装gitLinux安装gitmacOS安装Git Git教程 之 安装 Windows系统安装git 首先从官网上直接下载安装 选择对应的操作系统,我电脑是Windows,所以我演示以Windows为主 点进去 点击Click here to download 下…

ElasticSearch学习记录

服务器操作系统版本:Ubuntu 24.04 Java版本:21 Spring Boot版本:3.3.5 如果打算用GUI,虚拟机安装Ubuntu 24.04,见 虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客文章浏览阅读6.6k次&#xff0…

【AI】数据,算力,算法和应用(3)

三、算法 算法这个词,我们都不陌生。 从接触计算机,就知道有“算法”这样一个神秘的名词存在。象征着专业、权威、神秘、高难等等。 算法是一组有序的解决问题的规则和指令,用于解决特定问题的一系列步骤。算法可以被看作是解决问题的方法…

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高:原生客户端库提供了底层的 API,需要开发者手动处理很多细节,如连接管理、会话管理、异常处理等。这增加了开发的复杂性,容易出错。连接管理繁琐:使用原生客户端库时&…

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书(发票)的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章,讲了下图里面的返品传票: SAP SD学习笔记14 - 投诉处理1 - 返品处理(退货处理)的流程以及系统实操&#…

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …

qt QToolBox详解

1、概述 QToolBox是Qt框架中的一个控件,它提供了一个带标签页的容器,用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件,但每个“选项卡”都是一个完整的页面,而不仅仅是标签。这使得QToolBo…