transcribe_qwen_asr_api.py ドキュメント
概要
ローカルの Qwen3-ASR vLLM サーバーを用いて、音声・動画ファイル( WAV / MP3 / MP4 )の文字起こしを行うスクリプトです。長いメディアファイルを ffmpeg を使って一定時間ごとのチャンク(WAVファイル)に分割し、OpenAI互換の音声認識APIエンドポイントに送信します。進捗を逐次保存するため、途中でのエラーや中断から再開する機能を備えています。本プログラムはユーティリティ・データ処理プログラムであるため、複雑な数学的理論に基づく計算は行いません。
依存関係
非標準ライブラリ: コードからは確認できません(Python標準ライブラリのみを使用しています)。
外部システム依存: コマンドラインツールとして
ffmpegおよびffprobeがシステムのPATHに存在し、実行可能である必要があります。
入出力仕様
入力ファイル
WAV,MP3,MP4などの音声または動画ファイル。
出力ファイル
文字起こし結果テキスト(
.txt): マージされた最終的なテキストファイル。デフォルトでは入力ファイルの拡張子を.qwen.txtに変更した名前で保存されます。セグメント情報 JSON(
.segments.json): 各チャンクの区間情報、テキスト、APIからの応答内容を含むファイル。チェックポイント JSON(
.partial.json): 実行中の状態を逐次保存するファイル。完了時またはエラー発生時に作成され、再開処理に使用されます。チャンクディレクトリ(
.chunks):--keep-wavオプションを指定した場合、分割された一時的な音声チャンクファイル(.wav)が保存されるディレクトリ。
オプション
input(位置引数): 入力ファイルのパス。--api-base: API のベースURLを指定します(既定: http://192.168.27.18:8001/v1 )。--model: 使用するASRモデル名を指定します(既定:Qwen/Qwen3-ASR-1.7B)。--output: 出力テキストファイルのパスを指定します。省略時は入力名に基づく.qwen.txtファイルが使用されます。--chunk-seconds: 1チャンクあたりの音声長を秒単位で指定します(既定:240)。--overlap-seconds: 隣接するチャンク間のオーバーラップ(重なり)時間を秒単位で指定します(既定:10)。--timeout: 各APIリクエストのタイムアウト時間を秒単位で指定します(既定:1800)。--resume: 処理が中断された場合に、残っている.partial.jsonファイルを読み込み、未完了のチャンクから文字起こしを再開します。--keep-wav: APIに送信するために分割した一時的なWAVファイルを削除せず、出力先と同じ階層の.chunksディレクトリに保持します。
動作原理
ffprobeを用いて入力ファイルの総再生時間(秒)を取得します。総再生時間を基に、
--chunk-secondsと--overlap-secondsの設定に従って音声を分割する開始時刻のリストを計算します。ffmpegを使用して、対象区間をサンプリングレート16000Hz、モノラル、16-bit PCM の WAV形式で抽出し、一時ファイルとして保存します。抽出したWAVファイルを、
urllib.requestを用いて指定されたAPIエンドポイント(/audio/transcriptions)にmultipart/form-data形式で送信し、文字起こし結果を取得します。チャンクごとの処理が完了するたびに、結果を
.partial.jsonに保存します。すべてのチャンクの処理が完了すると、前後のチャンクのテキストの末尾と先頭を比較し、オーバーラップによって生じた重複部分を除去しながら結合します。
結合された最終的なテキストを出力ファイルに書き出し、セグメント情報をJSONファイルに保存します。
実行例
# 基本的な実行(デフォルト設定を使用)
python transcribe_qwen_asr_api.py sample.mp4
# APIのURL、モデル名、出力先ファイル名を明示的に指定して実行
python transcribe_qwen_asr_api.py sample.wav --api-base http://127.0.0.1:8001/v1 --model my-asr-model --output result.txt
# 処理が中断した場合に、保存されたチェックポイントから再開する
python transcribe_qwen_asr_api.py sample.mp4 --resume
# チャンクの長さを120秒、重なりを5秒に変更し、分割されたWAVファイルを保存する
python transcribe_qwen_asr_api.py sample.mp3 --chunk-seconds 120 --overlap-seconds 5 --keep-wav