Transformers documentation

Audio-teks-ke-teks

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Audio-teks-ke-teks

Model audio-ke-teks menerima audio dan teks sebagai input serta menghasilkan teks sebagai output. Model ini menggabungkan pemahaman audio dengan generasi bahasa, sehingga memungkinkan tugas seperti menjawab pertanyaan berbasis audio (misalnya, “Apa yang dikatakan dalam klip ini?”), penalaran audio (misalnya, “Emosi apa yang disampaikan oleh pembicara?”), dan pemahaman dialog lisan. Berbeda dengan model pengenalan ucapan otomatis (ASR) tradisional yang hanya mentranskripsi ucapan menjadi teks, model audio-ke-teks dapat melakukan penalaran terhadap konten audio, mengikuti instruksi yang kompleks, dan menghasilkan respons kontekstual berdasarkan apa yang mereka dengar.

Contoh di bawah ini menunjukkan cara memuat model dan prosesor, meneruskan file audio dengan prompt teks, dan menghasilkan respons. Dalam kasus ini, kita meminta model untuk mentranskripsi rekaman suara.

from transformers import AudioFlamingo3ForConditionalGeneration, AutoProcessor

model_id = "nvidia/audio-flamingo-3-hf"
processor = AutoProcessor.from_pretrained(model_id)
model = AudioFlamingo3ForConditionalGeneration.from_pretrained(model_id, device_map="auto")

conversation = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "Transcribe the input speech."},
            {"type": "audio", "path": "https://huggingface.co/datasets/nvidia/AudioSkills/resolve/main/assets/WhDJDIviAOg_120_10.mp3"},
        ],
    }
]

inputs = processor.apply_chat_template(
    conversation,
    tokenize=True,
    add_generation_prompt=True,
    return_dict=True,
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=500)

decoded_outputs = processor.batch_decode(outputs[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(decoded_outputs)
## ["The transcription of the audio is 'summer follows spring the days grow longer and the nights are warm'."]

Panduan ini akan menunjukkan cara Anda untuk:

  1. Lakukan fine-tuning Audio Flamingo 3 pada dataset AudioCaps untuk audio captioning menggunakan LoRA.
  2. Gunakan model yang telah Anda fine-tune untuk inferensi.

Untuk melihat semua arsitektur dan checkpoint yang kompatibel dengan tugas ini, kami menyarankan untuk memeriksa halaman tugas.

Sebelum memulai, pastikan Anda telah menginstal semua pustaka yang diperlukan:

pip install transformers datasets peft accelerate

Kami menyarankan Anda untuk masuk ke akun Hugging Face Anda agar dapat mengunggah dan membagikan model Anda kepada komunitas. Saat diminta, masukkan token Anda untuk masuk:

>>> from huggingface_hub import notebook_login
>>> notebook_login()

Muat dataset AudioCaps

Mulai dengan memuat dataset AudioCaps dari pustaka 🤗 Datasets dalam mode streaming. Dataset ini berisi klip audio dengan keterangan deskriptif, yang sangat cocok untuk tugas captioning audio.

>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("OpenSound/AudioCaps", split="train", streaming=True)

Cast kolom audio ke 16kHz, yang diperlukan oleh fitur ekstraktor Whisper dari Audio Flamingo:

>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))

Pisahkan dataset menjadi set latih dan uji menggunakan .take() dan .skip() untuk dataset streaming:

>>> train_dataset = dataset.take(1000)
>>> eval_dataset = dataset.skip(1000).take(100)

Lihatlah sebuah contoh:

>>> next(iter(train_dataset))
{'audiocap_id': 91139, 'youtube_id': 'r1nicOVtvkQ', 'start_time': 130, 'caption': 'A woman talks nearby as water pours', 'audio_length': 480000, 'audio': <datasets.features._torchcodec.AudioDecoder object at ...>}

Dataset ini berisi:

  • audio: gelombang audio
  • caption: teks caption deskriptif untuk audio

Pra-pemrosesan

Muat processor Audio Flamingo untuk menangani input audio dan teks:

>>> from transformers import AutoProcessor
>>> processor = AutoProcessor.from_pretrained("nvidia/audio-flamingo-3-hf")

Buat data collator yang memproses pasangan audio-teks menjadi format yang diharapkan oleh Audio Flamingo. Collator ini menggunakan format template chat dengan array audio langsung:

>>> class AudioFlamingo3DataCollator:
...     """Data collator for Audio Flamingo 3 audio captioning training."""
...
...     def __init__(self, processor):
...         self.processor = processor
...
...     def __call__(self, features):
...         conversations = []
...
...         for feature in features:
...             # Build conversation format for Audio Flamingo
...             # Audio is passed directly as an array, no base64 encoding needed
...             sample = [
...                 {
...                     "role": "user",
...                     "content": [
...                         {"type": "text", "text": "Describe the audio."},
...                         {"type": "audio", "audio": feature["audio"].get_all_samples().data[0].numpy()},
...                     ],
...                 },
...                 {
...                     "role": "assistant",
...                     "content": [{"type": "text", "text": feature["caption"]}],
...                 }
...             ]
...             conversations.append(sample)
...
...         # Apply chat template and format labels for training
...         return self.processor.apply_chat_template(
...             conversations,
...             tokenize=True,
...             add_generation_prompt=False,
...             return_dict=True,
...             output_labels=True,  # Automatically creates labels for training
...         )

Instansiasi data collator:

>>> data_collator = AudioFlamingo3DataCollator(processor)

Latih

Jika Anda belum familiar dengan fine-tuning model menggunakan Trainer, silakan lihat tutorial dasar di sini!

Muat model Audio Flamingo. Kami menggunakan presisi bfloat16 dan device_map="auto" untuk penggunaan memori yang efisien:

>>> from transformers import AudioFlamingo3ForConditionalGeneration
>>> import torch
>>> model = AudioFlamingo3ForConditionalGeneration.from_pretrained(
...     "nvidia/audio-flamingo-3-hf",
...     torch_dtype=torch.bfloat16,
...     device_map="auto",
... )

Konfigurasi LoRA

LoRA (Low-Rank Adaptation) memungkinkan fine-tuning yang efisien dengan hanya melatih sejumlah kecil parameter tambahan. Konfigurasikan LoRA untuk menargetkan lapisan attention dan feed-forward dari model bahasa:

>>> from peft import LoraConfig, get_peft_model
>>> lora_config = LoraConfig(
...     r=16,  # LoRA rank
...     lora_alpha=32,  # LoRA scaling factor
...     target_modules=[
...         # Language model attention
...         "q_proj",
...         "k_proj",
...         "v_proj",
...         "o_proj",
...         # Feed-forward layers
...         "gate_proj",
...         "up_proj",
...         "down_proj",
...     ],
...     lora_dropout=0.05,
...     bias="none",
...     task_type="CAUSAL_LM",
... )
>>> model = get_peft_model(model, lora_config)
>>> model.print_trainable_parameters()
trainable params: 44,302,336 || all params: 8,311,517,696 || trainable%: 0.5330

LoRA secara signifikan mengurangi penggunaan memori dan waktu pelatihan dengan hanya memperbarui sejumlah kecil parameter adapter, bukan seluruh model. Konfigurasi ini menargetkan lapisan attention dan feed-forward pada language model, sementara audio encoder tetap dibekukan, sehingga memungkinkan fine-tuning pada satu GPU.

Menyiapkan pelatihan

Definisikan hiperparameter pelatihan di TrainingArguments. Perhatikan bahwa kami menggunakan max_steps alih-alih epoch karena kami menggunakan dataset streaming:

>>> from transformers import TrainingArguments, Trainer
>>> training_args = TrainingArguments(
...     output_dir="audio-flamingo-3-hf-lora-finetuned",
...     per_device_train_batch_size=4,
...     per_device_eval_batch_size=4,
...     gradient_accumulation_steps=4,
...     learning_rate=1e-4,
...     max_steps=500,  # Use max_steps with streaming datasets
...     bf16=True,
...     logging_steps=10,
...     eval_steps=100,
...     save_steps=250,
...     save_total_limit=2,  # Keep only the latest 2 checkpoints
...     save_only_model=True,  # Skip saving optimizer state to save disk space
...     eval_strategy="steps",
...     save_strategy="steps",
...     remove_unused_columns=False,
...     dataloader_num_workers=0,  # Must be 0 for streaming datasets
...     gradient_checkpointing=True,
...     report_to="none",
... )

Lewatkan argumen pelatihan ke Trainer bersama dengan model, dataset, dan data collator:

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=train_dataset,
...     eval_dataset=eval_dataset,
...     data_collator=data_collator,
... )
>>> trainer.train()

Simpan adapter LoRA dan processor:

>>> trainer.save_model()
>>> processor.save_pretrained("audio-flamingo-3-hf-lora-finetuned")
['audio-flamingo-3-hf-lora-finetuned/processor_config.json']

Setelah pelatihan selesai, bagikan model Anda ke Hub:

>>> trainer.push_to_hub()

Inferensi

Sekarang setelah Anda melakukan fine-tuning pada model, Anda dapat menggunakannya untuk audio captioning.

Muat model dan prosesor yang telah dihaluskan:

>>> from transformers import AudioFlamingo3ForConditionalGeneration, AutoProcessor
>>> from peft import PeftModel
>>> import torch
>>> base_model = AudioFlamingo3ForConditionalGeneration.from_pretrained(
...     "nvidia/audio-flamingo-3-hf",
...     torch_dtype=torch.bfloat16,
...     device_map="auto",
... )
>>> model = PeftModel.from_pretrained(base_model, "audio-flamingo-3-hf-lora-finetuned")
>>> processor = AutoProcessor.from_pretrained("audio-flamingo-3-hf-lora-finetuned")

Muat sampel audio untuk inferensi:

>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("OpenSound/AudioCaps", split="test", streaming=True)
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))
>>> sample = next(iter(dataset))
>>> audio = sample["audio"]
>>> audio_array = audio.get_all_samples().data[0].numpy() if hasattr(audio, "get_all_samples") else audio["array"]

Siapkan input dengan format percakapan:

>>> messages = [
...     {
...         "role": "user",
...         "content": [
...             {"type": "text", "text": "Describe the audio."},
...             {"type": "audio", "audio": audio_array},
...         ],
...     }
... ]
>>> inputs = processor.apply_chat_template(
...     messages,
...     tokenize=True,
...     add_generation_prompt=True,
...     return_dict=True,
... ).to(device=model.device, dtype=model.dtype)

Generate a response

>>> with torch.no_grad():
...     output_ids = model.generate(**inputs, max_new_tokens=100)
>>> # Decode only the generated tokens
>>> input_len = inputs["input_ids"].shape[1]
>>> response = processor.tokenizer.decode(output_ids[0][input_len:], skip_special_tokens=True)
>>> print(response)
## A sewing machine is running while people are talking

Pipeline

Untuk inferensi cepat, gunakan API Pipeline dengan model any-to-any. Contoh di bawah ini menggunakan Voxtral, yang menerima input audio dan teks serta menghasilkan teks. Lihat panduan tugas any-to-any untuk contoh lainnya.

from transformers import pipeline

pipe = pipeline("any-to-any", model="mistralai/Voxtral-Mini-3B-2507")

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "audio",
                "url": "https://huggingface.co/datasets/raushan-testing-hf/audio-test/resolve/main/glass-breaking-151256.mp3",
            },
            {"type": "text", "text": "What do you hear in this audio?"},
        ],
    },
]

outputs = pipe(text=messages, max_new_tokens=100, return_full_text=False)
print(outputs[0]["generated_text"])

Bacaan Lanjutan

Update on GitHub