1 Whispter のダウンロード
まず Whisper を OpenAI の GitHub からダウンロードします.
pip install git+https://github.com/openai/whisper.git
さらに,内部で ffmpeg
が必要になるので,これもダウンロードしておく必要があります.MacOS の場合は次のコマンドでインストールできます.1
brew install ffmpeg
ローカル環境ではなくとも,Google Colaboratory を用いてブラウザ上で実行することもできます.その場合の詳しいやり方は,こちらのサイト が参考になります.
2 ファイルの分割
Whispter はどんなに大きな音声ファイルを渡しても 25MB 時点までしか書き起こしてくれません.そのため,ファイルを分割して Whispter に渡すこととします.次のコードは大きなファイルを分割するための関数を定義しています. duration=240
で,何秒間でファイルを区切るかを指定します.筆者の経験上 240 秒(4分)がうまくいきます.
2.1 .wav
ファイルの場合
import wave
def split_wav_file(filename, duration=240):
# WAVファイルを開く
with wave.open(filename, 'rb') as wav:
# パラメータの取得
= wav.getparams()
n_channels, sampwidth, framerate, n_frames, comptype, compname
# 5分間のフレーム数を計算
= framerate * duration * n_channels * sampwidth
frames_per_split
# 全フレームを読み込み
= wav.readframes(n_frames)
frames
# 分割してファイルに書き込む
for i in range(0, len(frames), frames_per_split):
# 新しいファイル名
= f'split_{i // frames_per_split}.wav'
new_file
# 新しいファイルを書き込む
with wave.open(new_file, 'wb') as new_wav:
// (n_channels * sampwidth), comptype, compname))
new_wav.setparams((n_channels, sampwidth, framerate, frames_per_split +frames_per_split]) new_wav.writeframes(frames[i:i
こうして定義した関数を次のように用いると, split_n.wav
という名前で,複数のファイルに分割してくれます.
'[あなたの手元のファイル名].wav') split_wav_file(
2.2 .mp3
ファイルの場合
from pydub import AudioSegment
def split_audio_file(filename, duration=240000): # durationはミリ秒単位
# ファイル形式を拡張子から判断
= filename.split('.')[-1].lower()
extension
# AudioSegmentを使用してオーディオファイルを読み込む
if extension == "wav":
= AudioSegment.from_wav(filename)
audio elif extension == "mp3":
= AudioSegment.from_mp3(filename)
audio else:
raise ValueError("Unsupported file format")
# 分割してファイルに書き込む
= 0
start = 1
part while start < len(audio):
# 新しいファイル名
= f'split_{part}.{extension}'
new_file # セグメントを切り出して保存
= audio[start:start+duration]
segment format=extension)
segment.export(new_file,
+= duration
start += 1 part
ただし,目的となるファイルが存在するディレクトリで
"[あなたの手元のファイル名].mp3") split_audio_file(
と使うようにしてください.
3 書き起こし
続いて,細かく分けたファイル split_n.wav
たちを順に Whisper に渡して書き起こしてもらい,結果を1つのテキストファイル 書き起こし.txt
にまとめてもらいます.
import whisper
# モデルのロード
= whisper.load_model("large") # やっぱ精度が違います
model
# ファイルのリスト
= [f"split_{i}.wav" for i in range(27)] # split_0.wav から split_26.wav まで
files
# 結果を格納するための空の文字列
= ""
transcription
# 各ファイルを順番に処理
for file in files:
# ファイルを書き起こし
= model.transcribe(file, language='ja')
result += result["text"] + "\n\n"
transcription
# 書き起こし結果をテキストファイルに書き込む
with open("書き起こし.txt", "w", encoding="utf-8") as text_file:
text_file.write(transcription)
ここでは最大のモデル large
を用いています.その場合,結構な時間がかかります.