Whisperを使ったYouTubeの文字起こしのスクリプトを書いてみた

## 前置き
Whisperを使ったYouTubeの文字起こしのスクリプトを書いてみました。
理由は、CrowdWorksでYouTubeの文字起こしの案件を請け負って小遣い銭稼ぎをしたくなったからです。
そこで目を付けたのが、今流行りのOpenAIのWhisperを活用して、効率化することでした。

ライブラリのインストールのコマンドと、文字起こしのコードを載せます。
言語はPython、実行環境はGoogle Colaboratoryです。

## ライブラリをインストールするコマンド
````
!pip install yt-dlp
!pip install openai
````

````
!pip install yt-dlp
````

このコマンドは、Pythonのパッケージ管理ツールであるpipを使用して、`yt-dlp`というパッケージをインストールします。`yt-dlp`は、YouTubeの動画や音声のダウンロードを行うためのユーティリティです。このコマンドを実行することで、`yt-dlp`パッケージがローカル環境にダウンロードされ、利用することができるようになります。

````
!pip install openai
````

このコマンドは、同様にpipを使用して、`openai`というパッケージをインストールします。`openai`パッケージは、OpenAIのAPIをPythonから利用するためのライブラリです。このコマンドを実行することで、`openai`パッケージがインストールされ、OpenAIのAPIを使用するための準備が整います。


## 文字起こしをするためのコード
````
from typing_extensions import Text
import yt_dlp
import subprocess
import openai

def download_title(video_url):
    # yt-dlpコマンドを組み立てる
    cmd = f"yt-dlp -q -s --get-title {video_url}"
    
    # yt-dlpコマンドを実行してタイトルを取得
    title = subprocess.check_output(cmd, shell=True, text=True).strip()
    
    return title

def save_title_to_file(title):
    # タイトルをテキストファイルに保存
    with open(f"{title}.txt", "w", encoding="utf-8") as file:
        file.write(title)

video_url = "https://www.youtube.com/watch?v=Iw28whhyQnE"  # YouTube動画のURL

# タイトルを取得
video_title = download_title(video_url)

# yt-dlpのオプションを設定
options = {
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',  # 音声を抽出するポストプロセッサ
        'preferredcodec': 'aac',  # 目的の音声形式
        'preferredquality': '52',  # 目的の音声品質
    }],
    'outtmpl': f"{video_title}.%(ext)s",  # 出力ファイル名
}

# ダウンロード
with yt_dlp.YoutubeDL(options) as ydl:
    ydl.download([video_url])

# Whisper APIで文字起こし
# OpenAI APIのトークンを指定
openai.api_key = <APIキー>

# 音声ファイルを開き、audio_fileに代入
audio_file= open(f"/content/{video_title}.m4a", "rb")
# 文字起こしのデータをWhisper APIから取得
transcript = openai.Audio.transcribe("whisper-1", audio_file)
# 文字起こしのデータの書き込みを.txtファイルへ！
with open(f"/content/{video_title}.txt", "w", encoding="utf-8") as file:
    file.write(transcript["text"])
````

## コードの解説
````
from typing_extensions import Text
import yt_dlp
import subprocess
import openai
````
この部分では、必要なライブラリやモジュールをインポートしています。`typing_extensions`は型のサポートを提供するモジュールです。`yt_dlp`は`yt-dlp`パッケージを使用するためのモジュールです。`subprocess`モジュールは外部プロセスを実行するためのモジュールであり、`openai`はOpenAIの機能を使用するためのモジュールです。

````
def download_title(video_url):
    # yt-dlpコマンドを組み立てる
    cmd = f"yt-dlp -q -s --get-title {video_url}"
    
    # yt-dlpコマンドを実行してタイトルを取得
    title = subprocess.check_output(cmd, shell=True, text=True).strip()
    
    return title
````
`download_title`という関数は、指定されたビデオのURLからタイトルを取得するための関数です。内部で`yt-dlp`コマンドを組み立てて実行し、その結果としてビデオのタイトルを取得しています。

````
def save_title_to_file(title):
    # タイトルをテキストファイルに保存
    with open(f"{title}.txt", "w", encoding="utf-8") as file:
        file.write(title)
````
`save_title_to_file`という関数は、与えられたタイトルをテキストファイルに保存するための関数です。タイトルをファイル名として使用し、そのタイトルを内容としてテキストファイルに書き込んでいます。
````
video_url = "https://www.youtube.com/watch?v=Iw28whhyQnE"  # YouTube動画のURL

# タイトルを取得
video_title = download_title(video_url)
````
`video_url`にはYouTubeの動画のURLが指定されており、`download_title`関数を使ってその動画のタイトルを取得しています。

````
options = {
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',  # 音声を抽出するポストプロセッサ
        'preferredcodec': 'aac',  # 目的の音声形式
        'preferredquality': '52',  # 目的の音声品質
    }],
    'outtmpl': f"{video_title}.%(ext)s",  # 出力ファイル名
}
````
`postprocessors`は、ダウンロードしたビデオに対して実行されるポストプロセッサの設定を指定するリストです。この場合、1つのポストプロセッサが指定されています。

`'key': 'FFmpegExtractAudio'`は、ビデオから音声を抽出するポストプロセッサを指定しています。このポストプロセッサはFFmpegを使用して音声を抽出します。

`'preferredcodec': 'aac'`は、抽出された音声の形式をAACに指定しています。AACは高品質で圧縮効率の高い音声形式です。

`'preferredquality': '52'`は、抽出された音声の品質を指定しています。具体的な品質レベルは実装やコーデックに依存しますが、ここでは品質レベル52が指定されています。

`'outtmpl': f"{video_title}.%(ext)s"`は、ダウンロードしたビデオの出力ファイル名を指定しています。`%(ext)s`はビデオの拡張子を保持するためのプレースホルダです。

これらのオプションを使用することで、ビデオの音声を抽出し、指定された形式と品質で保存することができます。

````
# ダウンロード
with yt_dlp.YoutubeDL(options) as ydl:
    ydl.download([video_url])
````
`yt_dlp.YoutubeDL(options)`を使用して、指定されたオプションで`yt-dlp`を初期化します。その後、`ydl.download([video_url])`を実行することで、指定されたURLのビデオをダウンロードします。

````
# Whisper APIで文字起こし
# OpenAI APIのトークンを指定
openai.api_key = <APIキー>

# 音声ファイルを開き、audio_fileに代入
audio_file = open(f"/content/{video_title}.m4a", "rb")
# 文字起こしのデータをWhisper APIから取得
transcript = openai.Audio.transcribe("whisper-1", audio_file)
# 文字起こしのデータを.txtファイルに書き込み
with open(f"/content/{video_title}.txt", "w", encoding="utf-8") as file:
    file.write(transcript["text"])
````
ここでは、OpenAIのWhisper APIを使用して音声ファイルの文字起こしを行います。まず、`openai.api_key`にAPIキーを指定します（実際のAPIキーに置き換えてください）。次に、指定された音声ファイルを開き、`openai.Audio.transcribe`を使用してWhisper APIから文字起こしのデータを取得します。最後に、取得した文字起こしのデータを指定された`.txt`ファイルに書き込みます。

## 締め
このコードは、大部分をChatGPTに書いてもらいました。
Python初学者ですが、おかげでサクサクと進みました。しかも、脳にかかる負荷が少なくて済んだので、ChatGPTは素晴らしい飛び道具だなと思いました。
OpenAIさんには感謝してもしきれないです!

さあ、CrowdWorksで稼ぐぞ～！