動画音声から自動的に文字を起こしてCSV化してみた【動画編集らくらくシリーズ②】

前回は、pythonを使って動画の沈黙を自動的にカットするプログラムを作りました。
今回は、そこからさらに動画の音声から自動的にテロップを抽出するプログラムを作りました。

前回の記事「動画内の沈黙を自動でCUTするプログラムを書いてみた」はこちら↓

スポンサーリンク

開発環境

OS:Windows10
Python 3.7.4
環境:Anaconda
エディタ:VScode

再現したいこと

1.動画のテロップを自動で抽出する。
2.テロップの出力形式はCSV。

pythonでは、動画内にテロップを合成することができますが、今回はテロップのデザインをphotoshopで作成したかったため、photoshopにデータセットができるCSV形式でテキストを書き出す仕組みにトライしました。

追って、CSVをphotoshopにインポートしてテロップを量産する方法を記事にしたいと思います。

プログラムの流れ

  1. 前回記事で書き出した「join_out.mp4」から音声データ(mp3、wav)を作成
  2. 音声データをspeech_recognitionを使用して文字起こし。
  3. 2で起こした文字をtxtファイルに書き出し。
  4. 3のtxtファイルをpandasを使用してcsv化。

赤文字の箇所が今回importするライブラリです。
以下、参考にしたURLです。

コード全体

注:前回記事の沈黙をカットする部分は省略しております。
音声抽出の部分のみ表示しております。

# 音声認識
import speech_recognition as sr
# csv化
import pandas as pd

# 文字起こし対象のファイル
text_video_path = "文字起こし対象のディレクトリ(絶対パス)/join_out.mp4"

# テキスト用音声データの出力先
audio_text_path = "テキスト用音声データの出力先(絶対パス)/audio_text.mp3"
audio_change_wav = "テキスト用音声データの出力先(絶対パス)/audio_text.wav"

# テキスト保存場所
text_date = "テキスト保存場所(絶対パス)/text.txt"
# csv保存場所
csv_date = "csv保存場所(絶対パス)/text.csv"

# mp4→mp3へ変換
def out_text(text_video_path, audio_text_path):
    out_audio = subprocess.run(
        [
            "ffmpeg",
            "-i",
            text_video_path,
            "-acodec",
            "libmp3lame",
            "-ab",
            "256k",
            audio_text_path,
        ]
    )
    print(out_audio)

# mp3からwavに変換
def audio_transcript(audio_change_wav):
    transcript = subprocess.run(
        [
            "ffmpeg",
            "-i",
            audio_text_path,
            "-vn",
            "-ac",
            "1",
            "-ar",
            "44100",
            "-acodec",
            "pcm_s16le",
            "-f",
            "wav",
            audio_change_wav,
        ]
    )
    print(transcript)


def audio_text_change(audio_change_wav, text_date, csv_date):
    # 文字起こし
    r = sr.Recognizer()
    with sr.AudioFile(audio_change_wav) as source:
        audio = r.record(source)
        text = r.recognize_google(audio, language="ja-JP").replace(" ", "\n")
        print(text)
    # textへの書き出し
    open_text = open(text_date, "x", encoding="utf_8")
    open_text.write(text)
    open_text.close()
    # txtをcsvに変換
    read_text = pd.read_csv(text_date)
    read_text.to_csv(csv_date, index=None)


out_text(text_video_path, audio_text_path)

# mp3が生成するまでにタイムラグがあるので、生成されるのを待つ処理
while os.path.isfile(audio_text_path):
    audio_transcript(audio_change_wav)
    print("change end")
    if os.path.isfile(audio_change_wav):
        print("break!!")
        break

audio_text_change(audio_change_wav, text_date, csv_date)

コードの説明

動画mp4ファイルから音声mp3・wavファイルへの変換

音声認識には、wavファイルが必要なため、最終的にwavにしております。
mp4から直接wavファイルにする方法も調べたのですが、なかなかみつからず、事例が多いmp4からmp3に変換し、mp3をwavに変換する方法で組みました。

ffmpegの引数については、こちらの記事がとても分かりやすく書かれておりますので、ご参照ください。(ffmpegの音声ファイル形式における引数)
http://www.xucker.jpn.org/pc/ffmpeg_wav.html

音声の文字変換

音声の文字変換では、SpeechRecognition3.8.1のライブラリを使用しております。
公式サイト:https://pypi.org/project/SpeechRecognition/

インストールは、ターミナル・power shell上で以下のコマンドを実行

pip install SpeechRecognition

日本語設定

音声が日本語のため、日本語の設定を加えます。
英語やその他言語を設定したい場合は、こちらの言語設定をご参考ください。
https://cloud.google.com/speech-to-text/docs/languages?hl=ja

text = r.recognize_google(audio, language="ja-JP")
空白の部分で改行を加える

デフォルトでは、文字がつらつら抽出されるだけなので、スペースが発生したら改行をするようにreplaceを加えました。
.replace(” “, “\n”)
※” ”(空白)を”\n”(改行コード)に置き換える指示です。

text = r.recognize_google(audio, language="ja-JP").replace(" ", "\n")
ecognize_googleは3分以内?!!!!

数秒程度の音声で試したときは、問題なかったのですが・・・・
8分20秒の音声で試すと「timeoutが返ってきてしまいました。

どうやら、1分を超えるような音声については、Google Speech-to-TextAPIを使用した方がよさそうです。音声文字起こしは、WatsonやAmazonその他色々あるそうですね。今回のライブラリは制限ありで無料ですが、Googleやその他APIは課金がありますので、ご注意ください。

参考までに、今回のライブラリで無料枠はどのくらいか測ってくださった方がいらっしゃいましたので、ご参照ください。
Pythonで文字起こし(音声認識)するために知ってくべきこと

結論、文字起こし対象の音声ファイルを分割するといった方法がよさそうです。
音声ファイルの分割は、次回記事にでも書こうと思います。

音声のテキスト起こしをtxtに書き出し

ecognize_googleで読み込んだ音声のテキストをtxtに書き出します。
ここで、デフォルトでは、txtがANSI形式になっているため、エンコーディングの設定をしないとcsv化する際にerrorで返ってきてしまいます。
これを回避するために、UTF-8を設定します。
encoding=”utf_8″

open_text = open(text_date, "x", encoding="utf_8")

txtをcsv化する

ここでは、データ分析で用いられることの多いpandasを使用しました。
pandasをimportしてcsvを書き出します。

import pandas as pd

(おまけ)コードの自動整形

前回記事のコードは、整形していなくて見難かったですよね・・・
つらつらと長くなってしまう(特にFFmpeg)コードを自動的に整形してくれる方法をご紹介します。

自動整形フォーマッター「black」

特徴としては、PEP8のコーディング規定に準じて整形します。
PEP8について:https://pep8-ja.readthedocs.io/ja/latest/#

使い方

  1. インストール
    pip install black
  2. 使用するとき
    black [整形したいファイル名]

次の記事では、wavの分割方法について説明しております!併せてご覧くださいm(__)m

タイトルとURLをコピーしました