【前編】ChatGPT(OpenAI API)とfaster-Whisperを使ったYouTube文字起こしの精度改善: #足立康史 衆議院議員(@adachiyasushi)の #あだトーク (ゲスト: #一谷勇一郎 衆議院議員(@y_ichitani)・兵庫1区)回を事例に

こんにちは。
障害児福祉(児童発達支援)に携わる文系アラサー社会人です。

技術系記事は初投稿になります。
間違い等あればご指摘くださいませ。

LLMによる文字起こし(出力結果)はこちら

今回使用するデータ

#あだトーク 第24回 少子高齢化社会に必要な改革とは?【ゲスト】#日本維新の会 #一谷勇一郎 衆議院議員 #足立康史 #あだち康史 #あだチャン https://www.youtube.com/live/ik4_jzuD9jI?si=CSLcvzz4Ly9V3_Q4

1、この記事で実現したいこと

・YouTube動画の文字起こしを自動で行う
・API以外、完全無料で実現する
・出力したテキストは、できるだけそのままネットにアップできるレベルの品質にする
・Python(Google Colaboratory)を使用する

なお、個人的AI文字起こし最強ツールのVrewはお金がかかるので断念です。

(APIの方が高くつくし面倒なのですが、この人は何を言ってるんでしょう…しかもgpt-4を使ってますね…)

※本記事では「OpenAI API」並びにそのリクエスト・結果をまとめて「ChatGPT」と表記します。

完成版コード

!pip install -U yt-dlp
!pip install -U faster_whisper
!pip install srt
!pip install langchain

from yt_dlp import YoutubeDL
from moviepy.editor import *
import os

from datetime import timedelta
from srt import Subtitle
import srt

import subprocess
from faster_whisper import WhisperModel


url = 'https://www.youtube.com/watch?v=ik4_jzuD9jI'

ydl_opts = {
        'outtmpl' : '%(title)s.mp3',
        'format' : 'bestaudio/best'
    }

#メタデータ取得
with YoutubeDL(ydl_opts) as ydl:
    res = ydl.extract_info(url, download=False)
    ydl.download(url)

audio_file_name = res['title'] + ".mp3"

# Whisperのモデル指定
model_size = "large-v2"

# GPU, FP16で実行
model = WhisperModel(model_size, device="cuda", compute_type="float16")

# faster-Whisperの準備
# パラメータ https://qiita.com/reriiasu/items/5ad8e1a7dbc425de7bb0
segments, info = model.transcribe(audio_file_name, beam_size=2, best_of=2, temperature=0, language="ja")

# 文字起こし格納用変数
subs= ""
texts = ""

# 繰り返し処理
for segment in segments:
  # 全文文字起こし処理
  text = segment.text
  texts += text + "\n"
  # texts += f"{text[1:] if text[0] is ' ' else text}\n"

  # print("普通のはOK")

  # srtファイル作成処理
  startTime = str(0)+str(timedelta(seconds=int(segment.start)))+',000'
  endTime = str(0)+str(timedelta(seconds=int(segment.end)))+',000'
  segmentId = segment.id
  sub = f"{segmentId}\n{startTime} --> {endTime}\n{text[1:] if text[0] is ' ' else text}\n\n"
  subs += sub
  print(sub)

# srtファイル書き出し
srt_filename  = "【字幕】" + audio_file_name

with open("/content/drive/MyDrive/足立康史/文字起こし/" + srt_filename + ".srt", mode="w", encoding="utf-8") as f:
    f.write(subs)
    f.close

with open("/content/drive/MyDrive/足立康史/文字起こし/" + srt_filename + ".txt", mode="w", encoding="utf-8") as f:
    f.write(texts)
    f.c lose

# テキスト分割
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(        
    separator = "\n",
    chunk_size = 1000,
    chunk_overlap  = 200,
    length_function = len,
    is_separator_regex = False,
)

# テキストロード
from langchain.document_loaders import TextLoader

loader = TextLoader("/content/drive/MyDrive/足立康史/文字起こし/" + srt_filename + .txt")
documents = loader.load()
print(documents)

document = str(documents[0].page_content)
# print(document)
texts = text_splitter.split_text(document)
# print(texts[0])

# 修正処理
import os
import openai
openai.api_key = "<YOUR_OPENAI_API_KEY>" # ここにAPIキーを入れる

system_message = """

大阪府選出の衆議院議員「足立康史(あだちやすし)」のYouTube配信「あだトーク」の文字起こしです。
下記のブラッシュアップを行います。
step by stepで実行してください。

###制約###
・出力は本文のみ。一切の説明文を禁ずる
・文法構造の変換は禁止。原文を保つこと。
・文体は変えず、原文準拠
・話者名の記載は禁止
・後半に連れてあなたは精度が下がっているため、品質を担保し続けてください

###修正・適正化指示###
・適正語彙一覧に応じた人名の修正 適正語彙:(「足立康史」「一谷勇一郎」「日本維新の会」「一谷さん」「東徹(あずまとおる)」)
・句読点の挿入
・改行の適正化
・段落の挿入:多めに挿入せよ
・「あの」などのフィラーを削除または適正化
・結果を作成後、再度プロンプトに合ってるか再検討
"""

responseText = ""

for  text in texts:

    response = openai.ChatCompletion.create(
        # model="gpt-3.5-turbo",
        model="gpt-4",
        temperature= 0,
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": text}
        ],
    )

    # print(response.choices[0].message.content)

    responseText += response.choices[0].message.content + "\n"

print(responseText)

with open("/content/drive/MyDrive/足立康史/文字起こし/【修正字幕】#あだトーク 第24回 少子高齢化社会に必要な改革とは?【ゲスト】#日本維新の会  #一谷勇一郎 衆議院議員  #足立康史  #あだち康史 #あだチャン.txt", mode="w", encoding="utf-8") as f:
    f.write(responseText)
    f.close

2、下準備

faster-WhisperでYouTubeを文字起こし

・ゴール:字幕ファイルとテキストファイルの2つを作成
・精度:こちらの記事を参考に、無音区間・反復単語対応を調整

# ライブラリ準備
!pip install -U yt-dlp
!pip install -U faster_whisper
!pip install srt
from yt_dlp import YoutubeDL
from moviepy.editor import *
import os

from datetime import timedelta
from srt import Subtitle
import srt

import subprocess
from faster_whisper import WhisperModel

# ここにYouTube動画のURLを貼り付ける
url = 'https://www.youtube.com/watch?v=ik4_jzuD9jI'

ydl_opts = {
        'outtmpl' : '%(title)s.mp3',
        'format' : 'bestaudio/best'
    }

#メタデータ取得
with YoutubeDL(ydl_opts) as ydl:
    res = ydl.extract_info(url, download=False)
    ydl.download(url)

audio_file_name = res['title'] + ".mp3"

# Whisperのモデル指定
model_size = "large-v2"

# GPU, FP16で実行
model = WhisperModel(model_size, device="cuda", compute_type="float16")

# faster-Whisperの準備

segments, info = model.transcribe(audio_file_name, beam_size=2, best_of=2, temperature=0, language="ja")

# 文字起こし格納用変数
subs= ""
texts = ""

# 繰り返し処理
for segment in segments:
  # 全文文字起こし処理
  text = segment.text
  texts += text + "\n"
  # texts += f"{text[1:] if text[0] is ' ' else text}\n"

  # print("普通のはOK")

  # srtファイル作成処理
  startTime = str(0)+str(timedelta(seconds=int(segment.start)))+',000'
  endTime = str(0)+str(timedelta(seconds=int(segment.end)))+',000'
  segmentId = segment.id
  sub = f"{segmentId}\n{startTime} --> {endTime}\n{text[1:] if text[0] is ' ' else text}\n\n"
  subs += sub
  print(sub)

# srtファイル書き出し
srt_filename  = "【字幕】" + audio_file_name

with open("/content/drive/MyDrive/足立康史/文字起こし/" + srt_filename + ".srt", mode="w", encoding="utf-8") as f:
    f.write(subs)
    f.close

with open("/content/drive/MyDrive/足立康史/文字起こし/" + srt_filename + ".txt", mode="w", encoding="utf-8") as f:
    f.write(texts)
    f.close

ここまでで、Google Driveの「足立康史/文字起こし」フォルダ内に、YouTube動画タイトルがついたsrtファイルとtxtファイルが作成されました。

srtファイルの一部部分を見てみましょう。
誤字はやはり見られますが、YouTube公式の字幕よりは格段に高い精度ですね。

846
00:38:06,000 --> 00:38:10,000
ちょっと総理大臣やったらいいですよね

847
00:38:10,000 --> 00:38:13,000
非常に単に介護事業

848
00:38:13,000 --> 00:38:16,000
僕は介護分野の経営者でいらっしゃる

849
00:38:16,000 --> 00:38:17,000
というのは知ってたから

850
00:38:17,000 --> 00:38:21,000
介護はおかしいなと思ってたけど

851
00:38:21,000 --> 00:38:24,000
地域のこと若者の働き方のことまで

852
00:38:24,000 --> 00:38:27,000
目配りして経営者やから

853
00:38:27,000 --> 00:38:31,000
ご厳守期がやっぱりすごいね(筆者注:ご見識)

854
00:38:31,000 --> 00:38:32,000
いえいえ

855
00:38:32,000 --> 00:38:35,000
でも一番はやっぱり今の若い方に

856
00:38:35,000 --> 00:38:38,000
本当に夢を持って楽しく

857
00:38:38,000 --> 00:38:40,000
仕事をやっぱりしてほしい

3、テキスト修正

このままでも十分素晴らしいのですが、問題があります。
それは、「テキストファイルは、字幕の時間区分によって改行されている」「句読点・段落・改行がない」ということです。

いつ議論するかっていうと
確かに政府与党の中ではね
まあほぼ決着ついてるとかいうことはあるかもしれないけど
でもいよいよ来年2024年の春に向けて
今年国民の皆様に議論していくわけですよね
だからやっぱり党としてもそういう意味では
勝負は多少政府与党でピン止めが終わりつつあるとしてもね
論戦を挑むのは今年じゃないんだろう
そうですね
そこで考えを変えていただくというのは大事ですので
今年やったらいいよね
そうですね
ですからこの現金給付
そして養飼業務3位以上にプロフェッショナルを集めていくことが
国民の皆さんにとって豊かになることだということを
しっかりと考え抜かなあかんというのをもとで今考えてます

ここでは、テキストをChatGPTが受け取り可能な一定文字数に区切り、テキストを整形してもらいます。
分割数だけレスポンスが、文字数だけトークン消費が発生するので、時間と金額にはご注意ください。

テキスト分割

!pip install langchain
# テキスト分割
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(        
    separator = "\n",
    chunk_size = 1000,
    chunk_overlap  = 200,
    length_function = len,
    is_separator_regex = False,
)

# テキストロード
from langchain.document_loaders import TextLoader
loader = TextLoader("/content/drive/MyDrive/足立康史/文字起こし/【字幕】#あだトーク 第24回 少子高齢化社会に必要な改革とは?【ゲスト】#日本維新の会  #一谷勇一郎 衆議院議員  #足立康史 #あだち康史 #あだチャン.mp3.txt")
documents = loader.load()
print(documents)

# 分割テキストを作成
document = str(documents[0].page_content)
texts = text_splitter.split_text(document)

ChatGPTにリクエスト

!pip install openai

import os
import openai
openai.api_key = "api_key" # ここにAPIキーを入れる

当初のプロンプト

system_message = """

大阪府選出の衆議院議員「足立康史」のYouTube配信「あだトーク」の文字起こしです。
下記のブラッシュアップを行います。
・句読点の挿入
・改行の挿入
・段落の挿入
・「あの」などのフィラーを削除または適正化
・出力は本文のみ。一切の説明文を禁ずる
・文法構造の変換は禁止。原文を保つこと。

"""

メイン

# レスポンスごとの修正文字起こし格納変数
responseText = ""

for  text in texts:

    text = text.page_content
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        temperature= 0,
        messages=[
            {"role": "system", "content": system_message},
            {"role": "user", "content": text}
        ],
    )

    responseText += response.choices[0].message.content

print(responseText)

出力結果

はい、みなさん、こんばんは。
今日は一谷勇一郎さんにお越しいただきました。
ありがとうございます。 お呼びいただきまして、大変光栄です。どうぞよろしくお願いいたします。

先ほど申し上げたように、毎週木曜日に9時からこうやってやってまして、議員会館でTwitterスペースとYouTubeで同時配信ということでね。
さっきもちょっと申し上げたんですけど、いつも立場の違う人でね、含めてカンカンやることを狙いにこうやってアダトークとかやってるんですが、今日は同じ仲間ということであまりバチバチになりませんけど、ありがとうございます。
バチバチやっていただいたら、いやいやいややるもん何もない。
今日はだから一谷さんご専門もあるし、ちょうど今少子化対策が議論になっていて、もともと介護がプロですから、だからやっぱり少子高齢化社会という激動の状況の中で私たちは、今日テーマは少子高齢化社会に必要な改革とはということでテーマを設定させていただいています。

どんな話をするか、本当に打ち合わせなんもしてないから、そうですね打ち合わせゼロで、実は打ち合わせさせてくださいって連絡させていただいたんですけど、いやもうそのまま行こうって、あ、したっけ。

はい、メッセージいただいて、次本番で今日は、あのねこういう動画ってね、やっぱりあんまり打ち合わせしてもね、まあそうですね、あのしゃーないというか、面白くなくなります、まあそうですね、ちょっとこうびっくりするようなことをね。

はいはい、お互いに、なるほどなるほど、あの例えばあのね、あ、例えばさ、あの少子高齢化社会の話に入る前にさ、ちょっとこう一谷さんを皆さんに知っていただくという意味では、あ、あずまさんの秘書やってたんだよね。

4、改善点

・「あの」「その」などのフィラーが目立つ
・固有名詞(人名等)は修正可能みがある
・noteに貼り付けるには、もう少し改行・段落が多い方がベター
・話者がわかるとよい

修正プロンプト

system_message = """

大阪府選出の衆議院議員「足立康史(あだちやすし)」のYouTube配信「あだトーク」の文字起こしです。
下記のブラッシュアップを行います。
# step by stepで実行してください。

###修正指示###
・人名の修正(適正語彙;「足立康史」「一谷勇一郎」「東徹(あずまとおる・参議院議員)」)
・句読点の挿入
・改行の適正化
・段落の挿入:多めに挿入せよ
・「あの」などのフィラーを削除または適正化
・段落の冒頭、話者を(足立:)(一谷:)と表示
・結果を作成後、再度プロンプトに合ってるか再検討

###制約###
・出力は本文のみ。一切の説明文を禁ずる
・文法構造の変換は禁止。原文を保つこと。

"""

出力

(足立:)はい、みなさんこんばんは。今日は一谷勇一郎さんにお越しいただきました。ありがとうございます。お呼びいただきまして大変光栄です。どうぞよろしくお願いいたします。

(足立:)先ほど申し上げたように、毎週木曜日に9時からこうやってやってまして、議員会館でTwitterスペースとYouTubeで同時配信ということでね。さっきもちょっと申し上げたんですけど、いつも立場の違う人でね、含めてカンカンやることを狙いにこうやって「あだトーク」とかやってるんですが、今日は同じ仲間ということであまりバチバチになりませんけど、ありがとうございます。バチバチやっていただいたら、いやいやいややるもん何もない。今日はだから一谷さんご専門もあるし、ちょうど今少子化対策が議論になっていて、もともと介護がプロですから、だからやっぱり少子高齢化社会という激動の状況の中で私たちは、今日テーマは少子高齢化社会に必要な改革とはということでテーマを設定させていただいています。どんな話をするか、本当に打ち合わせなんもしてないから。

(一谷:)そうですね、打ち合わせゼロで、実は打ち合わせさせてくださいって連絡させていただいたんですけど。

(足立:)いやもうそのまま行こうって。

(一谷:)あ、したっけ。

(足立:)はい、メッセージいただいて、次本番で今日は。

(一谷:)あのね、こういう動画ってね、やっぱりあんまり打ち合わせしてもね、まあそうですね、あのしゃーないというか、面白くなくなります。

(足立:)まあそうですね、ちょっとこうびっくりするようなことをね。

(一谷:)はいはい、お互いに。

(足立:)なるほどなるほど。

(足立:)あの、例えばさ、あの少子高齢化社会の話に入る前にさ、ちょっとこう一谷さんを皆さんに知っていただくという意味では、あ、あずまさんの秘書やってたんだよね。

(一谷:)そうですね。

(足立:)あの、あんまりこれ触れない方がいい。

(一谷:)いやいや大丈夫大丈夫。私はあの本当に20年間ずっと、あの柔道制服師っていう資格を取って、医療や介護の世界にいたんですけども。あの2018年のまさにあの今議論されている、この社会保障費、医療や介護の6年に一度の改定があったんですけど、それが非常にまあ骨抜き改定になってしまって、自分の事業所としては助かるけども、え、これでええのかと。

(足立:)そうです、これでいいのかっていうのは、すごく自分の中で悶々としまして、これは現場の声をやっぱり届けなあかんと、その相手は厚生労働だと思って。

話者分割は非常に不満が残りますが、段落挿入はまっとうですね。
今回は話者分割をあきらめ、さらにmodelをgpt-4に変更して実行してみます。出力結果がこちらです。

はい、みなさん、こんばんは。今日は一谷勇一郎さんにお越しいただきました。ありがとうございます。

一谷さん:お呼びいただきまして、大変光栄です。どうぞよろしくお願いいたします。

足立康史:先ほど申し上げたように、毎週木曜日に9時からこうやってやってまして、議員会館でTwitterスペースとYouTubeで同時配信ということでね。さっきもちょっと申し上げたんですけど、いつも立場の違う人を含めて、カンカンやることを狙いにこうやって「あだトーク」をやってるんですが、今日は同じ仲間ということで、あまりバチバチになりませんけど。

一谷さん:ありがとうございます。バチバチやっていただいたら。

足立康史:いやいや、やるもん何もない。今日はだから一谷さん、ご専門もあるし、ちょうど今、少子化対策が議論になっていて、もともと介護がプロですから。だからやっぱり少子高齢化社会という激動の状況の中で私たちは、今日のテーマは「少子高齢化社会に必要な改革とは」ということでテーマを設定させていただいています。

どんな話をするか、本当に打ち合わせなんもしてないから。

一谷さん:そうですね、打ち合わせゼロで。実は打ち合わせさせてくださいって連絡させていただいたんですけど。

足立康史:いやもう、そのまま行こうって。

一谷さん:あ、したっけ?

足立康史:はい、メッセージいただいて。次本番で今日は、こういう動画って、やっぱりあんまり打ち合わせしても、面白くなくなります。

一谷さん:まあそうですね。

足立康史:ちょっとこう、びっくりするようなことを。

一谷さん:はいはい。

足立康史:お互いに。あの、例えば、少子高齢化社会の話に入る前に、ちょっとこう、一谷さんを皆さんに知っていただくという意味では、東徹さんの秘書やってたんだよね。

一谷さん:そうですね。

足立康史:あ、あんまりこれ触れない方がいい?

一谷さん:いやいや、大丈夫大丈夫。私は本当に20年間ずっと、柔道制服師という資格を取って、医療や介護の世界にいたんですけども。2018年の、まさに今議論されているこの社会保障費、医療や介護の6年に一度の改定があったんですけど、それが非常に、まあ骨抜き改定になってしまって。自分の事業所としては助かるけども、これでいいのかと。

足立康史:そうです、これでいいのかっていうのは、すごく自分の中で悶々としまして。これは現場の声をやっぱり届けなあかんと、その相手は厚生労働だと思って。私は医療や介護の世界にいました。2018年に、現在議論されている社会保障費、医療や介護の6年に一度の改定がありました。しかし、それが非常に骨抜きの改定になってしまい、自分の事業所としては助かる一方で、「これで良いのか」と疑問を感じました。この疑問が自分の中で悶々とし、現場の声を届けなければならないと感じました。その相手は厚生労働省だと思い、東徹先生のところに行きました。

東さんのお弟子さんが足立さんになってしまいましたね。
さらに修正すると、お二人がとても標準語ユーザーになってしまいました。

system_message = """

大阪府選出の衆議院議員「足立康史(あだちやすし)」のYouTube配信「あだトーク」の文字起こしです。
下記のブラッシュアップを行います。
step by stepで実行してください。

###修正指示###
・市谷さんではなく「一谷勇一郎」さんです
・「市谷」を「一谷」に置換せよ
・人名の修正(適正語彙;「足立康史」「一谷勇一郎」「一谷さん」「東徹(あずまとおる)」)
・句読点の挿入:文末では必ず改行せよ
・改行の適正化
・段落の挿入:多めに挿入せよ
・「あの」などのフィラーを削除または適正化
・結果を作成後、再度プロンプトに合ってるか再検討
・冒頭に話者名は付けない

###制約###
・出力は本文のみ。一切の説明文を禁ずる
・文法構造の変換は禁止。原文を保つこと。
・後半に連れてあなたは精度が下がっているため、品質を担保し続けてください

"""

僕にチャンスはないと思ったんですよ。私は1975年生まれで、就職氷河期と言われた時代に育ちました。同年代の活気がないという状況の中で、何かチャレンジする姿を僕自身も見せたいという思いがありました。

そこで神戸に行くことを決意しました。 神戸に行ってみると、一谷という名前が珍しいので、65歳以上の方々から「一谷さんのお孫さん?」と言われることが多かったんです。それで、何だろうと思って母親に電話したんです。すると、「あんたのおじいさんの兄弟いとこは副知事をやっていて、知事選にまで出ていたんだよ。それは40年前のことだけど」と教えてもらいました。

私が4歳の頃のことだったので、確かに覚えていました。 それで、その一族が阪神タイガースの応援団長まで務めていたと知り、私も阪神ファンになりました。私自身は、本当に先祖に導かれて神戸に行かせてもらったと感じています。

そういう経緯を持つ一谷さんが、介護事業も行っているということで、今日は少子高齢化社会に必要な改革について話していただきたいと思います。一谷さんが一番皆様に聞いてほしいと思うポイントはどこでしょうか。

まず、介護費用がどんどん上がっていることを指摘したいと思います。10兆円を超えていくという話は、この間の成長の勉強会で鈴木渡さんが話していました。ただ、ここは赤字ではないので、財源的にはまだ何とかなると思います。しかし、問題は働き手が本当にいないことです。

そのため、私は2018年の改革の時に、養介護1・2を移動させるという提案をしました。介護は7段階になっていて、養支援1・2は今総合事業という形で行われています。これは予算の上限があり、各自治体が予算の中でやらなければならないものです。そこに養介護1・2を移動させるという議論があったのです。 しかし、この議論は現在も続いていますが、先延ばしにされています。つまり、2027年以降になるということです。

これはこれで、書きことばとしてはきれいなんですがね。
しかも、リクエストごとに出力形式が変わるのは仕方ないとしましょう。

後編(出力結果)をお楽しみに。



この記事が気に入ったらサポートをしてみませんか?