Расшифровка аудио

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);

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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 регионах. Обрабатывает переключение кода внутри предложения и между предложениями без ручной настройки.
  • Пользовательский словарь. Позволяет улучшить распознавание терминов, аббревиатур и имен собственных, характерных для определенной сферы деятельности. Для этого можно передать до 1000 фраз.
  • Диаризация речи. Распознавание разных говорящих и присвоение им меток.
  • Временные метки на уровне слов. Генерирует точные смещения по времени начала и конца для каждого распознанного слова.
  • Умная расшифровка. Удаляет запинки, слова-паразиты и повторы, а также применяет структурированное форматирование.
  • Форматирование и нормализация. Применяет заглавные буквы, пунктуацию и обратную нормализацию текста, например преобразует "двадцать шесть миллионов долларов" в "26 млн долларов".

Для общего анализа аудио или ответов на вопросы по аудиоконтенту используйте Распознавание аудио. Для синтеза речи используйте Text-to-Speech.

Распознавание языка и подсказки

По умолчанию модель определяет язык речи автоматически. Она динамически переключается между языками, когда говорящие переходят с одного языка на другой.

Чтобы использовать автоматическое определение, опустите 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: [],
    },
  },
});

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
            GenerationConfig: &interactions.GenerationConfig{
                TranscriptionConfig: &interactions.TranscriptionConfig{
                    LanguageCodes: []string{},
                },
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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": []
      }
    }
  }'

Если вы знаете язык заранее, укажите коды языков BCP-47 в language_codes, чтобы повысить точность расшифровки (см. Поддерживаемые языки):

Python

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

JavaScript

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

Проложить маршрут

package main

import (
    "google.golang.org/genai/interactions/models/interactions"
)

func main() {
    generationConfig := &interactions.GenerationConfig{
        TranscriptionConfig: &interactions.TranscriptionConfig{
            LanguageCodes: []string{"es-ES"},
        },
    }
    _ = generationConfig
}

REST

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

Пользовательский словарь

Вы можете направить речевую модель на редкие слова, технический жаргон, названия брендов или имена собственные. Укажите до 1000 терминов в массиве custom_vocabulary (лучшие результаты обычно достигаются при использовании до 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"],
    },
  },
});

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
            GenerationConfig: &interactions.GenerationConfig{
                TranscriptionConfig: &interactions.TranscriptionConfig{
                    CustomVocabulary: []string{"Gemini", "Kubernetes", "BigQuery"},
                },
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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_1 или spk_2. Поддерживается до восьми говорящих (атрибуция для трех и более говорящих находится на стадии эксперимента).

Чтобы включить разделение говорящих, настройте diarization_mode в 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",
      },
    },
  },
});

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
            GenerationConfig: &interactions.GenerationConfig{
                TranscriptionConfig: &interactions.TranscriptionConfig{
                    Mode: genai.Ptr(interactions.NewTranscriptionConfigMode(interactions.NewTranscriptionMode(interactions.VerbatimTranscriptionMode{
                        DiarizationMode: genai.Ptr("speaker"),
                    }))),
                },
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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"
        }
      }
    }
  }'

Временные метки на уровне слов

Временные метки на уровне слов содержат точные смещения начала и конца для каждого распознанного слова в аудиопотоке.

Чтобы включить временные метки, настройте timestamp_granularities в 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",
                "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"],
      },
    },
  },
});

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
            GenerationConfig: &interactions.GenerationConfig{
                TranscriptionConfig: &interactions.TranscriptionConfig{
                    Mode: genai.Ptr(interactions.NewTranscriptionConfigMode(interactions.NewTranscriptionMode(interactions.VerbatimTranscriptionMode{
                        TimestampGranularities: []string{"word"},
                    }))),
                },
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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"]
        }
      }
    }
  }'

Вы можете объединить diarization_mode и timestamp_granularities в mode, чтобы получить и ярлыки говорящих, и временные метки слов:

Python

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

JavaScript

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

Проложить маршрут

package main

import (
    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
)

func main() {
    generationConfig := &interactions.GenerationConfig{
        TranscriptionConfig: &interactions.TranscriptionConfig{
            Mode: genai.Ptr(interactions.NewTranscriptionConfigMode(interactions.NewTranscriptionMode(interactions.VerbatimTranscriptionMode{
                DiarizationMode:        genai.Ptr("speaker"),
                TimestampGranularities: []string{"word"},
            }))),
        },
    }
    _ = generationConfig
}

REST

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

Режимы расшифровки

Gemini 3.5 Transcribe поддерживает два режима расшифровки, которые задаются параметром mode:

  • verbatim (по умолчанию). Возвращает точную дословную расшифровку всего сказанного, сохраняя слова-паразиты ("эм", "ну", "типа", "знаешь"), повторы, паузы и фальстарты. Временные метки и разделение говорящих настраиваются в этом режиме ({"type": "verbatim", ...}).
  • smart (Умная расшифровка). Оптимизирует расшифровку для чтения, применяя интеллектуальную постобработку:
    • Удаление запинок. Удаляет слова-паразиты, заикания и ложные начала.
    • Исправление ошибок. Если вы оговорились и исправили себя, например сказали "Давай встретимся во вторник, нет, в среду в два", в заметке будет записано "Давай встретимся в среду в 14:00".
    • Автоматическое структурирование. Gemini автоматически разбивает устную речь на абзацы, нумерованные и маркированные списки, а также форматирует даты, валюты и числа.
    • Исправление грамматики. Применяет естественную пунктуацию, регистр букв и структуру предложений.
Голосовое аудио verbatim выход Вывод smart (умная расшифровка)
"На встречу нужно пригласить Алису и… нет, Боба и Кэрол". "Так, на встречу нужно пригласить Алису, нет, Боба и Кэрол". "Думаю, на встречу нужно пригласить Боба и Кэрол".
"Первый пункт: проверить бюджет. Второй пункт: утвердить сроки. Третий пункт: отправить сводку". "первый пункт: проверить бюджет; второй пункт: утвердить сроки; третий пункт: отправить сводку" "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);

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    audioFile, err := client.Files.UploadFromPath(ctx, "path/to/sample.mp3", nil)
    if err != nil {
        log.Fatal(err)
    }

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.5-transcribe"),
            Input: interactions.NewInteractionsInput([]interactions.Content{
                interactions.NewContent(interactions.AudioContent{
                    URI:      genai.Ptr(audioFile.URI),
                    MimeType: interactions.AudioContentMimeType(audioFile.MIMEType).ToPointer(),
                }),
            }),
            GenerationConfig: &interactions.GenerationConfig{
                TranscriptionConfig: &interactions.TranscriptionConfig{
                    Mode: genai.Ptr(interactions.NewTranscriptionConfigMode(interactions.TranscriptionConfigModeEnumSmart)),
                },
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(res.Interaction.GetOutputText())
}

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}`);
}

Проложить маршрут

package main

import (
    "fmt"

    "google.golang.org/genai/interactions/models/interactions"
)

func extractWordAnnotations(interaction *interactions.Interaction) []*interactions.WordInfo {
    var words []*interactions.WordInfo
    if interaction == nil {
        return words
    }
    for _, step := range interaction.Steps {
        if step.ModelOutputStep != nil {
            for _, content := range step.ModelOutputStep.Content {
                if content.TextContent != nil {
                    for _, annotation := range content.TextContent.Annotations {
                        if annotation.WordInfo != nil {
                            words = append(words, annotation.WordInfo)
                        }
                    }
                }
            }
        }
    }
    return words
}

func main() {
    var interaction *interactions.Interaction
    words := extractWordAnnotations(interaction)

    for _, w := range words {
        speaker := ""
        if w.Speaker != nil && *w.Speaker != "" {
            speaker = fmt.Sprintf("[%s] ", *w.Speaker)
        }
        timing := ""
        if w.StartOffset != nil && w.EndOffset != nil {
            timing = fmt.Sprintf("(%s -> %s) ", *w.StartOffset, *w.EndOffset)
        }
        fmt.Printf("%s%s%s\n", speaker, timing, w.GetText())
    }
}

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.400s"
            },
            {
              "type": "word_info",
              "text": "world",
              "speaker": "spk_1",
              "start_offset": "0.500s",
              "end_offset": "0.800s"
            }
          ]
        }
      ]
    }
  ]
}

Поддерживаемые языки

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
Belarusian 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

Поддерживаемые аудиоформаты

Gemini 3.5 Transcribe поддерживает следующие MIME-типы аудиоформатов:

  • WAV – audio/wav
  • MP3 – audio/mp3
  • AIFF – audio/aiff
  • AAC – audio/aac
  • OGG – audio/ogg
  • FLAC – audio/flac
  • MPEG – audio/mpeg
  • M4A – audio/m4a
  • L16 – audio/l16
  • Opus – audio/opus
  • ALAW – audio/alaw
  • MULAW – audio/mulaw
  • WebM – audio/webm

Полный список поддерживаемых MIME-типов и схем параметров можно найти в справочнике по Interactions API.

Справка по параметрам

Настройте расшифровку, задав поля в объекте transcription_config в generation_config:

Поле Тип Описание
language_codes Массив строк Коды языков по стандарту BCP-47 (например, ["en-US"]). Если они не указаны или поле пустое ([]), модель автоматически определяет язык и переключает код.
custom_vocabulary Массив строк До 1000 пользовательских терминов, аббревиатур или имен собственных для улучшения распознавания речи. Несовместимо с разделением по говорящим и временными метками на уровне слов.
mode Объект или строка Конфигурация режима расшифровки. Принимает "smart" или объект дословного режима ({"type": "verbatim", ...}). По умолчанию используется дословная расшифровка.
mode.type Строка (Только для режима точного соответствия) Идентификатор режима. Всегда имеет значение "verbatim".
mode.timestamp_granularities Массив строк (Только для дословного режима.) Детализация возвращаемых временных меток. Передайте ["word"], чтобы включить смещения начала и конца слов. Несовместимо с пользовательским словарем.
mode.diarization_mode Строка (Только для дословного режима.) Режим диаризации. Передайте "speaker", чтобы распознавать и помечать разных говорящих. Несовместимо с пользовательским словарем.

Рекомендации

  • Предоставляйте чистые аудиозаписи. Убедитесь, что на аудиозаписях голоса четко разделены и нет сильного клиппинга.
  • Указывайте язык, если он известен. Если вы заранее знаете язык аудио, укажите language_codes, чтобы повысить точность.
  • Целевой пользовательский словарь. Включайте в custom_vocabulary только отдельные термины, названия брендов или имена собственные, а не обычные повседневные слова.
  • Используйте Files API для больших записей. Для файлов длиннее нескольких секунд загрузите файл с помощью client.files.upload и передайте возвращенный URI файла модели.

Ограничения

  • Продолжительность аудио. Стандартные унарные запросы поддерживают аудиофайлы продолжительностью до 1 часа. Если включены такие функции, как диаризация говорящих или временные метки на уровне слов, обработка аудио ограничена 30 минутами.
  • Временные метки на уровне слов. Если включить эту функцию, общая точность расшифровки может снизиться.
  • Разделение говорящих. Поддерживается до восьми говорящих. Определение говорящего для трех и более человек работает в экспериментальном режиме.
  • Пользовательский словарь. В custom_vocabulary можно добавить до 1000 терминов,но наилучшие результаты обычно достигаются, если их не больше 100. Вы не можете использовать custom_vocabulary вместе с разделением по говорящим или временными метками на уровне слов. API отклоняет запросы, в которых custom_vocabulary указан вместе с любой из этих функций.
  • Совместимость режимов. Умную расшифровку ("smart") нельзя использовать вместе с timestamp_granularities или diarization_mode.

Дальнейшие действия

  • Передавайте аудио в реальном времени с помощью руководства по Прямой расшифровке, используя Live API.
  • Распознавание аудио позволяет анализировать аудиоконтент, создавать его краткий пересказ и задавать вопросы по нему.
  • Узнайте, как синтезировать аудио из текста с помощью Text-to-Speech.
  • Цены и лимиты токенов для моделей указаны на странице с ценами.
  • Подробную информацию о загрузке медиафайлов и управлении ими можно найти в руководстве по Files API.