[Python] Youtube動画を文字起こしするプログラム

Python
スポンサーリンク

こんにちはーー

PythonでYoutube動画を文字起こしするコードを書いたので記事にします。
動画編集に役立つかも!?

誰かの役に立てば幸いです。

概要は動画にもしています。

スポンサーリンク

概要

適当に出てきた↓の天気予測のYouTube動画の文字起こしを行います

コードの概要

作成したスクリプトの一覧

作成したスクリプトの詳細

ファイル名実行している内容
Main.py共通の変数定義、作成した関数の実行
dw_mp3.pyYoutubeから音声ファイル(mp3)をダウンロード
Conv.pyダウンロードしたmp3をwavに変換
c_wav.py容量の重いファイルは文字起こしできないためwavを分割
w_csv.pywavそれぞれに文字起こしを実行

コード詳細

main.py

import dw_mp3
import conv
import c_wav
import w_csv

name_mp3='test_voice.mp3'
name_wav="test.wav"
name_csv="test.csv"

url = input('Enter URL:')
dw_mp3.dw_mp3(url,name_mp3)
conv.conv(name_mp3,name_wav)
c_wav.c_wav(name_wav)
w_csv.w_csv(name_csv)

print("全ての処理が完了しました")

dw_mp3.py

import youtube_dl
import os
from pathlib import Path

def dw_mp3(url,name_mp3):
    # 初期設定
    ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s%(ext)s',
                                        'postprocessors': [{
                                            'key': 'FFmpegExtractAudio',
                                            'preferredcodec': 'mp3',
                                            'preferredquality': '192',
                                        }]
                                        })

    # 動画情報をダウンロードする
    with ydl:
        result = ydl.extract_info(
            url,
            download=True 
        )

    filename_before1 = url[32:] + 'mp4' + '.mp3' # ファイル名にwebmが付くのでその対応
    filename_after1 = name_mp3
    current_dir = Path(os.getcwd())

    os.rename(current_dir/filename_before1, current_dir/filename_after1) 

    print('音声ファイルのダウンロードが完了しました')

conv.py

import pydub

def conv(name_mp3,name_wav):
    base_file=pydub.AudioSegment.from_mp3(name_mp3)
    base_file.export(name_wav,format="wav")

c_wav.py

import wave
import struct
import math
import os
from scipy import fromstring, int16

def c_wav(name_wav):
    #A列~ZZ列までの場合
    def toAlpha2(num):
        i = int((num-1)/26)
        j = int(num-(i*26))
        Alpha = ''
        for z in i,j:
            if z != 0:
                Alpha += chr(z+64)
        return Alpha

    #読み込むファイル名
    f_name = name_wav

    #切り取り時間[sec]
    cut_time = 10

    # 保存するフォルダの作成
    file = os.path.exists("output")
    print(file)

    if file == False:
        os.mkdir("output")

    def wav_cut(name_wav,time): 

        # ファイルを読み出し
        wavf = name_wav
        wr = wave.open(wavf, 'r')

        # waveファイルが持つ性質を取得
        ch = wr.getnchannels()
        width = wr.getsampwidth()
        fr = wr.getframerate()
        fn = wr.getnframes()
        total_time = 1.0 * fn / fr
        integer = math.floor(total_time) # 小数点以下切り捨て
        t = int(time)  # 秒数[sec]
        frames = int(ch * fr * t)
        num_cut = int(integer//t)

        # 確認用
        print("Channel: ", ch)
        print("Sample width: ", width)
        print("Frame Rate: ", fr)
        print("Frame num: ", fn)
        print("Params: ", wr.getparams())
        print("Total time: ", total_time)
        print("Total time(integer)",integer)
        print("Time: ", t) 
        print("Frames: ", frames) 
        print("Number of cut: ",num_cut)

        # waveの実データを取得し、数値化
        data = wr.readframes(wr.getnframes())
        wr.close()
        X = fromstring(data, dtype=int16)
        print(X)

        for i in range(num_cut):
            print(i)
            # 出力データを生成
            outf = 'output/' + str(toAlpha2(i+1)) + '.wav' 
            start_cut = i*frames
            end_cut = i*frames + frames
            print(start_cut)
            print(end_cut)
            Y = X[start_cut:end_cut]
            outd = struct.pack("h" * len(Y), *Y)

            # 書き出し
            ww = wave.open(outf, 'w')
            ww.setnchannels(ch)
            ww.setsampwidth(width)
            ww.setframerate(fr)
            ww.writeframes(outd)
            ww.close()

    wav_cut(f_name,cut_time)

w_csv.py

import csv
import os
import speech_recognition as sr
import csv

def w_csv(name_csv):
    count=0

    with open(name_csv,'w') as f:
        writer = csv.writer(f)

    for fd_path, sb_folder, sb_file in os.walk('./output/'):
        for fil in sb_file:      
            count= count+1
            file_name=fd_path +fil
            r = sr.Recognizer()
            with sr.AudioFile(file_name) as source:
                audio = r.record(source)
                text = r.recognize_google(audio, language='ja-JP')  # 英語の場合はen-US
            print(count,fil," 文字起こし完了")
            with open(name_csv, 'a', newline='',encoding="shift_jis") as csvfile:
                write = csv.writer(csvfile, delimiter=' ')
                write.writerow()

実行結果

↓が実行結果です。
まあまあ変換できていますが、所々間違えていますね・・

明日の洗濯 天気予報です 明日か パンスト というところも多くなりそうです 明日はお天気の分布から確認していきましょう 北日本は5
雨が降っていても だんだんと天気は回復していきます 漢方や中部近畿 中国地方は晴れて日差しが届くよ それ以降で日からね
九州や 四国 だんだんと雨が降り出します 手を待って雷を伴うこともありそうです それでは続いて
電気室確認していきましょう それ取り方天気は回復していくんですが 5000円ほど 雨に要注意 仙台周辺は午後に
理由があり また 関東から中国地方に関しては晴れて 暑さ ちゃんとですただ ゆっくりと雲が増えていくため近畿周辺 など
良さそうでさらに 四国や 九州 こちらは雨が降り 明日の洗濯物の外干し は 無理そうです 沖縄では にわか雨の可能
春雨 お気をつけください また 洗濯 天気予報については 何にもアプリからもご確認いただけます ご覧のように 夜間や 昼間
今日家の洗濯情報が見られますので是非チェックしてみて下さい 以上洗濯情報でした

以上です!!

コメント

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