Transformers documentation
الصوت-النص-إلى-نص
الصوت-النص-إلى-نص
تستقبل نماذج الصوت-النص-إلى-النص كلًا من الصوت والنص كمدخلات، وتولّد النص كمخرج. تجمع هذه النماذج بين فهم الصوت وتوليد اللغة، مما يتيح تنفيذ مهام مثل الإجابة عن الأسئلة المتعلقة بالصوت (مثل: "ما الذي يُقال في هذا المقطع؟")، والاستدلال الصوتي (مثل: "ما هو العاطفة التي ينقلها المتحدث؟")، وفهم الحوار المنطوق. على عكس نماذج التعرف التلقائي على الكلام (ASR) التقليدية التي تقتصر على تحويل الكلام إلى نص، يمكن لنماذج الصوت-النص-إلى-النص الاستدلال على محتوى الصوت، والالتزام بتعليمات معقدة، وإنتاج ردود سياقية بناءً على ما تسمعه.
يُظهر المثال أدناه كيفية تحميل نموذج ومعالج، ومرور ملف صوتي مع موجه نصي، وتوليد استجابة. في هذه الحالة، نطلب من النموذج نقل تسجيل صوتي إلى نص.
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'."]ستُظهر لك هذه الدليل كيفية:
- قم بضبط Audio Flamingo 3 على مجموعة بيانات AudioCaps لتوصيف الصوت باستخدام LoRA.
- استخدم النموذج المُحسَّن لديك للاستدلال.
للاطلاع على جميع البنى المعمارية ونقاط التفتيش المتوافقة مع هذه المهمة، ننصح بالاطلاع على صفحة المهمة.
قبل أن تبدأ، تأكد من تثبيت جميع المكتبات اللازمة:
pip install transformers datasets peft accelerate
ننصحك بتسجيل الدخول إلى حسابك على Hugging Face حتى تتمكن من رفع نموذجك ومشاركته مع المجتمع. عند الطلب، أدخل رمزك (token) لتسجيل الدخول:
>>> from huggingface_hub import notebook_login
>>> notebook_login()تحميل مجموعة بيانات AudioCaps
ابدأ بتحميل مجموعة بيانات AudioCaps من مكتبة 🤗 Datasets في وضع البث. تحتوي هذه المجموعة على مقاطع صوتية مع عناوين وصفية، وهي مثالية لمهام وصف الصوت.
>>> from datasets import load_dataset, Audio
>>> dataset = load_dataset("OpenSound/AudioCaps", split="train", streaming=True)قم بتحويل عمود الصوت إلى 16kHz، وهو ما يتطلبه مستخرج ميزات Whisper الخاص بـ Audio Flamingo:
>>> dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))قسّم مجموعة البيانات إلى مجموعات تدريب واختبار باستخدام .take() و.skip() لمجموعات البيانات التي يتم بثّها:
>>> train_dataset = dataset.take(1000)
>>> eval_dataset = dataset.skip(1000).take(100)انظر إلى مثال:
>>> 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 ...>}
تحتوي مجموعة البيانات على:
audio: الموجة الصوتيةcaption: النص الوصفي المرافق للصوت
المعالجة المسبقة
حمّل معالج Audio Flamingo للتعامل مع مدخلات الصوت والنص معًا:
>>> from transformers import AutoProcessor
>>> processor = AutoProcessor.from_pretrained("nvidia/audio-flamingo-3-hf")أنشئ مُجمِّع بيانات (data collator) يعالج أزواج الصوت والنص إلى الصيغة التي يتوقعها Audio Flamingo. يستخدم المُجمِّع قالب المحادثة (chat template) مع مصفوفات صوت مباشرة:
>>> 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
... )أنشئ مُجمِّع البيانات:
>>> data_collator = AudioFlamingo3DataCollator(processor)تدريب
إذا لم تكن على دراية بضبط نموذج باستخدام Trainer، فاطّلع على الدرس الأساسي هنا!
حمّل نموذج Audio Flamingo. نستخدم دقة bfloat16 وdevice_map="auto" لاستخدام ذاكرة فعّال:
>>> from transformers import AudioFlamingo3ForConditionalGeneration
>>> import torch
>>> model = AudioFlamingo3ForConditionalGeneration.from_pretrained(
... "nvidia/audio-flamingo-3-hf",
... torch_dtype=torch.bfloat16,
... device_map="auto",
... )إعداد LoRA
يتيح LoRA (Low-Rank Adaptation) ضبطًا دقيقًا فعالاً من خلال تدريب عدد صغير فقط من المعاملات الإضافية. قم بإعداد LoRA لاستهداف طبقات الانتباه وطبقات التغذية الأمامية في نموذج اللغة:
>>> 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 بشكل كبير من استهلاك الذاكرة ووقت التدريب من خلال تحديث عدد صغير من معاملات المُكيِّف (adapter) بدلاً من النموذج الكامل. يستهدف هذا الإعداد طبقات الانتباه وطبقات التغذية الأمامية في نموذج اللغة مع إبقاء مُشفِّر الصوت مجمّداً، مما يجعل من الممكن ضبط الدقة على وحدة معالجة رسومية واحدة.
إعداد التدريب
حدّد معاملات التدريب الفائقة في TrainingArguments. لاحظ أننا نستخدم max_steps بدلاً من عدد الدورات (epochs) لأننا نستخدم مجموعة بيانات متدفقة:
>>> 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",
... )مرّر حُجج التدريب إلى Trainer مع النموذج ومجموعات البيانات ومُجمِّع البيانات:
>>> trainer = Trainer(
... model=model,
... args=training_args,
... train_dataset=train_dataset,
... eval_dataset=eval_dataset,
... data_collator=data_collator,
... )
>>> trainer.train()احفظ مُكيّف LoRA والمعالج:
>>> trainer.save_model()
>>> processor.save_pretrained("audio-flamingo-3-hf-lora-finetuned")
['audio-flamingo-3-hf-lora-finetuned/processor_config.json']
بمجرد اكتمال التدريب، شارك نموذجك على الـ Hub:
>>> trainer.push_to_hub()الاستدلال
الآن بعد أن قمت بضبط النموذج، يمكنك استخدامه لتوصيف الصوت.
حمّل النموذج والمعالج المُحسَّنين:
>>> 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")تحميل عينة صوتية للاستدلال:
>>> 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"]جهّز المدخل بتنسيق محادثة:
>>> 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)توليد استجابة:
>>> 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 مع نموذج any-to-any. يستخدم المثال أدناه Voxtral، الذي يقبل مدخلات صوتية ونصية وينتج نصًا. راجع دليل مهمة any-to-any لمزيد من الأمثلة.
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"])قراءات إضافية
- يتناول صفحة مهمة النص والصوت إلى النص أنواع النماذج، وحالات الاستخدام، ومجموعات البيانات.
- توثيق PEFT لمزيد من خيارات تكوين LoRA وطرق المحوِّلات الأخرى.
- بطاقة نموذج Audio Flamingo 3 للحصول على تفاصيل وإمكانيات محددة للنموذج.