Screenshot of Whisper

OpenAI Whisper + Python 轉換 GoodNotes 音檔

最近期末考,很多課都只是錄音沒在上課,有些老師講話又很慢,所以剛剛好來玩玩 OpenAI API

Reference: https://platform.openai.com/docs/guides/speech-to-text/quickstart

Whisper by OpenAI

GitHub: https://github.com/GJC14/whisper

Whisper 是 OpenAI API platform 的其中一個 Models,其他的還有比較知名的文字、圖像模型 (Chat)GPT、DALL·E。雖然目前也有許多團隊有自己的 Speech to text AI,像是 Google Cloud Speech-to-Text、SpeechText.AI、Descript,但因為 OpenAI 可以直接把文字丟回給 GPT 整理,所以選擇 Whisper 有興趣的可以自己關鍵字搜尋。另外來點數據,我使用 10 分鐘長度的民法概要表見代理錄音檔,1,435 個字只有 5 個錯誤,錯誤不到 0.5%,算是非常非常非常準確!

Import OpenAI

要轉換超簡單,只要兩個步驟。

OpenAI 把這個分成 Transcription 跟 Translation,輸出 JSON,具體來說是 <class ‘openai.types.audio.transcription.Transcription’>,可以直接使用 transcription.text 取得內容,不過目前 Translation 只能轉換成 English,需要再經過 GPT 翻譯(當然也可以直接丟 Google Translate)。

這個是官方 Documentation 給的程式碼,在使用前要 pip install openai

from openai import OpenAI
client = OpenAI()

audio_file= open("/path/to/file/audio.mp3", "rb")
transcript = client.audio.transcriptions.create(
  model="whisper-1", 
  file=audio_file
)

除了官方給的,還需要兩個步驟:

  1. api_key 從 OpenAI Developer Platform https://platform.openai.com/docs/overview 取得
  2. .env 用來儲存 Environment Variables

在檔案夾中除了 main.py 之外,還要新增 .env,放入從 Developer Platform 取得的 api_key,使用 OpenAI 預設的變數名稱 OPENAI_API_KEY,在初始化 client = OpenAI() 的時候就不用在括號內輸入變數了。

# .env
OPENAI_API_KEY=asdfyourapi_key

然後在 main.py 頂端加上 dotenv 以自動在 Python 執行環境匯入 .env 檔案

from dotenv import load_dotenv
load_dotenv()

這樣就可以輸入你的 mp3 檔案路徑,使用 transcript.text 取得輸出資料了!

from dotenv import load_dotenv
load_dotenv()
from openai import OpenAI
client = OpenAI()

audio_file= open("./audio.mp3", "rb")
transcript = client.audio.transcriptions.create(
  model="whisper-1", 
  file=audio_file
)
print(transcript.text)
'''
因為法律行為的三階段之前有講過,成立生效與行 那一般人呢,是本人自己在訂約,自己處理成立生效與行 但是對於企業來講,他要僱用大量的員工去訂大量的契約 所以代理人把法律行為談成,讓他成立生效之後 那本人承擔的就是履行法律行為契約義務的責任 像這一類的選擇題,在各種證照考試裡面常常考 那他的上方,也
'''

修改錄音檔案

如果一堂課錄滿三個小時,檔案可能會太大或太長,這邊提供 ffmpeg 的修剪方法,免費轉換成 mp3 並修改長度,記得使用前要先有 ffmpeg,Mac 的話可以使用 brew install ffmpeg,檔案有點大需要跑一下。

import subprocess
file_path = "./audio.mp3"       # input file path
file_name = file_path.split("/")[-1].split(".")[0]  # input file name
start_time = "00:00:00.000" # start time
duration = "00:10:00.000"   # duration
file_name_new = file_name + "_output.mp3"      # output file name

command = ["ffmpeg", "-i", file_path, "-ss", start_time, "-t", duration, file_name_new]   # ffmpeg command
subprocess.run(command, check=True)  # run ffmpeg command

執行後你的 root 就會多一個 audio_output 的檔案嘍!

取得 GoodNote 錄音檔

因為我的是在 GoodNote 上錄音的,當要輸出的時候會發現沒辦法單純輸音檔,而且如果直接在 App 裡面聽沒辦法 2倍速(饒了我),所以這邊同場加映!

  1. 找到分享按鈕匯出 GoodNote 格式(不要使用 PDF 或其他方法),
  2. 修改副檔名 .goodnotes 至 .zip,然後解壓縮,
  3. 在檔案夾 attachment 裡面找到檔案比較肥大的,把他加上副檔名 .mp3 就是了!