Sesleri anlama

ai.google.dev adresinde görüntüle Google Colab'de çalıştırma Kaggle'da çalıştırma Vertex AI'da aç Kaynağı GitHub'da görüntüleyin

Gemma 3n'den itibaren, sesleri doğrudan istemlerinizde ve iş akışlarınızda kullanabilirsiniz. Ses ve konuşma dili, kullanıcıların amaçlarını belirlemek, etrafımızdaki dünya hakkında bilgi kaydetmek ve çözülmesi gereken belirli sorunları anlamak için zengin veri kaynaklarıdır.

Bu kılavuzda, otomatik konuşma tanıma (ASR), çeviri ve genel konuşma anlama dahil olmak üzere Gemma 4'ün ses işleme özelliklerine genel bir bakış sunulmaktadır.

Bu not defteri T4 GPU'da çalışır.

Python paketlerini yükleme

Gemma modelini çalıştırmak ve istekte bulunmak için gereken Hugging Face kitaplıklarını yükleyin.

# Install PyTorch & other libraries
pip install torch accelerate

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

Modeli Yükle

Aşağıdaki kod örneğinde gösterildiği gibi AutoProcessor ve AutoModelForImageTextToText sınıflarını kullanarak transformers kitaplıklarını kullanarak processor ve model örneği oluşturun:

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]

Ses verileri

Dijital ses verileri birçok biçimde ve çözünürlük düzeyinde olabilir. Gemma ile kullanabileceğiniz gerçek ses biçimleri (ör. MP3 ve WAV biçimleri), ses verilerini tensörlere dönüştürmek için seçtiğiniz çerçeveye göre belirlenir. Gemma ile işlenmek üzere ses verilerini hazırlarken dikkate almanız gereken bazı özel noktaları aşağıda bulabilirsiniz:

  • Jeton maliyeti: Gemma 4 için her saniyelik ses 25 jetondur. (Gemma 3n için 6,25 jeton)
  • Klip uzunluğu: Ses, maksimum 30 saniye uzunluğunda olabilir.
  • Ses kanalları: Ses verileri tek bir ses kanalı olarak işlenir. Sol ve sağ kanallar gibi çok kanallı ses kullanıyorsanız kanalları kaldırarak veya ses verilerini tek bir kanalda birleştirerek verileri tek bir kanala indirgemeyi düşünebilirsiniz.
  • Teknik Kodlama:
    • Örnek Hızı: 16 kHz
    • Bit Derinliği: 32 bit kayan nokta biçimi, örnekler [-1, 1] aralığında normalleştirilir.

İşlemeyi planladığınız ses verileri, özellikle kanal sayısı, örnekleme hızı ve bit derinliği açısından giriş işleminden önemli ölçüde farklıysa ses verilerinizi yeniden örnekleyebilir veya kırparak modelin işlediği veri çözünürlüğüne uygun hale getirebilirsiniz.

Ses kodlama

Üst düzey kitaplıklar (ör. Hugging Face AutoProcessor) genellikle ses ön işlemesini otomatik olarak yapsa da bazen özel kodlama uygulamanız gerekebilir.

Gemma ile kullanılmak üzere ses verilerini kendi kod uygulamanızla kodlarken önerilen dönüştürme sürecini izlemeniz gerekir. Belirli bir biçimde kodlanmış ses dosyalarıyla (ör. MP3 veya WAV kodlu veriler) çalışıyorsanız önce bunları ffmpeg gibi bir kitaplık kullanarak örnekler halinde çözmeniz gerekir. Veriler çözüldükten sonra sesi [-1, 1] aralığında tek kanallı, 16 kHz float32 dalga biçimlerine dönüştürün.Örneğin, 44,1 kHz'de stereo imzalı 16 bit PCM tamsayı WAV dosyalarıyla çalışıyorsanız şu adımları uygulayın:

  • Ses verilerini 16 kHz'ye yeniden örnekleyin.
  • 2 kanalı ortalayarak stereo sesin mono sese dönüştürülmesi
  • int16'dan float32'ye dönüştürün ve [-1, 1] aralığına ölçeklemek için 32768, 0'a bölün.

Sesle yazma

Gemma 4 E2B, E4B ve 12B Unified, çok dilli konuşma tanıma için eğitilmiştir. Bu sayede, çeşitli dillerdeki ses girişlerini metne dönüştürebilirsiniz.

Sesli Konuşma Tanıma (ASR) için aşağıdaki istem yapısını kullanın.

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.

Aşağıdaki kod örneklerinde, Hugging Face Transformers'ı kullanarak modelden ses dosyalarındaki metinleri transkribe etmesini isteme işlemi gösterilmektedir:

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

Otomatik konuşma çevirisi

Gemma 4 E2B, E4B ve 12B Unified, çok dilli konuşma çevirisi görevleri için eğitilmiştir. Bu sayede, seslendirilmiş içeriği doğrudan başka bir dile çevirebilirsiniz.

Otomatik Konuşma Çevirisi (AST) için aşağıdaki istem yapısını kullanın.

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}.

Aşağıdaki kod örneklerinde, Hugging Face Transformers'ı kullanarak modelin seslendirilmiş içeriği metne çevirmesi için nasıl istem oluşturulacağı gösterilmektedir:

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

Otomatik Konuşma Çevirisi / Otomatik Konuşma Tanıma

Kendiniz deneyin

pip install ipywebrtc

Yuvarlak düğmeye basıp konuşmaya başlayın. İşiniz bittiğinde yuvarlak düğmeyi tekrar tıklayın. Widget, kaydettiği içeriği hemen oynatmaya başlar.

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': …

webm dosyasını PyTorch'un anlayabileceği wav biçimine dönüştürün.

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

Özet ve sonraki adımlar

Bu kılavuzda, Gemma 4 modellerini kullanarak sesi nasıl işleyeceğinizi öğrendiniz. Örneklerde, konuşulan dili metne dönüştürmek için Konuşmayı Metne Dönüştürme (ASR) ve seslendirilmiş içeriği doğrudan başka bir dile çevirmek için Otomatik Konuşma Çevirisi (AST) işlemlerinin nasıl yapılacağı gösterildi. Ayrıca, işleme için not defteri ortamında mikrofondan ses yakalamayı da öğrendiniz.

Daha fazla bilgi için aşağıdaki dokümanları inceleyin.