以前の記事では、次は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} に保存されました。")
コメント