transcribe_simple プログラム仕様

音声ファイルからWhisperモデルで文字起こしを実行するスクリプト。

このスクリプトは、Windows環境では faster-whisper を、Linux/macOS環境では openai/whisper を使用して、 音声ファイルの文字起こしを行います。コマンドライン引数で入力ファイル、出力ファイル、モデル、言語などを指定できます。 長時間の音声に対する反復幻覚抑制機能も含まれています。

transcribe_simple.py 技術ドキュメント

ai.transcribe_simple.bool_from_int(value)

整数値をブール値に変換する。

整数 0 を False に、それ以外の整数を True に変換します。

パラメータ:

value -- int: 変換する整数値。

戻り値:

bool: 変換されたブール値。

ai.transcribe_simple.check_gpu()

使用中のWhisper実装に応じてGPUの利用可能性を確認し、情報を表示する。

USE_FASTER が True の場合 (faster-whisperを使用)、CTranslate2を介してCUDAデバイスをチェックする。 False の場合 (openai/whisperを使用)、safe_import_torch を利用してPyTorchのCUDA GPUをチェックする。

ai.transcribe_simple.check_gpu_torch(torch_mod)

PyTorchがCUDA GPUを利用可能かを確認し、情報を表示する。

引数で渡されたtorchモジュールがCUDAを利用できる場合、デバイス名とCUDAバージョンを表示する。 利用できない場合は、その旨を表示する。

パラメータ:

torch_mod -- module or None: PyTorchモジュールまたはNone。

ai.transcribe_simple.detect_device()

使用するWhisper実装に応じてデバイスを自動判定する。

USE_FASTER が True の場合 (faster-whisperを使用)、CTranslate2を通じてCUDAの利用可能性を確認し、 優先的に cuda を返します。そうでなければ cpu を返します。 USE_FASTER が False の場合 (openai/whisperを使用)、PyTorchを通じてCUDAの利用可能性を確認し、 優先的に cuda を返します。そうでなければ cpu を返します。

戻り値:

str: 検出されたデバイス名 ("cuda", "cpu" のいずれか)。

ai.transcribe_simple.detect_device_torch()

PyTorchが使用するデバイスを自動判定する。

優先順位 CUDA -> DML -> CPU で利用可能なデバイスを判定し、そのデバイス名を返します。

戻り値:

str: 検出されたデバイス名 ("cuda", "dml", "cpu" のいずれか)。

ai.transcribe_simple.format_hms(sec)

秒数を HH:MM:SS.s 形式の文字列に変換する。

渡された秒数を時、分、秒に分解し、指定されたフォーマットで整形した文字列を返します。 None が渡された場合は ??:??:?? を返します。

パラメータ:

sec -- float or None: 変換する秒数。

戻り値:

str: フォーマットされた時間文字列。

ai.transcribe_simple.get_audio_duration(infile)

ffprobe コマンドを使用して音声ファイルの長さを取得する。

ffprobe を外部プロセスとして実行し、音声ファイルの長さを秒単位で解析して返します。 ffprobe の実行に失敗した場合は警告を表示し、None を返します。

パラメータ:

infile -- str: 入力音声ファイルのパス。

戻り値:

float or None: 音声の長さ(秒単位)または、取得できなかった場合はNone。

ai.transcribe_simple.looks_like_repetition_loop(text, max_token_repeat=12, compression_ratio_limit=3.2)

Whisperモデルによって生成された反復幻覚らしいセグメントを検出する。

入力テキストの長さが80文字未満の場合は検出しない。 normalize_tokens でトークン化した後、最も頻繁に出現するトークンの繰り返し回数とその割合をチェックする。 また、text_compression_ratio を用いてテキストの圧縮率が高すぎる場合も反復と見なす。 これらの条件に合致する場合に True とその理由を返します。

判定の狙い:
  • "6th, 6th, 6th, ..." のような単語反復

  • 同じ語句が異常に多い高圧縮テキスト

強すぎると正しい復唱も消すので、講義音声向けにやや控えめにしている。

パラメータ:
  • text -- str: 検出対象のテキストセグメント。

  • max_token_repeat -- int: 単語反復とみなす最小繰り返し回数。(default: 12)

  • compression_ratio_limit -- float: 圧縮率がこの値以上の場合に反復とみなすしきい値。(default: 3.2)

戻り値:

tuple[bool, str]: 反復幻覚らしい場合は (True, 理由), そうでない場合は (False, "")。

ai.transcribe_simple.main()

スクリプトのメインエントリポイント。コマンドライン引数を解析し、文字起こし処理を実行する。

argparse を使用してコマンドライン引数を定義・解析します。 入力ファイルパスに基づいて文字起こし処理をループ実行し、 check_gpu_torch と check_gpu でGPU情報を表示した後、transcribe_audio 関数を呼び出します。 処理結果は指定された出力ファイルに保存されます。

ai.transcribe_simple.normalize_tokens(text)

反復検出のためにテキストをゆるくトークン化する。

英数字の単語、およびひらがな・カタカナ・漢字の連続を単語として抽出し、小文字に変換してリストで返します。

パラメータ:

text -- str: トークン化する入力テキスト。

戻り値:

list[str]: 正規化されたトークンのリスト。

ai.transcribe_simple.parse_temperature(value)

temperatureパラメータの値を浮動小数点数または浮動小数点数のタプルに変換する。

カンマ区切りの文字列を解析し、単一の数値であれば float、複数の数値であれば tuple[float, ...] を返します。 空の文字列や不正な値が指定された場合は ValueError を発生させます。

パラメータ:

value -- Union[str, float]: temperatureとして指定された値。

戻り値:

Union[float, tuple[float, ...]]: 解析されたtemperatureの値。

例外:

ValueError -- temperatureが空の場合。

ai.transcribe_simple.safe_import_torch()

PyTorchライブラリを安全にインポートする。

PyTorchのインポートを試行し、失敗した場合はエラーメッセージとトレースバックを表示して None を返します。

戻り値:

module or None: PyTorchモジュール (torch) またはインポートに失敗した場合は None。

ai.transcribe_simple.terminate()

スクリプトを終了する。必要に応じてユーザーの入力待ちを行う。

グローバル変数 pause が 0 でない場合、ENTER キーが押されるまでプロンプトを表示し、 その後スクリプトを終了します。

ai.transcribe_simple.text_compression_ratio(text)

テキストの簡易的なgzip圧縮率を計算する。

入力テキストをUTF-8でエンコードし、gzipで圧縮します。 非圧縮バイト長を圧縮バイト長で割ることで圧縮率を算出します。 短いテキストや圧縮結果が空の場合は 0.0 を返します。

パラメータ:

text -- str: 圧縮率を計算するテキスト。

戻り値:

float: テキストの圧縮率。

ai.transcribe_simple.transcribe_audio(infile, outfile1, outfile2, args)

検出された環境に応じて適切なWhisper実装で音声ファイルを文字起こしする。

グローバル変数 USE_FASTER の値に基づいて、transcribe_audio_faster または transcribe_audio_whisper のいずれかを呼び出します。 コマンドライン引数を直接各関数に渡します。

パラメータ:
  • infile -- str: 入力音声ファイルのパス。

  • outfile1 -- str: 時間範囲付きの出力テキストファイルパス。

  • outfile2 -- str: 時間範囲なしの出力テキストファイルパス。

  • args -- argparse.Namespace: コマンドライン引数を格納したオブジェクト。

ai.transcribe_simple.transcribe_audio_faster(infile, outfile1, outfile2, model_name, lang, device_name='', beam_size=5, chunk_length=30, temperature='0,0.2,0.4,0.6', condition_on_previous_text=False, compression_ratio_threshold=2.4, log_prob_threshold=-1.0, no_speech_threshold=0.6, repetition_penalty=1.05, no_repeat_ngram_size=3, max_bad_segments=3)

faster-whisperライブラリを使用して音声ファイルを文字起こしする。

faster-whisperのモデルをロードし、指定されたパラメータで文字起こしを実行します。 セグメントごとに進捗を表示し、指定されたファイルに出力します。 長時間の音声処理において反復幻覚を抑制するための機能も含まれます。 デバイス、計算タイプは自動判別されます。

重要:
  • offset / duration は faster-whisper の transcribe() には渡さない。

  • 長時間音声では condition_on_previous_text=False をデフォルトにする。

パラメータ:
  • infile -- str: 入力音声ファイルのパス。

  • outfile1 -- str: 時間範囲付きの出力テキストファイルパス。

  • outfile2 -- str: 時間範囲なしの出力テキストファイルパス。

  • model_name -- str: Whisperモデル名 (例: "base", "small", "medium")。

  • lang -- str: 文字起こし言語 (例: "ja", "en")。空文字の場合は自動判定。

  • device_name -- str: 使用するデバイス名 ("cuda", "cpu", "dml")。空文字の場合は自動判別。(default: "")

  • beam_size -- int: ビームサーチのサイズ。(default: 5)

  • chunk_length -- int: 内部チャンクの長さ(秒)。(default: 30)

  • temperature -- Union[str, float, tuple[float, ...]]: temperatureパラメータ。文字列形式("0,0.2,0.4")または数値で指定。(default: "0,0.2,0.4,0.6")

  • condition_on_previous_text -- bool: 前の認識結果を次のチャンクの文脈として使用するかどうか。(default: False)

  • compression_ratio_threshold -- float: 反復テキスト検出用の圧縮率しきい値。(default: 2.4)

  • log_prob_threshold -- float: 低信頼デコード検出のしきい値。(default: -1.0)

  • no_speech_threshold -- float: 無音判定のしきい値。(default: 0.6)

  • repetition_penalty -- float: 反復抑制ペナルティ。(default: 1.05)

  • no_repeat_ngram_size -- int: n-gram反復抑制のサイズ。0で無効。(default: 3)

  • max_bad_segments -- int: 反復幻覚らしいセグメントが連続した場合に文字起こしを停止する回数。(default: 3)

ai.transcribe_simple.transcribe_audio_whisper(infile, outfile1, outfile2, model_name, lang, device_name='')

openai/whisperライブラリを使用して音声ファイルを文字起こしする。

openai/whisperモデルをロードし、指定されたパラメータで音声ファイルを一括で文字起こしします。 結果は指定された2つのファイルに出力されます。

パラメータ:
  • infile -- str: 入力音声ファイルのパス。

  • outfile1 -- str: 時間範囲付きの出力テキストファイルパス。

  • outfile2 -- str: 時間範囲なしの出力テキストファイルパス。

  • model_name -- str: Whisperモデル名 (例: "base", "small", "medium")。

  • lang -- str: 文字起こし言語 (例: "ja", "en")。空文字の場合は自動判定。

  • device_name -- str: 使用するデバイス名 ("cuda", "cpu")。空文字の場合は自動判別。(default: "")