Voskでmp4動画から文字起こし

日記・備忘録

以前の記事では、次はGoogle Cloud Speech-to-Text APIを試すなどど申してましたが、、、 タダにつられて、Voskを試してみました。

前回調べてた時、タダじゃ多分大したパフォーマンスにはならんだろうという先入観から、Voskは調査対象から外してたので、、、

一応、mp4から一気通貫で文字起こしをするコードを以下に載せるけど、、、正直イマイチ。 nottaやぎじろー君には遠く及ばない感じでした。

まぁ、せっかく作ったコードなので、一応コードは載せるけど、、、参考になれば幸いです。 が、Voskを勧める気はないんだなこれが。

Voskを用いてmp4から文字起こし

import os
import wget
import subprocess
import wave
import zipfile
from vosk import Model, KaldiRecognizer
import moviepy.editor as mp

# 1. モデルのダウンロード
def download_model(model_url, model_dir):
    if not os.path.exists(model_dir):
        print("Downloading model...")
        os.makedirs(model_dir)
        zip_path = os.path.join(model_dir, "model.zip")
        wget.download(model_url, out=zip_path)
        print("\nDownload complete. Unzipping...")
        
        # ZIPファイルを解凍
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall(model_dir)
        
        os.remove(zip_path)  # zipファイルを削除
        print("Model is ready to use.")
    else:
        print("Model already exists. Skipping download.")

# 2. 動画ファイルから音声を抽出する
def extract_audio_from_video(video_file, audio_file):
    video = mp.VideoFileClip(video_file)
    video.audio.write_audiofile(audio_file)

# 3. 音声ファイルをWAV形式に変換する(VoskはWAV形式を必要とする)
def convert_audio_to_wav(audio_file, wav_file):
    command = f"ffmpeg -i {audio_file} -ac 1 -ar 16000 {wav_file}"
    subprocess.call(command, shell=True)

# 4. Voskを使って文字起こしを行う
def transcribe_audio(wav_file, model_path, output_text_file):
    model = Model(model_path)
    wf = wave.open(wav_file, "rb")
    rec = KaldiRecognizer(model, wf.getframerate())

    with open(output_text_file, 'w', encoding='utf-8') as f:
        while True:
            data = wf.readframes(400000)
            if len(data) == 0:
                break
            if rec.AcceptWaveform(data):
                result = rec.Result()
                f.write(result + '\n')
        f.write(rec.FinalResult() + '\n')

    wf.close()

# 5. メインの処理
def main(video_file, model_dir, model_url, output_text_file):
    model_path = os.path.join(model_dir, "vosk-model-ja-0.22")  # 日本語の大きなモデルのパス
    download_model(model_url, model_dir)
    
    audio_file = "temp_audio.wav"
    wav_file = "temp_audio_16k.wav"
    
    extract_audio_from_video(video_file, audio_file)
    convert_audio_to_wav(audio_file, wav_file)
    transcribe_audio(wav_file, model_path, output_text_file)
    
    os.remove(audio_file)
    os.remove(wav_file)

# 使用例
video_file = "test.mp4"
model_dir = r"C:\vosk-model"  # モデルを保存するディレクトリ
model_url = "https://alphacephei.com/vosk/models/vosk-model-ja-0.22.zip"
output_text_file = "transcription.txt"

main(video_file, model_dir, model_url, output_text_file)

print(f"文字起こしが完了しました。結果は {output_text_file} に保存されました。")

コメント

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