見出し画像

pythonを使って動画の文字起こしをしてみよう

これまではSNSなどの自動化についてnoteにまとめてきましたが、今回はpythonを使って動画の文字起こしをしてみよう、という内容です。

基本的にコピペでできるはずですが、環境などによってはエラーになるかもしれないので、その場合にはtwitterのDMから連絡をもらえるとアドバイスできます🙌

ちなみに僕は文字起こしを使って収益5桁に突破しました

ブログで解説しているので、noteでは詳細に解説はしません
ご興味ある方はブログの方もご覧ください

早速コードの紹介

import os
import glob
import shutil
import subprocess
import speech_recognition as sr
# 音声ファイルの分割
import wave
import math
import struct
from scipy import fromstring, int16
from wordcloud import WordCloud


# mp4から音声ファイルへの変換
def mp4_to_wav(mp4f):
  wavf = mp4f.replace('.mp4', '.wav')
  subprocess.run(['ffmpeg', '-i', mp4f, wavf], 
                  encoding='utf-8', stdout=subprocess.PIPE)
  return wavf

# 音声ファイルの分割(デフォルト30秒)
def cut_wav(wavf,time=30):
  # timeの単位は[sec]
  # ファイルを読み出し
  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)

  # waveの実データを取得し、数値化
  data = wr.readframes(wr.getnframes())
  wr.close()
  X = fromstring(data, dtype=int16)
  
  # wavファイルを削除
  #os.remove(wavf)
  
  outf_list = []
  for i in range(num_cut):
      # 出力データを生成
      output_dir = 'output/cut_wav/'
      os.makedirs(output_dir,exist_ok=True)
      outf = output_dir + str(i).zfill(3) + '.wav'
      start_cut = i*frames
      end_cut = i*frames + frames
      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()
      
      # リストに追加
      outf_list.append(outf)
  
  return outf_list

# 複数ファイルの音声のテキスト変換
def cut_wavs_str(outf_list):
  output_text = ''
  # 複数処理
  print('音声のテキスト変換')
  for fwav in outf_list:
      print(fwav)
      r = sr.Recognizer()
      
      # 音声->テキスト
      with sr.AudioFile(fwav) as source:
          audio = r.record(source)
          try:
              text = r.recognize_google(audio, language='ja-JP')
              print(text)
          except sr.RequestError:
              text = "error wav No." + str(fwav) + "API unavailable"
              print(text)
          except sr.UnknownValueError:
              text = "error wav No." + str(fwav) + "Unable to recognize speech"
      # 各ファイルの出力結果の結合
          output_text = output_text + text + '\n'
      # wavファイルを削除
      #os.remove(fwav)
      
  return output_text


# mp4からwavへの変換から音声のテキスト変換まで
def mp4_to_text(mp4f):
  # 出力ディレクトリ
  # *****には出力先のディレクトリパスをコピペ
  shutil.rmtree('*****')
  os.makedirs('*****', exist_ok=True)
  
  # 音声ファイルへの変換
  wav_file = mp4_to_wav(mp4f)
  
  # 音声ファイルの分割(デフォルト30秒)
  cut_wavs = cut_wav(wav_file)
  
  # 複数ファイルの音声のテキスト変換
  out_text = cut_wavs_str(cut_wavs)
  
  # テキストファイルへの入力
  mp4f_name = os.path.basename(mp4f)
  txt_file = 'output/' + mp4f_name.replace('.mp4', '.txt')
  print('テキスト出力')
  print(txt_file)
  f = open(txt_file, 'w')
  f.write(out_text)
  f.close()
  
  text_file=open(txt_file )
  bindata=text_file.read()
  txt=bindata

  wordcloud = WordCloud(background_color="white",
  font_path='/System/Library/Fonts/ヒラギノ明朝 ProN.ttc',
  width=800,height=600).generate(txt)
# 形態素解析も同時に実行し,画像を保存
  wordcloud.to_file("./wordcloud_sample.png")

# 変換の実行
# 文字起こしを行う動画ファイル名
mp4_to_text('test.mp4')

文字起こしや形態素解析などをうまく組み合わせれば、収益化を図ることも可能です🙆‍♂️

長い動画を一定の時間で区切って文字起こしをしているため、一部抜けが出てきてしまいますが、そこはマニュアルで対応します

色々チャレンジしてみてください🙌

その他の人気note

上のnoteではtwitterの懸賞に自動で応募できるようにプログラムを書いています🙋‍♂️
実際に当選した方もいますので、ぜひチャレンジしてみてください🙆‍♂️

こちらのnoteではtwitterを使って楽天アフィリエイトを自動化しています
こちらも購入したから、収益化できたと報告があったので、実践する価値ありです🙆‍♂️


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