Transformers documentation
Audio-teks-ke-teks
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:
- Lakukan fine-tuning Audio Flamingo 3 pada dataset AudioCaps untuk audio captioning menggunakan LoRA.
- 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 audiocaption: 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 talkingPipeline
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
- Halaman tugas audio-teks-ke-teks mencakup jenis model, kasus penggunaan, dan dataset.
- Dokumentasi PEFT untuk opsi konfigurasi LoRA lainnya dan metode adapter lain.
- Model card Audio Flamingo 3 untuk detail dan kemampuan yang spesifik pada model.