見出し画像

暇つぶし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を楽しんでください。
何かの参考やヒントになれば嬉しいです!


よければサポートお願いします! いただいたサポートは活動費に使わせていただきます(^^)