【Groq】GroqAPIで低額・高速で音声ファイルを文字起こしする
アプリケーション

【Groq】GroqAPIで低額・高速で音声ファイルを文字起こしする

Groq APIのWhisper Turboを使って音声ファイルを効率的に文字起こしする方法とPythonスクリプトの作成手順

hakasaku

hakasaku

公開日: 2025年9月28日

【Groq】Whisperで音声ファイルを自動で文字起こしする方法

はじめに

音声ファイルやラジオ番組、講義の録音などを文字起こししたい場面は多いですが、手動で行うのは非常に時間がかかります。

そこで今回は、Groq APIWhisper Turboを使用して、音声ファイルを自動で文字起こしする方法をご紹介します。

無料枠も有るため、一度無料枠で試してから有料プランに移行する事をおすすめします。

開発者プランに移行すると、API利用毎に課金されるため、注意して使用してください。

支出リミット設定有るため、必ず予算を設定してください。

無料プランでは上限に達すると制限がかかり利用できなくなる為、安心して利用できます。

ローカル処理

whisperはローカルのGPUでも動かすことが出来ます。

  • クラウド処理(本記事): 高速だが従量課金(無料枠も有るが小さい)
  • ローカル処理: 無料だがマシンパワーが必要

【Whisper】ローカルで音声ファイルを文字起こしする方法もご参照ください。

Groq APIとWhisperTurboについて

Groq APIの特徴

  • 高速処理: TPUに最適化されたTurboモデルが通常モデルよりも安く高速で利用可能
  • 高精度: OpenAIのWhisperモデルをベースとした高い認識精度
  • コストパフォーマンス: 競合他社と比較して非常に安価
  • 日本語対応: 日本語の音声認識に対応

対応音声形式

  • MP3
  • WAV
  • FLAC
  • M4A
  • その他多数の音声形式

事前準備

必要なもの

  • Python 3.7以上
  • Groq APIキー
  • 文字起こししたい音声ファイル

APIキーの取得

  1. Groq公式サイトにアクセス
  2. アカウントを作成(GitHubアカウントでも可)
  3. APIキーを生成
  4. 生成されたキーをコピーして保存

右上のAPI Keysを選択し、Create API Keyをクリック。

適当な名前をつけてSubmit。

生成されたキーをコピーして.envに保存

必要なライブラリのインストール

Pythonとpipがインストールされている事を確認するためにバージョン確認を行う。

python --version
pip --version

バージョンが表示される事を確認できたら、依存関係をインストールする。

pip install groq python-dotenv

環境設定

.envファイルの作成

プロジェクトフォルダに.envファイルを作成し、APIキーを設定します:

GROQ_API_KEY=""

""内に発行したAPIキーを記述してください。

注意: このファイルやAPIキーが含まれているものは絶対に公開しないでください。第三者に使用された場合、自分に請求が届きます。

スクリプトの作成

次にPythonスクリプトを作成します。

以下のスクリプトをコピーして、設定項目の音声ファイルが入っているフォルダのパスを変更してください

基本バージョン

import os
import time
from groq import Groq
from dotenv import load_dotenv
 
# .envファイルから環境変数を読み込む
load_dotenv()
 
# --- 設定項目 ---
# 1. 音声ファイルが入っているフォルダのパス
AUDIO_DIR = r"C:\your\audio\folder"
 
# 2. 文字起こし結果を保存するフォルダのパス
TRANSCRIPT_DIR = os.path.join(AUDIO_DIR, "transcripts")
# ----------------
 
# Groqクライアントの初期化
try:
    client = Groq(api_key=os.environ.get("GROQ_API_KEY"))
    if not client.api_key:
        raise ValueError("APIキーが設定されていません。.envファイルを確認してください。")
except Exception as e:
    print(f"[致命的なエラー] Groqクライアントの初期化に失敗しました: {e}")
    exit()
 
# 出力用フォルダがなければ作成
os.makedirs(TRANSCRIPT_DIR, exist_ok=True)
 
def transcribe_audio_file(audio_path, output_path):
    """音声ファイルを文字起こしする関数"""
    filename = os.path.basename(audio_path)
    
    try:
        start_time = time.time()
        # ファイルをバイナリモードで開いてAPIに渡す
        with open(audio_path, "rb") as file:
            transcription = client.audio.transcriptions.create(
                file=(filename, file.read()),
                model="whisper-large-v3-turbo",
                response_format="verbose_json",
                language="ja"
            )
        
        # 結果をテキストファイルに書き込む
        with open(output_path, "w", encoding="utf-8") as f:
            f.write(f"# {filename} の文字起こし結果\n\n")
            for segment in transcription.segments:
                start = segment['start']
                end = segment['end']
                text = segment['text']
                start_str = time.strftime('%H:%M:%S', time.gmtime(start)) + f".{int((start % 1) * 1000):03d}"
                end_str = time.strftime('%H:%M:%S', time.gmtime(end)) + f".{int((end % 1) * 1000):03d}"
                f.write(f"[{start_str} -> {end_str}] {text.strip()}\n")
        
        end_time = time.time()
        print(f"-> 完了: {os.path.basename(output_path)} に保存しました。(処理時間: {end_time - start_time:.2f}秒)")
        return True
        
    except Exception as e:
        print(f"-> [エラー] {filename} の処理中にエラーが発生しました: {e}")
        return False
 
# メイン処理
if __name__ == "__main__":
    # 処理対象の音声ファイルリストを取得
    try:
        audio_files = sorted([f for f in os.listdir(AUDIO_DIR) if f.lower().endswith(('.mp3', '.wav', '.m4a', '.flac'))])
        total_files = len(audio_files)
        if total_files == 0:
            print(f"[情報] {AUDIO_DIR} に音声ファイルが見つかりませんでした。")
            exit()
        print(f"合計 {total_files} 個の音声ファイルを検出しました。処理を開始します。")
    except FileNotFoundError:
        print(f"[エラー] 音声ファイルフォルダが見つかりません: {AUDIO_DIR}")
        exit()
 
    # 各ファイルを処理
    success_count = 0
    for i, filename in enumerate(audio_files):
        audio_path = os.path.join(AUDIO_DIR, filename)
        transcript_filename = os.path.splitext(filename)[0] + ".txt"
        transcript_path = os.path.join(TRANSCRIPT_DIR, transcript_filename)
 
        print("-" * 50)
        print(f"[{i + 1}/{total_files}] ファイルを処理中: {filename}")
 
        # すでに文字起こし済みの場合はスキップ
        if os.path.exists(transcript_path):
            print("-> スキップ: このファイルは既に文字起こし済みです。")
            continue
 
        # ファイルサイズのチェック (Groqの推奨上限は100MB)
        file_size_mb = os.path.getsize(audio_path) / (1024 * 1024)
        if file_size_mb > 100:
            print(f"-> [警告] ファイルサイズが100MBを超えています ({file_size_mb:.2f} MB)。スキップします。")
            continue
 
        # 文字起こし実行
        if transcribe_audio_file(audio_path, transcript_path):
            success_count += 1
 
        # APIへの連続リクエストを避けるための短い待機
        time.sleep(1)
 
    print("-" * 50)
    print(f"\n全ての処理が完了しました。成功: {success_count}/{total_files}")

スクリプトの使い方

1. フォルダ構造の準備

your_project/
├── groq_transcribe.py
├── .env
└── audio_files/
    ├── file1.mp3
    ├── file2.wav
    └── transcripts/  (自動作成される)
        ├── file1.txt
        └── file2.txt

2. 設定の変更

スクリプト内のAUDIO_DIRを自分の音声ファイルフォルダのパスに変更:

AUDIO_DIR = r"C:\Users\YourName\Documents\audio_files"

音声ファイルの置き場所は自分が分かる場所であればどこでも大丈夫です。

3. スクリプトの実行

python groq_transcribe.py

スクリプトを実行すると、指定したフォルダ内の音声ファイルが順次処理され、transcriptsフォルダに文字起こし結果が保存されます。

出力形式の説明

生成されるテキストファイルは以下の形式になります:

# example.mp3 の文字起こし結果

[00:00:00.000 -> 00:00:05.240] こんにちは。今日はWhisperの使い方について説明します。
[00:00:05.240 -> 00:00:12.840] まず最初に、Groq APIのアカウントを作成する必要があります。
[00:00:12.840 -> 00:00:18.600] 公式サイトにアクセスして、無料でアカウントを作成できます。

高度な機能

言語の自動検出

言語を指定せずに自動検出させることも可能:

transcription = client.audio.transcriptions.create(
    file=(filename, file.read()),
    model="whisper-large-v3-turbo",
    response_format="verbose_json"
    # language="ja" を削除
)

出力形式の変更

テキストのみが欲しい場合:

transcription = client.audio.transcriptions.create(
    file=(filename, file.read()),
    model="whisper-large-v3-turbo",
    response_format="text",
    language="ja"
)
 
# シンプルなテキスト出力
with open(output_path, "w", encoding="utf-8") as f:
    f.write(transcription)

字幕形式(SRT)での出力

transcription = client.audio.transcriptions.create(
    file=(filename, file.read()),
    model="whisper-large-v3-turbo",
    response_format="srt",
    language="ja"
)

トラブルシューティング

よくあるエラーと対処法

1. APIキーエラー

[致命的なエラー] Groqクライアントの初期化に失敗しました
  • .envファイルのAPIキーが正しいか確認
  • ファイル名が.env(ドット付き)になっているか確認

2. ファイルサイズエラー

ファイルサイズが100MBを超えています
  • 音声ファイルを短く分割する
  • 音質を下げて容量を減らす
  • FFmpegなどを使用してファイルサイズを圧縮

3. 文字化け

  • 出力ファイルのエンコーディングがutf-8になっているか確認
  • Windowsのメモ帳ではなくVS CodeやNotePad++で開く

ファイルサイズを圧縮する方法

FFmpegを使用してファイルサイズを削減:

# 音質を下げて容量を削減
ffmpeg -i input.mp3 -b:a 64k output.mp3
 
# モノラルに変換してサイズを半分に
ffmpeg -i input.mp3 -ac 1 output.mp3

パフォーマンス向上のコツ

1. 並列処理

複数ファイルを同時に処理する場合は、適度な並列処理で高速化できます:

import concurrent.futures
import threading
 
# 同時実行数を制限(APIレート制限を考慮)
MAX_WORKERS = 3
 
def process_files_parallel(audio_files):
    with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        futures = []
        for filename in audio_files:
            # 処理をスレッドプールに投入
            future = executor.submit(transcribe_audio_file, filename)
            futures.append(future)
        
        # 完了を待機
        for future in concurrent.futures.as_completed(futures):
            result = future.result()

2. ファイル形式の最適化

  • WAV形式よりもMP3形式の方が転送が速い
  • 必要以上に高音質にしない(16kHzでも十分な場合が多い)

料金について

Groq APIは非常に安価で、2025年現在:

  • Whisper Turbo: $0.04/hour(音声ファイル1時間あたり約6円)
  • 無料プランでも一定の使用量まで無料

詳細な料金は公式サイトで確認してください。

まとめ

Groq APIのWhisper Turboを使用することで、高速かつ高精度な音声文字起こしが可能になります。

メリット

  • 高速: 従来のWhisperの10倍以上の速度
  • 高精度: 日本語の認識精度が非常に高い
  • 低コスト: 競合他社と比較して非常に安価
  • 使いやすい: シンプルなAPIで簡単に実装

用途

  • ラジオ番組の文字起こし
  • 会議録音の議事録作成
  • 講義・セミナーの記録
  • インタビュー記事の作成
  • 動画コンテンツの字幕作成

参考リンク