利用FastAPI和OpenAI-Whisper打造高效的語音轉錄服務

CodeForBetter發表於2024-07-17

最近好久沒有寫部落格了,淺淺記錄下如何將OpenAI-Whisper做成Web服務吧🤣

介紹

在這篇指導性部落格中,我們將探討如何在Python中結合使用FastAPIOpenAI-WhisperOpenAI-Whisper是一個前沿的語音識別模型,而FastAPI是一個高效能的現代Web框架,專門用於構建API。這兩種技術的結合,能夠幫助我們快速搭建一個高效的語音轉錄服務。

環境安裝

如想本地安裝可參考官網教程。如想將其做成web服務,我們需要準備好開發環境。請按照以下步驟安裝所需環境:

  • Python 3.10.10:前往Python官網下載並安裝。Windows使用者請確保在安裝過程中勾選“Add Python to PATH”,不然需自己配置環境變數。

  • Poetry:Poetry是一個Python的依賴管理和包管理工具。安裝指令如下,具體可以檢視Poetry安裝指南

    # Linux、macOS、Windows(WSL)
    curl -sSL https://install.python-poetry.org | python3 -
    # Windows(Powershell)
    (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
    
  • Pycharm:Pycharm是最強大的Python編輯器,可以從JetBrains官網下載並安裝。

專案建立

Pycharm建立專案(推薦方式)

  1. 開啟Pycharm,選擇建立新專案。

  2. 在彈出的視窗中選擇安裝路徑,並設定專案相關配置。

  3. 點選建立以初始化新專案。

    image
    )

使用命令列建立專案

  • 1. 使用Poetry建立專案:我們可以直接使用Poetry建立專案:

    poetry new demo-py
    
  • 2. 進入專案目錄:進入專案目錄準備後續操作:

    cd demo-py
    

image

安裝依賴

使用Poetry安裝FastAPI、Uvicorn(ASGI伺服器)和OpenAI-Whisper:

poetry add fastapi uvicorn whisper

Poetry依賴配置如下(可直接複製使用,不用手動add依賴):

[tool.poetry.dependencies]
python = "^3.10"
fastapi = "^0.111.1"
uvicorn = "^0.30.1"
openai-whisper = { git = "https://github.com/openai/whisper.git", rev = "v20231117" }
setuptools-rust = "^1.9.0"
numpy = "^1.26.4"

建立FastAPI應用

在專案目錄中建立一個新的Python檔案,例如main.py,並新增以下程式碼:

from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
from tempfile import NamedTemporaryFile, TemporaryDirectory
import whisper
import torch
import os

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()

@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})

執行FastAPI應用

使用Uvicorn執行FastAPI應用:

poetry run uvicorn main:app --reload

在瀏覽器中開啟http://127.0.0.1:8000/docs,你將看到自動生成的API文件,可以在這裡測試上傳音訊檔案並獲取轉錄結果。

image

點選“Try it out”上傳音影片檔案後點選“Execute”執行請求。
image

至此,我們已經成功整合了Whisper並將其作為服務提供。大家可以自行研究和擴充套件這個專案。
image

總結

透過這篇部落格,我們學習瞭如何在Python中使用FastAPI整合OpenAI-Whisper,並建立了一個簡單的語音轉錄服務。
如這篇部落格對你有所幫助可以貢獻一顆您的小⭐⭐! 專案倉庫地址ai-whisper

相關文章