前回は、pythonを使って動画の沈黙を自動的にカットするプログラムを作りました。
今回は、そこからさらに動画の音声から自動的にテロップを抽出するプログラムを作りました。
前回の記事「動画内の沈黙を自動でCUTするプログラムを書いてみた」はこちら↓
開発環境
OS:Windows10
Python 3.7.4
環境:Anaconda
エディタ:VScode
再現したいこと
1.動画のテロップを自動で抽出する。
2.テロップの出力形式はCSV。
pythonでは、動画内にテロップを合成することができますが、今回はテロップのデザインをphotoshopで作成したかったため、photoshopにデータセットができるCSV形式でテキストを書き出す仕組みにトライしました。
追って、CSVをphotoshopにインポートしてテロップを量産する方法を記事にしたいと思います。
プログラムの流れ
- 前回記事で書き出した「join_out.mp4」から音声データ(mp3、wav)を作成。
- 音声データをspeech_recognitionを使用して文字起こし。
- 2で起こした文字をtxtファイルに書き出し。
- 3のtxtファイルをpandasを使用してcsv化。
赤文字の箇所が今回importするライブラリです。
以下、参考にしたURLです。
- FFmpegを使用したmp3やwavファイルへの変更方法
※FFmpegのインストール方法については、前回記事を参照してください。
前回記事→こちらをクリック
参考URL↓
http://www.xucker.jpn.org/pc/ffmpeg_wav.html
https://qiita.com/fujisystem/items/0b3abb5cb1a5671c4d4c
libmp3lameエンコーダについて↓
http://fftest33.blog.fc2.com/blog-entry-39.html - 音声から文字に変換する方法
https://pythonbasics.org/transcribe-audio/ - textファイルからcsvへの変換方法
https://laboratory.kazuuu.net/convert-text-file-to-csv-using-python/
コード全体
注:前回記事の沈黙をカットする部分は省略しております。
音声抽出の部分のみ表示しております。
# 音声認識 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/#
使い方
- インストール
pip install black - 使用するとき
black [整形したいファイル名]
次の記事では、wavの分割方法について説明しております!併せてご覧くださいm(__)m