Compréhension audio

Afficher sur ai.google.dev Exécuter dans Google Colab Exécuter dans Kaggle Ouvrir dans Vertex AI Afficher la source sur GitHub

À partir de Gemma 3n, vous pouvez utiliser l'audio directement dans vos invites et workflows. L'audio et le langage parlé sont de riches sources de données pour capturer les intentions des utilisateurs, enregistrer des informations sur le monde qui nous entoure et comprendre les problèmes spécifiques à résoudre.

Ce guide présente les fonctionnalités de traitement audio de Gemma 4, y compris la reconnaissance vocale automatique, la traduction et la compréhension générale de la parole.

Ce notebook s'exécutera sur un GPU T4.

Installer des packages Python

Installez les bibliothèques Hugging Face requises pour exécuter le modèle Gemma et envoyer des requêtes.

# Install PyTorch & other libraries
pip install torch accelerate

# Install the transformers library
pip install "transformers>=5.10.1"

Charger le modèle

Utilisez les bibliothèques transformers pour créer une instance de processor et de model à l'aide des classes AutoProcessor et AutoModelForImageTextToText, comme illustré dans l'exemple de code suivant :

MODEL_ID = "google/gemma-4-E2B-it" # @param ["google/gemma-4-E2B-it","google/gemma-4-E4B-it", "google/gemma-4-12B-it"]

from transformers import pipeline

pipe = pipeline(
    task="any-to-any",
    model=MODEL_ID,
    device_map="auto",
    dtype="auto"
)
config.json:   0%|          | 0.00/4.95k [00:00<?, ?B/s]
model.safetensors:   0%|          | 0.00/10.2G [00:00<?, ?B/s]
Loading weights:   0%|          | 0/1951 [00:00<?, ?it/s]
generation_config.json:   0%|          | 0.00/208 [00:00<?, ?B/s]
processor_config.json:   0%|          | 0.00/1.69k [00:00<?, ?B/s]
chat_template.jinja:   0%|          | 0.00/17.3k [00:00<?, ?B/s]
tokenizer_config.json:   0%|          | 0.00/2.10k [00:00<?, ?B/s]
tokenizer.json:   0%|          | 0.00/32.2M [00:00<?, ?B/s]

Données audio

Les données audio numériques peuvent se présenter sous de nombreux formats et niveaux de résolution. Les formats audio réels que vous pouvez utiliser avec Gemma, tels que les formats MP3 et WAV, sont déterminés par le framework que vous choisissez pour convertir les données sonores en tenseurs. Voici quelques considérations spécifiques à prendre en compte lors de la préparation des données audio pour le traitement avec Gemma :

  • Coût des jetons : chaque seconde d'audio correspond à 25 jetons pour Gemma 4. (6,25 jetons pour Gemma 3n)
  • Durée du clip : la durée maximale de l'audio est de 30 secondes.
  • Canaux audio : les données audio sont traitées comme un seul canal audio. Si vous utilisez un son multicanal, par exemple les canaux gauche et droit, envisagez de réduire les données à un seul canal en supprimant des canaux ou en combinant les données sonores en un seul canal.
  • Encodage technique
    • Taux d'échantillonnage : 16 kHz
    • Profondeur de bits : format flottant 32 bits, avec des échantillons normalisés dans la plage [-1, 1].

Si les données audio que vous prévoyez de traiter sont très différentes du traitement d'entrée, en particulier en termes de canaux, de taux d'échantillonnage et de profondeur de bits, envisagez de rééchantillonner ou de découper vos données audio pour qu'elles correspondent à la résolution des données gérée par le modèle.

Encodage audio

Bien que les bibliothèques de haut niveau (telles que Hugging Face AutoProcessor) gèrent souvent le prétraitement audio automatiquement, vous devrez parfois implémenter un encodage personnalisé.

Lorsque vous encodez des données audio avec votre propre implémentation de code pour les utiliser avec Gemma, vous devez suivre le processus de conversion recommandé. Si vous travaillez avec des fichiers audio encodés dans un format spécifique, tel que des données encodées au format MP3 ou WAV, vous devez d'abord les décoder en échantillons à l'aide d'une bibliothèque telle que ffmpeg. Une fois les données décodées, convertissez l'audio en formes d'onde flottantes 32 bits à 16 kHz monocanal dans la plage [-1, 1]. Par exemple, si vous travaillez avec des fichiers WAV entiers PCM 16 bits signés stéréo à 44,1 kHz, procédez comme suit :

  • Rééchantillonnez les données audio à 16 kHz
  • Réduisez le son de stéréo à mono en calculant la moyenne des deux canaux
  • Convertissez le format int16 en float32, puis divisez par 32 768,0 pour mettre à l'échelle la plage [-1, 1]

Reconnaissance vocale

Les modèles unifiés Gemma 4 E2B, E4B et 12B sont entraînés pour la reconnaissance vocale multilingue, ce qui vous permet de transcrire des entrées audio dans différentes langues en texte.

Utilisez la structure d'invite suivante pour la reconnaissance vocale automatique.

Transcribe the following speech segment in {LANGUAGE} into {LANGUAGE} text.

Follow these specific instructions for formatting the answer:
*   Only output the transcription, with no newlines.
*   When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three.

Les exemples de code suivants montrent comment inviter le modèle à transcrire du texte à partir de fichiers audio à l'aide de Hugging Face Transformers :

from transformers import GenerationConfig
config = GenerationConfig.from_pretrained(MODEL_ID)
config.max_new_tokens = 64
gen_kwargs = dict(generation_config=config)

RESOURCE_URL_PREFIX = "https://raw.githubusercontent.com/google-gemma/cookbook/refs/heads/main/apps/sample-data/"

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."},
            #{"type": "text", "text": "Transcribe the following speech segment in English into English text. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal1.wav"},
        ]
    }
]

outputs = pipe(messages, return_full_text=False, generate_kwargs=gen_kwargs)
print(outputs[0]['generated_text'])
I woke up early today feeling really fresh the morning light was beautiful and I enjoyed a nice cup of coffee<turn|>
from transformers import GenerationConfig
config = GenerationConfig.from_pretrained(MODEL_ID)
config.max_new_tokens = 1024
gen_kwargs = dict(generation_config=config)

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Give me a concise overview of these audio files."},
            {"type": "text", "text": "journal1:"},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal1.wav"},
            {"type": "text", "text": "journal2:"},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal2.wav"},
            {"type": "text", "text": "journal3:"},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal3.wav"},
            {"type": "text", "text": "journal4:"},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal4.wav"},
            {"type": "text", "text": "journal5:"},
            {"type": "audio", "audio": f"{RESOURCE_URL_PREFIX}journal5.wav"},
        ]
    }
]

outputs = pipe(messages, return_full_text=False, generate_kwargs=gen_kwargs)
print(outputs[0]['generated_text'])
Here is a concise overview of each audio file:

**journal1:** The speaker describes a fresh and peaceful day, enjoying a cup of coffee.
**journal2:** The speaker had a perfect day at the park, including a walk and watching cherry blossoms.
**journal3:** The speaker finished the day with a good book, feeling grateful for simple moments.
**journal4:** The speaker returned from work and noted the beautiful night sky and a clear view from the train.
**journal5:** The speaker had a great lunch with an old friend, which was a pleasant way to catch up and made their day.
<turn|>

Traduction vocale automatique

Les modèles unifiés Gemma 4 E2B, E4B et 12B sont entraînés pour les tâches de traduction vocale multilingue, ce qui vous permet de traduire directement l'audio parlé dans une autre langue.

Utilisez la structure d'invite suivante pour la traduction vocale automatique.

Transcribe the following speech segment in {SOURCE_LANGUAGE}, then translate it into {TARGET_LANGUAGE}.
When formatting the answer, first output the transcription in {SOURCE_LANGUAGE}, then one newline, then output the string '{TARGET_LANGUAGE}: ', then the translation in {TARGET_LANGUAGE}.

Les exemples de code suivants montrent comment inviter le modèle à traduire l'audio parlé en texte à l'aide de Hugging Face Transformers :

from transformers import GenerationConfig
config = GenerationConfig.from_pretrained(MODEL_ID)
config.max_new_tokens = 64
gen_kwargs = dict(generation_config=config)

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Transcribe the following speech segment in English, then translate it into Korean. When formatting the answer, first output the transcription in English, then one newline, then output the string 'Korean: ', then the translation in Korean."},
            {"type": "audio", "audio": "https://ai.google.dev/gemma/docs/audio/roses-are.wav"},
        ]
    }
]

outputs = pipe(messages, return_full_text=False, generate_kwargs=gen_kwargs)
print(outputs[0]['generated_text'])
Roses are red, violets are blue.
Korean: 장미는 빨갛고, 제비꽃은 파랗다.<turn|>

Traduction vocale automatique / Reconnaissance vocale automatique

Essayez vous-même

pip install ipywebrtc

Appuyez sur le bouton circulaire et commencez à parler. Cliquez de nouveau sur le bouton circulaire lorsque vous avez terminé. Le widget commence immédiatement à lire ce qu'il a capturé.

from google.colab import output
output.enable_custom_widget_manager()

from ipywebrtc import AudioRecorder, CameraStream

camera = CameraStream(constraints={'audio': True,'video':False})
recorder = AudioRecorder(stream=camera)
recorder
AudioRecorder(audio=Audio(value=b'', format='webm'), stream=CameraStream(constraints={'audio': True, 'video': …

Convertissez le fichier WebM au format WAV que PyTorch peut comprendre.

with open('/content/recording.webm', 'wb') as f:
    f.write(recorder.audio.value)
!ffmpeg -i /content/recording.webm /content/recording.wav -y
ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)
  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, matroska,webm, from '/content/recording.webm':
  Metadata:
    encoder         : Chrome
  Duration: 00:00:03.00, start: 0.000000, bitrate: 132 kb/s
  Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default)
Stream mapping:
  Stream #0:0 -> #0:0 (opus (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, wav, to '/content/recording.wav':
  Metadata:
    ISFT            : Lavf58.76.100
  Stream #0:0(eng): Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, mono, s16, 768 kb/s (default)
    Metadata:
      encoder         : Lavc58.134.100 pcm_s16le
size=     287kB time=00:00:02.99 bitrate= 783.7kbits/s speed=79.4x    
video:0kB audio:287kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.026552%

ASR

from transformers import GenerationConfig
config = GenerationConfig.from_pretrained(MODEL_ID)
config.max_new_tokens = 64
gen_kwargs = dict(generation_config=config)

messages = [{
  "role": "user",
  "content": [
    {"type": "text", "text": "Transcribe the following speech segment in its original language. Follow these specific instructions for formatting the answer:\n* Only output the transcription, with no newlines.\n* When transcribing numbers, write the digits, i.e. write 1.7 and not one point seven, and write 3 instead of three."},
    {"type": "audio", "audio": "/content/recording.wav"},
  ]
}]

outputs = pipe(messages, return_full_text=False, generate_kwargs=gen_kwargs)
print(outputs[0]['generated_text'])
How can I get to the station?<turn|>

AST

messages = [{
  "role": "user",
  "content": [
    {"type": "text", "text": "Transcribe the following speech segment in English, then translate it into Korean. When formatting the answer, first output the transcription in English, then one newline, then output the string 'Korean: ', then the translation in Korean."},
    {"type": "audio", "audio": "/content/recording.wav"},
  ]
}]

outputs = pipe(messages, return_full_text=False, generate_kwargs=gen_kwargs)
print(outputs[0]['generated_text'])
How can I get to the station?
Korean: 역에 어떻게 가나요?<turn|>

Résumé et étapes suivantes

Dans ce guide, vous avez appris à traiter l'audio à l'aide des modèles Gemma 4. Les exemples ont montré comment effectuer une reconnaissance vocale pour transcrire le langage parlé, ainsi qu'une traduction vocale automatique pour traduire directement l'audio parlé dans une autre langue. Vous avez également vu comment capturer l'audio d'un microphone dans un environnement de notebook pour le traitement.

Pour en savoir plus, consultez la documentation suivante.