【備忘録】AI文字起こしwhisperの導入方法の一例

# 目次
- [はじめに](#はじめに)
- [1. PythonとCUDAのバージョン確認をする。](#1-pythonとcudaのバージョン確認をする)
- [2. GPU版のpytorchを導入する。](#2-gpu版のpytorchを導入する)
  - [2-1. `pip list`でpytorchのインストールを確認する。](#2-1-pip-listでpytorchのインストールを確認する)
  - [2-2. GPU版のpytorchを導入する。](#2-2-gpu版のpytorchを導入する)
  - [2-3. GPU版のpytorchが導入出来たかを確認する。](#2-3-gpu版のpytorchが導入出来たかを確認する)
- [3. 任意の場所にフォルダ作成し、仮想環境を構築する。](#3-任意の場所にフォルダ作成し仮想環境を構築する)
- [4. 実際に字幕ファイルの生成をしてみる](#4-実際に字幕ファイルの生成をしてみる)
  - [4-1. 動画のファイルパスをコピーする](#4-1-動画のファイルパスをコピーする)
  - [4-2. スクリプトの作成と実行](#4-2-スクリプトの作成と実行)
  - [4-3. 修正版スクリプト](#4-3-修正版スクリプト)
  - [4-4. スクリプトの呼び出しに関して](#4-4-スクリプトの呼び出しに関して)
- [AviUtlをご利用の場合(srtからexoへ変換)](#aviutlをご利用の場合srtからexoへ変換)
- [参考YouTube動画](#参考youtube動画)

# はじめに
Open AI社の提供しているwhisperを使えば無料で自動字幕生成と聞いたので試しに使ってみたときに残した個人的なメモ書きとなります。

# 1. PythonとCUDAのバージョン確認をする。
2024年2月27日時点での私の環境下でのバージョンは以下の通り、参考までに記載。  
```
> python -V
Python 3.10.11
```
https://www.python.org/downloads/release/python-31011/  

```
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Wed_Feb__8_05:53:42_Coordinated_Universal_Time_2023
Cuda compilation tools, release 12.1, V12.1.66
Build cuda_12.1.r12.1/compiler.32415258_0
```
https://developer.nvidia.com/cuda-12-1-0-download-archive  

利用しているGPUはRTX 3060 12GBとなっています。

https://www.nvidia.com/en-us/geforce/graphics-cards/30-series/rtx-3060-3060ti/

whisperのページによると`large` modelあたりになってくるとVRAM 10GB程度必要とのこと。

https://github.com/openai/whisper

# 2. GPU版のpytorchを導入する。

## 2-1. `pip list`でpytorchのインストールを確認する。
必要に応じてCPU版のpytorchをアンインストールする。  
```
pip uninstall torch
pip uninstall torchaudio
pip uninstall torchvision
```

## 2-2. GPU版のpytorchを導入する。
PyTorchの公式サイトからインストールのためのコマンドを確認できる。

https://pytorch.org/get-started/locally/  

CUDA 12.1の場合は以下のコマンドでGPU版のpytorchをインストールする。  
```
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
```

## 2-3. GPU版のpytorchが導入出来たかを確認する。

`pip list`で導入が出来たかを確認する。  
```
torch                     2.2.1+cu121
torchaudio                2.2.1+cu121
torchvision               0.17.1+cu121
```
`+cu121`を確認する。  

以下の内容で`checkGPUpytorch.py`を作成する。  
```
import torch
# Check GPU recognization True or False
print(torch.cuda.is_available())
# Check default how many GPU devices and GPU number
print(torch.cuda.device_count())
print(torch.cuda.current_device())
# Check GPU device name
print(torch.cuda.get_device_name())
```

以下をWindows Terminalにて実行する。  
今回は"D:\whisper"に環境構築したため、必要に応じて変更。  
```
cd D:\whisper
py checkGPUpytorch.py
```
以下の結果が得られれば完了。  
"NVIDIA GeForce RTX 3060"の部分に関しては自身のPC環境を確認する。  
```
True
1
0
NVIDIA GeForce RTX 3060
```

# 3. 任意の場所にフォルダ作成し、仮想環境を構築する。
今回は"D:\whisper"を作成した。  
以下の内容で`RunInitialSetup.bat`を作成し実行する。  
```
python -m venv venv
./venv/scripts/activate
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install git+https://github.com/openai/whisper.git
```

# 4. 実際に字幕ファイルの生成をしてみる
拝借元YouTube動画

https://www.youtube.com/shorts/h2GOOwwtVC4  

以下、コマンド入力一例。  
```
./venv/scripts/activate
whisper --model tiny --output_format srt --language Japanese "D:\whisper\バキバキ童貞になったと気づいた日_shorts.mp4"
```
## 4-1. 動画のファイルパスをコピーする
動画ファイルのパス取得はWindows 10の場合、  
`Shift`+`右クリック`で「パスのコピー(A)」を選択するとできる。  

![How_to_get_PATH.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3729100/922dbb9a-35f9-6e89-aa54-da02814a43c2.png)

## 4-2. スクリプトの作成と実行
簡単なスクリプト作成した。  
コピーしたパスをそのまま貼ってそれ以降は`Enter`を連打するればダウンロードフォルダに字幕ファイルが保存される。  

以下Powershellのスクリプト一例。  
プログラマーではない上に普段Powershellでスクリプトを書く機会がないのでこの書き方が適切かは微妙なため、必要に応じて内容を修正等して頂くと幸いです。  

```whisper.ps1
# Run update
pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git

# Activate virtual environment
./venv/scripts/activate

# Create filedialog
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$shellapp = New-Object -ComObject Shell.Application
$dialog.InitialDirectory = $shellapp.Namespace("shell:Downloads").Self.Path

# Select video file
Write-Host 'Please select video file'
if($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
	$PATH = $dialog.FileName
	Write-Host 'File selected'
}

$MODEL = Read-Host 'Enter model (MAX large-v3, DEFAULT base)'
if([string]::IsNullOrEmpty($format)){
	# Set default file model
	$MODEL = 'base'
}

$LANGUAGE = Read-Host 'Enter language (DEFAULT Japanese)'
if([string]::IsNullOrEmpty($format)){
	# Set default file language
	$LANGUAGE = 'Japanese'
}

$FORMAT = Read-Host 'Enter format to save (DEFAULT srt)'
if([string]::IsNullOrEmpty($FORMAT)){
	# Set default file format
	$FORMAT = 'srt'
}

$OUTPUT_DIR = Read-Host 'Enter save file location (DEFAULT download folder)'
if([string]::IsNullOrEmpty($location)){
    # Default file location
	$shellapp = New-Object -ComObject Shell.Application
	$OUTPUT_DIR = $shellapp.Namespace("shell:Downloads").Self.Path
}

$trasnlate_question = Read-Host 'Do you want to translate to English? (yes/no)'
if($trasnlate_question -in 'yes', 'y'){
	# Run whisper with English translate
	whisper --model $MODEL --output_dir $OUTPUT_DIR --output_format $FORMAT --language $LANGUAGE --task translate $PATH
} else {
	# Run whisper without English translate
	whisper --model $MODEL --output_dir $OUTPUT_DIR --output_format $FORMAT --language $LANGUAGE $PATH
}

Write-Host 'DONE'
Write-Host 'Press any key to close...'
$host.UI.RawUI.ReadKey()
```

## 4-3. 修正版スクリプト
ファイルダイアログを利用して指定するようにするようにスクリプトを修正した。
```whisper.ps1
# Activate virtual environment
./venv/scripts/activate
# Create filedialog
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$shellapp = New-Object -ComObject Shell.Application
$dialog.InitialDirectory = $shellapp.Namespace("shell:Downloads").Self.Path
# Select video file
Write-Host 'Please select video file'
if($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
	$PATH = $dialog.FileName
	Write-Host 'File selected'
}
# Enter model
$MODEL = Read-Host 'Enter model (MAX large-v3, DEFAULT large-v3)'
if([string]::IsNullOrEmpty($MODEL)){
	# Set default file model
	$MODEL = 'large-v3'
}
# Select language
$LANGUAGE = Read-Host 'Enter language (DEFAULT Japanese)'
if([string]::IsNullOrEmpty($LANGUAGE)){
	# Set default file language
	$LANGUAGE = 'Japanese'
}
# Select format
$FORMAT = Read-Host 'Enter format to save (DEFAULT srt)'
if([string]::IsNullOrEmpty($FORMAT)){
	# Set default file format
	$FORMAT = 'srt'
}
# Select save file directory
$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
$shellapp = New-Object -ComObject Shell.Application
$dialog.SelectedPath = $shellapp.Namespace("shell:Downloads").Self.Path
if($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
    $OUTPUT_DIR = $dialog.SelectedPath
}
# Translate question
$trasnlate_question = Read-Host 'Do you want to translate to English? (yes/no)'
if($trasnlate_question -in 'yes', 'y'){
	# Run whisper with English translate
	whisper --model $MODEL --output_dir $OUTPUT_DIR --output_format $FORMAT --language $LANGUAGE --task translate $PATH
} else {
	# Run whisper without English translate
	whisper --model $MODEL --output_dir $OUTPUT_DIR --output_format $FORMAT --language $LANGUAGE $PATH
}
# Pause
Write-Host 'DONE'
Write-Host 'Press any key to close...'
$host.UI.RawUI.ReadKey()
```

## 4-4. スクリプトの呼び出しに関して
`RunScript.bat`ファイルを作成した。
```
powershell -NoProfile -ExecutionPolicy Bypass .\<SCRIPT NAME>.ps1
```
このbatファイルのショートカット作成して任意の場所(例えば、`C:\ProgramData\Microsoft\Windows\Start Menu\Programs`)に保存する。  

ショートカット名を`whisper OpenAI`などに変更して、
`Windowsキー`-->`whisper`と入力-->`Enter`
で簡単に呼び出せるようにしている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3729100/77a825ad-3b17-8c22-36f7-1f883504e59e.png)

# AviUtlをご利用の場合(srtからexoへ変換)
一般的な動画編集ソフトであれば、字幕はsrtファイルに対応しているが、動画編集ソフトAviUtlに関してはどうやら標準ではsrtファイルに対応していないらしい。  

AviUtlはアプリケーションとしては古く、更新もないがネット上ではまだ利用者が多いと聞く。そのため、少し調べて見つけた字幕ファイルの変換スクリプトのダウンロード先を一応記載する。  
私自身はAviUtlを利用していないので、記載したWebページにあるexoファイルへの変換するためのスクリプトの利用に関しては自己責任でお願いします。  

https://crayonzen.kachoufuugetu.net/exo2srt_srt2exo.html

# 参照したYouTube動画

https://www.youtube.com/watch?v=ko0h9UwEVpM&t=326s  

https://www.youtube.com/watch?v=Yv75_hU0hdg&t=654s