音声文字変換

Gemini API は、Gemini 3.5 Transcribe モデル(gemini-3.5-transcribe)を使用して、音声ファイル内の音声をテキストに変換します。Gemini の音声理解機能に基づいて、自動言語識別、話者ダイアリゼーション、単語レベルのタイムスタンプ、カスタム語彙ヒントを使用して、正確な文字起こしを提供します。また、言い淀みの削除やスマートな書式設定などの機能を備えたスマート文字起こしモードも用意されています。

音声ファイルを文字起こしするには、音声をアップロードして gemini-3.5-transcribe に渡します。

Python

from google import genai

client = genai.Client()

audio_file = client.files.upload(file="path/to/sample.mp3")

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
)

print(interaction.output_text)

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const audioFile = await client.files.upload({
  file: "path/to/sample.mp3",
  config: { mime_type: "audio/mp3" },
});

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
});

console.log(interaction.output_text);

REST

# First upload the file via the Files API, then pass its URI:
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ]
  }'

概要

Gemini 3.5 Transcribe は、音声文字変換タスク用に最適化されています。さまざまなアクセント、背景雑音、多言語の会話に対応しています。

主な機能は次のとおりです。

  • 自動音声認識(ASR): 85 以上の言語 / 地域で言語を自動的に検出します。手動で構成しなくても、文内と文間のコードスイッチングを処理します。
  • カスタム語彙: 最大 1,000 個のフレーズを渡すことで、分野固有の用語、頭字語、固有名詞の認識を優先します。
  • 話者ダイアリゼーション: 複数の話者を区別し、発話セグメントを個別のラベルに関連付けます。
  • 単語レベルのタイムスタンプ: 認識された各単語の正確な開始時間と終了時間のオフセットを生成します。
  • スマート文字起こし: 語句の言い直し、つなぎ言葉、繰り返しを削除し、構造化された書式設定を適用します。
  • 書式設定と正規化: 大文字と小文字の区別、句読点、逆テキスト正規化(「2,600 万ドル」を「$26M」に変換するなど)を適用します。

音声コンテンツに関する一般的な音声推論や質問応答には、音声理解を使用します。テキスト読み上げの音声合成には、テキスト読み上げを使用します。

言語の検出とヒント

デフォルトでは、モデルは音声言語を自動的に検出します。話者がコードスイッチングを行うと、言語が動的に切り替わります。

自動検出を使用するには、language_codes を省略するか、空のリストを指定します。

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "language_codes": [],
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      language_codes: [],
    },
  },
});

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "language_codes": []
      }
    }
  }'

言語が事前にわかっている場合は、language_codes で BCP-47 言語コードを指定して、文字起こしの精度を高めます(サポートされている言語をご覧ください)。

Python

generation_config = {
    "transcription_config": {
        "language_codes": ["es-ES"],
    }
}

JavaScript

const generationConfig = {
  transcription_config: {
    language_codes: ["es-ES"],
  },
};

REST

{
  "generation_config": {
    "transcription_config": {
      "language_codes": ["es-ES"]
    }
  }
}

カスタム語彙

一般的でない単語、専門用語、ブランド名、固有名詞を音声モデルが認識しやすくすることができます。custom_vocabulary 配列に最大 1,000 個の用語を指定します(通常、100 個までの用語で最適な結果が得られます)。

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "custom_vocabulary": ["Gemini", "Kubernetes", "BigQuery"],
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      custom_vocabulary: ["Gemini", "Kubernetes", "BigQuery"],
    },
  },
});

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "custom_vocabulary": ["Gemini", "Kubernetes", "BigQuery"]
      }
    }
  }'

話者ダイアライゼーション

話者ダイアライゼーションは、録音内の異なる音声を識別し、各セグメントに spk_1spk_2 などの話者識別子でタグ付けします。最大 8 人のスピーカーがサポートされています(3 人以上のスピーカーの帰属は試験運用版です)。

mode 内で diarization_mode を構成して、ダイアライゼーションを有効にします。

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": {
                "type": "verbatim",
                "diarization_mode": "speaker",
            },
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: {
        type: "verbatim",
        diarization_mode: "speaker",
      },
    },
  },
});

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": {
          "type": "verbatim",
          "diarization_mode": "speaker"
        }
      }
    }
  }'

単語レベルのタイムスタンプ

単語レベルのタイムスタンプは、音声ストリームで認識された各単語の正確な開始オフセットと終了オフセットを提供します。

mode 内で timestamp_granularities を構成して、タイムスタンプを有効にします。

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": {
                "type": "verbatim",
                "timestamp_granularities": ["word"],
            },
        }
    },
)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: {
        type: "verbatim",
        timestamp_granularities: ["word"],
      },
    },
  },
});

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": {
          "type": "verbatim",
          "timestamp_granularities": ["word"]
        }
      }
    }
  }'

modediarization_modetimestamp_granularities を組み合わせると、スピーカー ラベルと単語タイムスタンプの両方を受け取ることができます。

Python

generation_config = {
    "transcription_config": {
        "custom_vocabulary": ["Gemini"],
        "mode": {
            "type": "verbatim",
            "diarization_mode": "speaker",
            "timestamp_granularities": ["word"],
        },
    }
}

JavaScript

const generationConfig = {
  transcription_config: {
    custom_vocabulary: ["Gemini"],
    mode: {
      type: "verbatim",
      diarization_mode: "speaker",
      timestamp_granularities: ["word"],
    },
  },
};

REST

{
  "generation_config": {
    "transcription_config": {
      "custom_vocabulary": ["Gemini"],
      "mode": {
        "type": "verbatim",
        "diarization_mode": "speaker",
        "timestamp_granularities": ["word"]
      }
    }
  }
}

文字起こしモード

Gemini 3.5 Transcribe は、mode パラメータを介して次の 2 つの文字起こしモードをサポートしています。

  • verbatim(デフォルト): 発言された内容をそのまま文字起こしし、フィラーワード(「えー」、「あー」、「~みたいな」、「~だよね」)、繰り返し、一時停止、言い直しをそのまま返します。このモード({"type": "verbatim", ...})では、タイムスタンプと話者ダイアライゼーションが構成されます。
  • smart(スマート文字起こし): インテリジェントな後処理を適用して、文字起こしを読みやすくします。
    • 発話の乱れの除去: 会話のフィラー、どもり、誤った開始を削除します。
    • インラインの自己修正: 発言の修正を直接解決します(たとえば、「火曜日に会いましょう。いや、水曜日の 2 時にしましょう」は「水曜日の午後 2 時に会いましょう」になります)。
    • 構造化された形式の自動適用: 発言された考えを段落、番号付きリスト、箇条書き、日付、通貨、数値の形式に自動的に構造化します。
    • 文法的なクリーンアップ: 自然な句読点、文のケース、流れを適用します。
音声 verbatim の出力 smart(スマート文字起こし)の出力
「えっと、会議にはアリスを招待するべきだと思います。あ、いや、ボブとキャロルです。」 「えっと、会議にはアリスを招待すべきだと思います。いや、ボブとキャロルを招待すべきです。」 「会議には、ボブとキャロルを招待した方がいいと思います。」
「First item review budget second item finalize timeline third item send recap」 「first item review budget second item finalize timeline third item send recap」 「1. 予算を確認します。
2. タイムラインを確定する
3. ダイジェストを送信」

Python

interaction = client.interactions.create(
    model="gemini-3.5-transcribe",
    input=[
        {
            "type": "audio",
            "uri": audio_file.uri,
            "mime_type": audio_file.mime_type,
        }
    ],
    generation_config={
        "transcription_config": {
            "mode": "smart",
        }
    },
)
print(interaction.output_text)

JavaScript

const interaction = await client.interactions.create({
  model: "gemini-3.5-transcribe",
  input: [
    {
      type: "audio",
      uri: audioFile.uri,
      mime_type: audioFile.mimeType,
    },
  ],
  generation_config: {
    transcription_config: {
      mode: "smart",
    },
  },
});
console.log(interaction.output_text);

REST

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-3.5-transcribe",
    "input": [
      {
        "type": "audio",
        "uri": "YOUR_FILE_URI",
        "mime_type": "audio/mp3"
      }
    ],
    "generation_config": {
      "transcription_config": {
        "mode": "smart"
      }
    }
  }'

音声文字変換出力の解析

完全な文字起こしテキストが interaction.output_text で返されます。

timestamp_granularities または diarization_mode が有効になっている場合、API はインタラクション コンテンツに付加された単語レベルの詳細なアノテーションも返します。

単語のタイムスタンプと話者の切り替えを抽出して反復処理する方法は次のとおりです。

Python

def extract_word_annotations(interaction):
    words = []
    for step in getattr(interaction, "steps", []) or []:
        for content in getattr(step, "content", []) or []:
            for annotation in getattr(content, "annotations", []) or []:
                if getattr(annotation, "type", None) == "word_info":
                    words.append(annotation)
    return words

words = extract_word_annotations(interaction)

for w in words:
    speaker = f"[{w.speaker}] " if getattr(w, "speaker", None) else ""
    start = getattr(w, "start_offset", "")
    end = getattr(w, "end_offset", "")
    timing = f"({start} -> {end}) " if start and end else ""
    print(f"{speaker}{timing}{w.text}")

JavaScript

function extractWordAnnotations(interaction) {
  const words = [];
  for (const step of interaction.steps ?? []) {
    for (const content of step.content ?? []) {
      for (const annotation of content.annotations ?? []) {
        if (annotation.type === "word_info") {
          words.push(annotation);
        }
      }
    }
  }
  return words;
}

const words = extractWordAnnotations(interaction);

for (const w of words) {
  const speaker = w.speaker ? `[${w.speaker}] ` : "";
  const timing = (w.start_offset && w.end_offset) ? `(${w.start_offset} -> ${w.end_offset}) ` : "";
  console.log(`${speaker}${timing}${w.text}`);
}

REST

{
  "id": "interactions/abc123xyz",
  "status": "completed",
  "steps": [
    {
      "id": "step_001",
      "type": "model_output",
      "content": [
        {
          "type": "text",
          "text": "Hello world",
          "annotations": [
            {
              "type": "word_info",
              "text": "Hello",
              "speaker": "spk_1",
              "start_offset": "0.100s",
              "end_offset": "0.450s"
            },
            {
              "type": "word_info",
              "text": "world",
              "speaker": "spk_1",
              "start_offset": "0.500s",
              "end_offset": "0.850s"
            }
          ]
        }
      ]
    }
  ]
}

サポートされている言語

Gemini 3.5 Transcribe では、次の言語と BCP-47 言語コードがサポートされています。

言語 BCP-47 コード 言語 BCP-47 コード
アフリカーンス語 af-ZA 日本語 ja-JP
アムハラ語 am-ET ジャワ語 jv-ID
アラビア語(エジプト) ar-EG カーボベルデ語 kea-CV
アルメニア語 hy-AM カンナダ語 kn-IN
アッサム語 as-IN カザフ語 kk-KZ
アゼルバイジャン語 az-AZ 韓国語 ko-KR
ベラルーシ語 be-BY キルギス語 ky-KG
ベンガル語(バングラデシュ) bn-BD ラトビア語 lv-LV
ベンガル語(インド) bn-IN リンガラ語 ln-CD
ボスニア語 bs-BA リトアニア語 lt-LT
ブルガリア語 bg-BG マケドニア語 mk-MK
ブルガリア語(アルーマニア語) rup-BG マレー語 ms-MY
ビルマ語 my-MM マラヤーラム語 ml-IN
広東語(繁体字) yue-Hant-HK マルタ語 mt-MT
カタルーニャ語 ca-ES 標準中国語(簡体) cmn-Hans-CN
セブアノ語 ceb マラーティー語 mr-IN
中央クメール語 km-KH モンゴル語 mn-MN
クロアチア語 hr-HR ネパール語 ne-NP
チェコ語 cs-CZ ノルウェー語 nb-NO
デンマーク語 da-DK オリヤ語 or-IN
オランダ語 nl-NL ポーランド語 pl-PL
英語(英国) en-GB ポルトガル語(ブラジル) pt-BR
英語(インド) en-IN ポルトガル語(ポルトガル) pt-PT
英語(米国) en-US パンジャブ語 pa-IN
エストニア語 et-EE パンジャブ語(グルムキー文字) pa-Guru-IN
ペルシア語 fa-IR ルーマニア語 ro-RO
フィリピン語 fil-PH ロシア語 ru-RU
フィンランド語 fi-FI セルビア語 sr-RS
フランス語 fr-FR シンド語(アラビア文字) sd-Arab-IN
ガリシア語 gl-ES スロバキア語 sk-SK
ジョージア語 ka-GE スロベニア語 sl-SI
ドイツ語 de-DE スペイン語(ラテンアメリカ) es-419
ギリシャ語 el-GR スペイン語(米国) es-US
グジャラート語 gu-IN スワヒリ語(ケニア) sw-KE
ハウサ語 ha-NG スウェーデン語 sv-SE
ヘブライ語 he-IL タジク語 tg-TJ
ヒンディー語 hi-IN テルグ語 te-IN
ハンガリー語 hu-HU タイ語 th-TH
アイスランド語 is-IS トルコ語 tr-TR
インド英語 en-IN ウクライナ語 uk-UA
インドネシア語 id-ID ウズベク語 uz-UZ
イタリア語 it-IT ベトナム語 vi-VN

パラメータ リファレンス

generation_configtranscription_config オブジェクト内のフィールドを設定して、文字起こしを構成します。

フィールド タイプ 説明
language_codes 文字列の配列 BCP-47 言語コード(例: ["en-US"])。省略または空([])の場合、モデルは言語を自動的に検出し、コード切り替えを処理します。
custom_vocabulary 文字列の配列 音声認識にバイアスをかけるためのカスタム用語、頭字語、固有名詞を最大 1,000 個。
mode オブジェクトまたは文字列 文字起こしモードの構成。"smart" または逐語モード オブジェクト({"type": "verbatim", ...})を受け入れます。デフォルトは逐語文字起こしです。
mode.type 文字列 (逐語モードのみ)モード ID。常に "verbatim" に設定します。
mode.timestamp_granularities 文字列の配列 (逐語モードのみ)返されるタイムスタンプの粒度。単語の開始オフセットと終了オフセットを有効にするには、["word"] を渡します。
mode.diarization_mode 文字列 (逐語モードのみ)発言者識別モード。"speaker" を渡して、個別の話し手を識別してラベル付けします。

ベスト プラクティス

  • クリアな音声を提供する: 音声録音で音声がはっきりと分離され、クリッピングがひどくならないようにします。
  • 言語がわかっている場合は言語ヒントを指定する: 音声の言語がわかっている場合は、language_codes を指定して精度を最大限に高めます。
  • カスタム語彙のターゲット: 一般的な日常用語ではなく、個別のドメイン用語、ブランド名、固有名詞のみを custom_vocabulary に含めます。
  • 大きな録音には Files API を使用する: 数秒を超えるファイルの場合は、client.files.upload を使用してファイルをアップロードし、返されたファイル URI をモデルに渡します。

制限事項

  • 音声の長さ: 標準の単項リクエストでは、最大 1 時間の音声ファイルがサポートされます。話者ダイアライゼーションや単語レベルのタイムスタンプなどの機能が有効になっている場合、音声処理は 30 分に制限されます。
  • 単語レベルのタイムスタンプ: 単語レベルのタイムスタンプを有効にすると、文字起こし全体の精度が低下する可能性があります。
  • 話者ダイアライゼーション: 話者ダイアライゼーションは最大 8 人の話者をサポートします。3 人以上の話者の話者属性は試験運用版です。
  • カスタム語彙: custom_vocabulary で最大 1,000 個の用語を指定できますが、通常は 100 個までの用語で最適な結果が得られます。
  • モードの互換性: スマート文字起こし("smart")は timestamp_granularities または diarization_mode と組み合わせることはできません。

次のステップ

  • Live API を使用して、リアルタイム音声文字変換ガイドでリアルタイム音声をストリーミングします。
  • 音声理解を使用して、音声コンテンツの分析、要約、クエリを行います。
  • テキスト読み上げを使用してテキストから音声を合成する方法を学習する。
  • モデルの料金とトークン上限については、料金ページをご覧ください。
  • メディア ファイルのアップロードと管理について詳しくは、Files API のガイドをご覧ください。