openai-whisper+fastapi实现语音转文本

news/2025/2/8 10:44:11/文章来源:https://www.cnblogs.com/lyu6/p/18703784

Whisper 是一种通用的语音识别模型。它基于各种音频的大型数据集进行训练,也是一种多任务模型,可以执行多语言语音识别、语音翻译和语言识别。

Transformer 序列到序列模型针对各种语音处理任务进行训练,包括多语言语音识别、语音翻译、口语识别和语音活动检测。这些任务共同表示为解码器要预测的令牌序列,从而允许单个模型替换传统语音处理管道的许多阶段。多任务训练格式使用一组特殊标记,用作任务说明符或分类目标。
py依赖项

fastapi~=0.112.1
uvicorn~=0.30.6
openai-whisper @ git+https://github.com/openai/whisper.git@v20231117
setuptools-rust==1.9.0
numpy==1.26.4
OpenCC==1.1.9
whisper~=1.1.10
torch~=2.4.0

它还需要在系统上安装命令行工具 ffmpeg,大多数包管理器都可以使用该工具:

# on Ubuntu or Debian
sudo apt update && sudo apt install ffmpeg# on Arch Linux
sudo pacman -S ffmpeg# on MacOS using Homebrew (https://brew.sh/)
brew install ffmpeg# on Windows using Chocolatey (https://chocolatey.org/)
choco install ffmpeg# on Windows using Scoop (https://scoop.sh/)
scoop install ffmpeg

如不需要借助工具安装,那么可以在官网直接下载安装包,解压后设置bin路径到环境变量中,具体可参考Win10 ffmpeg安装

whisper 模型库

用于纯英语应用程序的 .en 模型往往性能更好,尤其是对于 tiny.en 和 base.en 模型。我们观察到,small.en 和 medium.en 模型的差异变得不那么显著。此外,turbo 模型是 large-v3 的优化版本,可提供更快的转录速度,同时将准确性的下降降至最低。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socketimport uvicorn
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
from tempfile import TemporaryDirectory
import whisper
import torch
import os
import logging# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')from typing import List# 检查是否有NVIDIA GPU可用
torch.cuda.is_available()
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# 加载Whisper模型
model = whisper.load_model("base", device=DEVICE)app = FastAPI()def get_ip_address():"""查询本机ip地址"""s = Nonetry:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))ip = s.getsockname()[0]return ipexcept Exception as e:logging.error(f"获取ip 异常 {e}")ip = "127.0.0.1"finally:if s is not None:s.close()return ip@app.post("/whisper/")
async def handler(files: List[UploadFile] = File(...)):if not files:raise HTTPException(status_code=400, detail="No files were provided")# 对于每个文件,存储结果在一个字典列表中results = []# 使用TemporaryDirectory创建临时目录with TemporaryDirectory() as temp_dir:for file in files:# 在临时目录中创建一个临时文件temp_file_path = os.path.join(temp_dir, file.filename)with open(temp_file_path, "wb") as temp_file:# 将用户上传的文件写入临时文件temp_file.write(file.file.read())temp_file.flush()  # 确保所有数据写入磁盘# 确保文件在转录前已关闭result = model.transcribe(temp_file_path)# 存储该文件的结果对象results.append({'filename': file.filename,'transcript': result['text'],})# 返回包含结果的JSON响应return JSONResponse(content={'results': results})if __name__ == '__main__':uvicorn.run(app=app, host=get_ip_address(), port=8080)

输出结果:

可以看到是中文繁体的,如需要转为简体,则需要借助OpenCC

from opencc import OpenCC
open_cc = OpenCC("t2s")
simple_zh = open_cc.convert("PTS Maker 馬克配音是一款免費的紋本轉與音工具提供與音合成服務 支持多種語言包括中文、英語、日語、韓語、法語、德語、西班牙語、阿拉伯語等50多種語言以及超過300種與音風格您可以用它製作視頻配音 也可以用於有聲書朗讀或下載音頻文件 用於商業用途完全免費作為一款優秀的AI配音工具TTS Maker 可以輕鬆的將紋本轉換為語音")
print(simple_zh)

输出结果:

PTS Maker 马克配音是一款免费的纹本转与音工具提供与音合成服务 支持多种语言包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言以及超过300种与音风格您可以用它制作视频配音 也可以用于有声书朗读或下载音频文件 用于商业用途完全免费作为一款优秀的AI配音工具TTS Maker 可以轻松的将纹本转换为语音

完整代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socketimport uvicorn
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
from tempfile import TemporaryDirectory
import whisper
import torch
import os
import logging
from opencc import OpenCC# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')from typing import List# 检查是否有NVIDIA GPU可用
torch.cuda.is_available()
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# 加载Whisper模型
model = whisper.load_model("base", device=DEVICE)app = FastAPI()
open_cc = OpenCC("t2s")def get_ip_address():"""查询本机ip地址"""s = Nonetry:s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(('8.8.8.8', 80))ip = s.getsockname()[0]return ipexcept Exception as e:logging.error(f"获取ip 异常 {e}")ip = "127.0.0.1"finally:if s is not None:s.close()return ip@app.post("/whisper/")
async def handler(files: List[UploadFile] = File(...)):if not files:raise HTTPException(status_code=400, detail="No files were provided")# 对于每个文件,存储结果在一个字典列表中results = []# 使用TemporaryDirectory创建临时目录with TemporaryDirectory() as temp_dir:for file in files:# 在临时目录中创建一个临时文件temp_file_path = os.path.join(temp_dir, file.filename)with open(temp_file_path, "wb") as temp_file:# 将用户上传的文件写入临时文件temp_file.write(file.file.read())temp_file.flush()  # 确保所有数据写入磁盘# 确保文件在转录前已关闭result = model.transcribe(temp_file_path)# 存储该文件的结果对象results.append({'filename': file.filename,'transcript': open_cc.convert(result['text']),})# 返回包含结果的JSON响应return JSONResponse(content={'results': results})if __name__ == '__main__':uvicorn.run(app=app, host=get_ip_address(), port=8080)

swagger-ui 地址为主机ip:8080/docs

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

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

相关文章

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型,也提供了 API(接口)调用方式。据 DeepSeek介绍,DeepSeek-R1 后训练阶段大规模使用了强化学习技术,在只有极少标注数据的情况下提升了模型推理能力,该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出后,该模型热度持续攀升。 部署流程点击 部…

5-多线程详解【狂神】

线程简介 1、多任务 看似多个任务都在做,本质上我们大脑在同一时间依旧只做一个事情 2、多线程 普通方法调用:只有主线程一条执行路径 多条执行路径,主线程和子线程并行交替执行线程实现(重点) 线程状态 线程同步(重点) 线程通信问题 高级主题

win11配置虚拟机centos网络 nat模式

1,配置nat8网络 2,配置虚拟机虚拟网络虚拟机 → 编辑 → 虚拟网络编辑器虚拟机中输入命令: vi /etc/sysconfig/network-scripts/ifcfg-ens33 配置后重启网络: service network restart

终于有人说清楚AI开发的全流程了!

阿里妹导读本文将深入解析AI需求开发流程,全面覆盖从需求分析、开发、测试到发布及后续的监控和反馈收集等各个阶段。引言继上篇文章 《掌握Prompt写作技巧:写出完美Prompt的秘籍》对Prompt写作技巧的探讨,本篇将深入解析AI需求开发流程,全面覆盖从需求分析、开发、测试到发…

真的不错!微信公众号文章批量下载工具3.0版,支持评论、图片、word文件导出!

一、前言 之前发布的旧版本的说明,可以看下之前发布的这3篇文章: 真的免费!微信公众号文章批量下载工具,轻松导出html、word、pdf文档! 微信公众号文章批量下载工具1.2版本更新,轻松导出html、word、pdf文档! 重磅更新!微信公众号文章批量下载工具2.0版,轻松导出html、…

【题解】杂题选讲

杂题选讲 AT_abc350_g [ABC350G] Mediator 先考虑没有加边操作,如何回答询问? 设 \(fa_x\) 表示 \(x\) 的父亲,那么对 \((x,y)\) 的询问有解只有三种情况。 \(fa_x=fa_y\ne 0, fa_{fa_x}=y, fa_{fa_y}=x\)。 只需要维护 \(fa\) 数组即可回答所有询问,如何维护?使用启发式合…

十二. Redis 集群操作配置(超详细配图,配截图详细说明)

十二. Redis 集群操作配置(超详细配图,配截图详细说明) @目录十二. Redis 集群操作配置(超详细配图,配截图详细说明)1. 为什么需要集群-高可用性2. 集群概述(及其搭建)3. Redis 集群的使用4. Redis 集群故障恢复5. Redis 集群的 Jedis 开发(使用Java程序连接 Redis 同时开启集…

Docker:Docker搭建Jenkins并共用宿主机Docker部署服务(六)跨服务器远程部署前端服务

前言 继续完成跨服务器远程部署前端服务,Jenkins的搭建与插件安装可以观看上一篇文章:https://www.cnblogs.com/nhdlb/p/18561435 配置SSH远程服务器连接 这里需要安装 SSH 连接的插件,可以观看上一篇文章进行安装。开始配置SSH连接保存!! 新建视图 方便将整个项目的前端和…

一文详解文件摆渡系统是什么?企业需要什么样的文件摆渡产品?

文件摆渡系统是一种旨在实现企业内不同网络、安全域、网段之间的文件传输、同步、共享、管理与处理的工具或平台。文件摆渡系统的主要作用是确保文件能够在不同的存储环境、操作系统、应用程序或部门之间有效传递,同时保障文件的安全性、完整性和合规性。一、文件摆渡系统的核…

IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

日前,IvorySQL 4.0 重磅发布,全面支持 PostgreSQL 17,并且增强了对 Oracle 的兼容性。关于 IvorySQL 4.0 的介绍,各位小伙伴可以通过这篇文章回顾:IvorySQL 4.0 发布:全面支持 PostgreSQL 17. 在 IvorySQL 4.0 发布后,有小伙伴私下询问升级方法,那么本篇文章就来详细描…

kvm 基础

kvm 概述 KVM(Kernel-based Virtual Machine)是一个开源虚拟化技术,它将 Linux 内核转变为一个裸金属 hypervisor。 基本概念 1. 集成于 Linux:KVM 是 Linux 内核的一部分,支持在现有的 Linux 系统上创建和管理虚拟机。 2. 虚拟化类型:KVM 支持完全虚拟化,允许运行不同操…

Ftrans数据跨境传输方案,推动数据跨境安全有序自由流动!

在全球数字经济快速发展的今天,数据跨境传输流动已成为企业国际化不可回避的重要议题。根据权威机构数据,全球跨境数据流量每年增长超过30%,企业数据出境已从简单的信息传输,演变为复杂的合规性管理。 目前,我国数据跨境传输安全管理体系已经初步构建形成。《网络安全法》…