Работа со звуком

Урок 2 из 69 курса «Gemini API: быстрый старт»: официальный курс Gemini API Cookbook (Гугл Джемини) на русском языке. Этот урок бесплатный.

Авторские права 2026 Google LLC.
# @title Лицензировано в соответствии с лицензией Apache, версия 2.0 ("Лицензия");
# вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
# Вы можете получить копию Лицензии по адресу
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Если иное не предусмотрено применимым законодательством или не согласовано в письменной форме, программное обеспечение
# распространяется по Лицензии на условиях "КАК ЕСТЬ",
# БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых.
# См. Лицензию для получения информации о конкретных разрешениях и
# ограничениях в соответствии с Лицензией.

Gemini API: Краткое руководство по работе с аудио

Этот notebook демонстрирует пример того, как использовать Gemini Flash с помощью аудиофайла. В данном случае вы будете использовать звукозапись обращения президента Джона Ф. Кеннеди «О положении в стране» 1961 года.

Примечание: Этот notebook использует Interactions API, новейший способ взаимодействия с моделями Gemini. Ищете версию с generateContent? Проверьте архивную ветку.

Настройка

Установка зависимостей

%pip install -U -q "google-genai>=2.9.0"  # 2.0 for Interactions API

Настройка вашего API key

Для запуска следующей cell ваш API key должен быть сохранен в Colab Secret с именем GEMINI_API_KEY. Если у вас еще нет API key или вы не знаете, как создать Colab Secret, см. Аутентификация для пошагового руководства.

from google.colab import userdata
from google import genai

GEMINI_API_KEY = userdata.get('GEMINI_API_KEY')
client = genai.Client(api_key=GEMINI_API_KEY)

Выберите model, которую вы хотите использовать в этом руководстве:

MODEL_ID = "gemini-3.7-flash" # @param ["gemini-3.1-pro-preview", "gemini-3.7-flash", "gemini-3.5-flash-lite", "gemini-2.5-pro"] {"allow-input":true, isTemplate: true}

Загрузка аудиофайла с помощью File API

Чтобы использовать аудиофайл в вашем prompt, вы должны сначала загрузить его с помощью File API.

URL = "https://storage.googleapis.com/generativeai-downloads/data/State_of_the_Union_Address_30_January_1961.mp3"
!wget -q $URL -O sample.mp3
your_audio_file = client.files.upload(file='sample.mp3')

Использование файла в вашем prompt

interaction = client.interactions.create(
    model=MODEL_ID,
    input=[
        {"type": "text", "text": "Внимательно прослушайте следующий аудиофайл. Предоставьте краткое резюме."},
        {"type": "audio", "uri": your_audio_file.uri},
    ],
)

print(interaction.steps[-1].content[0].text)
В своем первом обращении «О положении в стране» 30 января 1961 года президент Джон Ф. Кеннеди представил откровенную оценку нации, столкнувшейся как с "национальной опасностью, так и с национальными возможностями". Он подробно описал испытывающую трудности внутреннюю экономику, характеризующуюся рецессией, высоким уровнем безработицы и стагнацией роста, предложив ряд законодательных мер — включая повышение минимальной заработной платы, городское переустройство и расширение пособий по безработице — для стимулирования восстановления. 

На международной арене Кеннеди затронул обострение напряженности Холодной войны, выделив кризисы в Азии, Африке и Латинской Америке. Он призвал к значительному укреплению военного потенциала США, в частности, за счет увеличения пропускной способности воздушных перевозок и ускоренных программ по ракетам и подводным лодкам. Одновременно он отстаивал активную внешнюю политику, ориентированную на международное развитие, предложив "Альянс за прогресс" для Латинской Америки и создание Корпуса мира. Кеннеди завершил свое выступление, подчеркнув необходимость научного сотрудничества, контроля над вооружениями и непоколебимой преданности американского народа для преодоления предстоящих трудных лет.

Встроенное аудио

Для небольших запросов вы можете встраивать аудиоданные непосредственно в запрос, как и в случае с изображениями. Аудиоданные должны быть закодированы в base64 для отправки с prompt. Используйте, например, PyDub, чтобы обрезать первые 10 секунд аудио:

%pip install -Uq pydub
from pydub import AudioSegment
 from .audio_segment import AudioSegment
  File "/usr/local/google/home/giom/.gemini/jetski/scratch/cookbook-agentB-interactions/.venv/lib/python3.13/site-packages/pydub/audio_segment.py", line 11, in <module>
    from .utils import mediainfo_json, fsdecode
  File "/usr/local/google/home/giom/.gemini/jetski/scratch/cookbook-agentB-interactions/.venv/lib/python3.13/site-packages/pydub/utils.py", line 16, in <module>
    import pyaudioop as audioop
ModuleNotFoundError: No module named 'pyaudioop'
sound = AudioSegment.from_mp3("sample.mp3")
Traceback (most recent call last):
  File "/tmp/execute_notebook.py", line 103, in execute_notebook
    result = exec(compile(prepared, f"{name}:cell_{i}", 'exec'), ns)
  File "Audio.ipynb:cell_22", line 1, in <module>
NameError: name 'AudioSegment' is not defined
sound[:10000] # срезы указаны в мс
Traceback (most recent call last):
  File "/tmp/execute_notebook.py", line 103, in execute_notebook
    result = exec(compile(prepared, f"{name}:cell_{i}", 'exec'), ns)
  File "Audio.ipynb:cell_23", line 1, in <module>
NameError: name 'sound' is not defined. Did you mean: 'round'?

Добавьте его в список частей в prompt:

import base64

audio_data = base64.b64encode(sound[:10000].export().read()).decode('utf-8')

interaction = client.interactions.create(
    model=MODEL_ID,
    input=[
        {"type": "text", "text": "Опишите этот аудиоклип"},
        {"type": "audio", "data": audio_data, "mime_type": "audio/mp3"},
    ],
)

print(interaction.steps[-1].content[0].text)
Traceback (most recent call last):
  File "/tmp/execute_notebook.py", line 103, in execute_notebook
    result = exec(compile(prepared, f"{name}:cell_{i}", 'exec'), ns)
  File "Audio.ipynb:cell_25", line 3, in <module>
NameError: name 'sound' is not defined. Did you mean: 'round'?

Обратите внимание на следующее при предоставлении аудио в виде встроенных данных:

  • Максимальный размер запроса составляет 100 МБ, что включает текстовые prompts, системные инструкции и встроенные файлы. Если размер вашего файла превысит 100 МБ, то используйте File API для загрузки файлов.
  • Если вы используете аудиообразец несколько раз, эффективнее использовать File API.

Получение транскрипции аудиофайла

Чтобы получить транскрипцию, просто запросите ее в prompt. Например:

prompt = "Сгенерируйте транскрипцию речи."

interaction = client.interactions.create(
    model=MODEL_ID,
    input=[
        {"type": "text", "text": prompt},
        {"type": "audio", "uri": your_audio_file.uri},
    ],
)

from IPython.display import Markdown
display(Markdown(interaction.steps[-1].content[0].text))

Ссылка на временные метки в аудиофайле

Prompt может указывать временные метки в формате MM:SS для ссылки на определенные разделы в аудиофайле. Например:

# Создайте prompt, содержащий временные метки.
prompt = "Предоставьте транскрипцию речи между временными метками 02:30 и 03:29."

interaction = client.interactions.create(
    model=MODEL_ID,
    input=[
        {"type": "text", "text": prompt},
        {"type": "audio", "uri": your_audio_file.uri},
    ],
)

display(Markdown(interaction.steps[-1].content[0].text))
Вот транскрипция речи между временными метками 02:30 и 03:29:

Возвращение среди стольких друзей — это счастливое событие. Я уверен, что эта дружба будет продолжаться. Наша Конституция мудро отводит как совместные, так и отдельные роли каждой ветви власти; и Президент, и Конгресс, взаимно уважающие друг друга, не допустят и не предпримут никаких посягательств. Со своей стороны, я не буду скрывать ни от Конгресса, ни от народа никаких фактов или отчетов, прошлых, настоящих или будущих, которые необходимы для информированного суждения о нашем поведении и опасностях. Я не буду перекладывать бремя исполнительных решений на Конгресс и не буду уклоняться от ответственности за результаты этих решений.

Использование видео с YouTube

from IPython.display import display, Markdown

youtube_url = "https://www.youtube.com/watch?v=RDOMKIw1aF4" # @param {type:"string"}

prompt = """
    Проанализируйте следующее содержимое видео с YouTube. Предоставьте краткое резюме, охватывающее:

    1.  **Основной тезис/утверждение:** Какова центральная идея, которую высказывает автор?
    2.  **Ключевые темы:** Перечислите основные обсуждаемые темы, ссылаясь на конкретные примеры или упомянутые технологии (например, AI models, языки программирования, проекты).
    3.  **Призыв к действию:** Определите любые явные запросы, сделанные зрителю.
    4.  **Резюме:** Предоставьте краткое резюме содержимого видео.

    Используйте предоставленное название, временные метки/описания глав и текст описания для вашего анализа.
"""
# Проанализируйте видео
interaction = client.interactions.create(
    model=MODEL_ID,
    input=[
        {"type": "text", "text": prompt},
        {"type": "video", "uri": youtube_url},
    ],
)
display(Markdown(interaction.steps[-1].content[0].text))
<IPython.core.display.Markdown object>

Подсчет аудио токенов

Вы можете подсчитать количество tokens в вашем аудиофайле с помощью метода count_tokens.

Аудиофайлы имеют фиксированную скорость token в секунду (более подробная информация в специальном кратком руководстве по подсчету token).

count_tokens_response = client.models.count_tokens(
    model=MODEL_ID,
    contents=[your_audio_file],
)

print("Токены аудиофайла:",count_tokens_response.total_tokens)
Токены аудиофайла: 83528

Дальнейшие шаги

Полезные ссылки на API:

Более подробная информация о возможностях зрения Gemini API в документации.

Если вы хотите узнать о File API, ознакомьтесь с его API reference или кратким руководством по File API.

Связанные примеры

Ознакомьтесь с этим примером использования аудиофайлов, чтобы получить больше идей о том, что Gemini API может с ними делать:

Продолжите изучение Gemini API

Ознакомьтесь с кратким руководством по аудио, чтобы узнать о другом типе медиафайлов, затем узнайте больше о prompting с медиафайлами в документации, включая поддерживаемые форматы и максимальную длину для аудиофайлов. .

Урок входит в темы

Полезные гиды