暇つぶしAI「M1 Macで音声認識AI Whisper 」No.09
『空間の通訳者』のたかはしです。
M1 Macにて音声認識AI Whisperを導入しました
作業フローにおいて文字入力を自動化したいと思って
iPhoneなどいろんなツールを活用しています
音声書き起こしについては使う機会が少ないので
無料サービスを探しましたが良いモノが見つかりました
ご存じ方も多いかとも思いますがOpenAI Whisperです
#Whisperのgithubページ
今回は@daifuku10さんご提供のプログラム
large-v3モデルの高速処理「faster-Whisper」を導入しました
【MacBook Pro M1 Maxに導入】
MacBook Pro M1 Maxに導入しましたが
Apple Siliconであれば導入可能です
【Homebrewのインストール】
画像生成AI:Stable Diffusion web UIを
すでにインストールされていれば不要です
上記のHPを参考にHomebrewをインストールして下さい
*Python3.10として下さい
【Whisperのインストール】
1.インストール先のフォルダーを作成
*Whisperと名前を付けました
2.ターミナルを起動して下記のコマンドを入力
#ディレクトリ移動
cd ~/Whisper
#python3.10仮想環境の作成:venv
python3.10 -m venv venv
#仮想環境のアクティベート:
source venv/bin/activate
#whisperのインストール
pip install openai-whisper
#Faster-whisperのインストール
pip install faster-whisper
#pydub(音声ファイル操作のサードパーティ製ライブラリ)のインストール
pip install pydub
#pandas(データ分析と操作のための強力なオープンソースライブラリ)のインストール
pip install pandas
#openpyxl(xcelファイル(.xlsx形式)を読み書きするためのPythonライブラリ)のインストール
pip install openpyxl
#インストールライブラリーを確認してください
pip list
#ffmpegがインストールされているか確認
brew list
#ffmpegがインストールされていなければインストール
brew install ffmpeg
【作業プログラムを作成】
@daifuku10さんご提供のプログラムを
MAC用に一部修正しました
下記のプログラムをXcodeで記入して.pyファイルとて保存する
whisper_local_faster_whsiper_mac.py
# import whisper
from faster_whisper import WhisperModel
import
import tkinter.filedialog
from pydub import AudioSegment
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
import datetime
def split_audio_file(file_path, output_folder):
# 入力ファイルの拡張子を取得
file_extension = os.path.splitext(file_path)[1].lower()
file_name = os.path.splitext(os.path.basename(file_path))[0]
# 音声形式に応じて読み込み方法を設定
if file_extension == ".wav":
audio = AudioSegment.from_wav(file_path)
elif file_extension == ".mp3":
audio = AudioSegment.from_mp3(file_path)
elif file_extension == ".m4a":
# .m4aファイルを読み込む
audio = AudioSegment.from_file(file_path, format="m4a")
# audio = AudioSegment.from_m4a(file_path)
elif file_extension == ".mp4":
# .mp4ファイルを読み込む
audio = AudioSegment.from_file(file_path, format="mp4")
else:
raise ValueError("サポートされていない音声形式です。")
# 分割する時間間隔(1分)を取得
split_interval = 1 * 60 * 1000 # ミリ秒単位
# 分割した音声ファイルを保存するフォルダを作成
os.makedirs(output_folder, exist_ok=True)
list1 = ["","",""]
df = pd.DataFrame([list1])
df.columns = ['No', '音声ファイル', '変換結果']
# 音声ファイルを分割する
for i, start_time in enumerate(range(0, len(audio), split_interval)):
# 分割開始位置と終了位置を計算
end_time = start_time + split_interval
# 音声を分割
split_audio = audio[start_time:end_time]
# 出力ファイル名を作成
output_file = os.path.join(output_folder, f"{file_name}_{i}{file_extension}")
# 分割した音声ファイルを保存
if file_extension == ".wav":
split_audio.export(output_file, format="wav")
elif file_extension == ".mp3":
split_audio.export(output_file, format="mp3")
elif file_extension == ".m4a":
split_audio.export(output_file, format="ma4")
elif file_extension == ".mp4":
split_audio.export(output_file, format="mp4")
print(f"分割ファイル {output_file} を保存しました。")
# 音声ファイルを文字変換
print("start:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# model = whisper.load_model("large-v3")
# result = model.transcribe(output_file,word_timestamps=True)
segments, _ = model.transcribe(output_file, beam_size=5)
# result = model.transcribe(output_file)
transcription = ''
for segment in segments:
transcription = transcription + str(segment.text) + '\n'
print(transcription)
# 結果をdfにセット
df.loc[i] = [i,output_file,transcription]
# excelへ書き出し
print("end:", datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
output_file = f"./{file_name}_output.xlsx"
workbook = Workbook()
sheet = workbook.active
# DataFrameの値をシートに書き込む
for r in dataframe_to_rows(df, index=False, header=True):
sheet.append(r)
# ファイルへのリンクをセット
for row in sheet.iter_rows(min_row=2, min_col=2, max_col=2): # B列の値を処理
cell = row[0]
file_path = cell.value
if file_path:
cell.hyperlink = file_path
cell.value = f'{file_path}'
# Excelファイルを保存
workbook.save(output_file)
# 入力ファイルのパスと出力フォルダのパスを指定
filetypes = [("wav files","*.wav"),('MP3 Files', '*.mp3'),('M4A Files', '*.m4a'),('MP4 Files', '*.mp4')]
input_file_path = tkinter.filedialog.askopenfilename(filetypes = filetypes,initialdir = './')
if not input_file_path:
print("ファイルが選択されなかった")
exit()
output_folder_path = "./output_folder"
model_size = "large-v3"
# Run on GPU with FP16
model = WhisperModel(model_size, device="cpu", compute_type="float32")
# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
# model = WhisperModel(model_size, device="cpu", compute_type="int8")
# 音声ファイルを分割&音声変換
split_audio_file(input_file_path, output_folder_path)
【作業プログラムを実行】
作業プログラムを実行すると音声ファイル(wav,mp3,ma4,mp4)の
選択ウィンドウが出ますので選択します。
音声ファイルを1分づるに分割して保存され
音声認識してエクセルにまとめて保存されます。
ターミナルを起動して下記のコマンドを入力
#faster-whisper Large-v3 プログラム起動
cd ~/Whisper/openai
source venv/bin/activate
python whisper_local_faster_whsiper_mac.py
【まとめ】
今回は無料でローカルで動かせる音声認識AIを紹介しました。
モデルがLarge-v3と認識精度が高くて早く動くモデル
faster-whisperを使いましたがApple SiliconのGPUではなく
CPUでの動作なのでそれなりです
早さを求める方はApple Silicon GPU対応のモデルを使うが
私の様にNVIDIA RTX4090の導入が必要でしょう
参考:Apple Silicon GPU対応のモデル
暇つぶしAIを楽しんでください。
何かの参考やヒントになれば嬉しいです!