في هذا البرنامج التعليمي، ستستخدم نموذج الكلام مفتوح المصدر IBM® Granite® 3.3 لإنشاء نص بودكاست IBM “Mixture of Experts” على YouTube. ثم، باستخدام النموذج اللغوي الكبير مفتوح المصدرIBM Granite-3.3-8B-Instruct، ستستخرج ملخصًا للنص المُنشأ. سوف تشغل هذه التعليمات البرمجية على دفتر ملاحظات ®watsonx.ai.
التعرف التلقائي على الكلام (ASR)، المعروف أيضًا باسم التعرف على الكلام أو تحويل الكلام إلى نص، هو التقنية التي تحول اللغة المنطوقة إلى نص مكتوب. تُستخدم العديد من خوارزميات التعلم الآلي وتقنيات حوسبة الذكاء الاصطناعي لتحويل الكلام إلى نص. لقد تطورت تقنية التعرف على الكلام بشكل كبير منذ بداياتها في منتصف القرن العشرين وحتى اليوم.
في الستينيات، كانت الأصوات الطيفية تُستخدم في البداية لتحليل الكلام. في العقود اللاحقة، حدث تحول نحو النماذج الإحصائية. ظهرت نماذج ماركوف الخفية (HMMs) وأصبحت مهيمنة في مجال نمذجة تسلسل الوحدات الصوتية الصغيرة المعروفة باسم الصوتيات في علم اللغويات. تتألف بنية أنظمة التعرف التلقائي على الكلام من ثلاثة عناصر منفصلة: نموذج صوتي، ونموذج لغوي، وأداة فك تشفير.
بحلول عام 2010، بدأت التطورات في مجال التعلم العميق تؤثر في بنية أنظمة التعرف على الكلام التقليدية. قد تستخدم نماذج التشفير-فك التشفير بنية شبكة عصبية تكرارية (RNN) أو شبكة عصبية ترشيحية (CNN) حيث يعالج المشفر البيانات المدخلة وتولد أداة فك التشفير مخرجات بناءً على تمثيل المشفر. ويمكن تدريب النماذج على مجموعات بيانات كبيرة غير مصنفة من أزواج النصوص الصوتية؛ لتتعلم كيفية مطابقة الإشارات الصوتية مع التفريغات الصوتية. تتضمن نماذج التعرف التلقائي على الكلام الشهيرة DeepSpeech وWav2Vec.
في الوقت الحالي، يستخدم المساعدون الافتراضيون مثل Siri من Apple، وAlexa من Amazon، أو Cortana من Microsoft تقنية التعرف التلقائي على الكلام لمعالجة الكلام البشري في الوقت الفعلي. كما يمكنهم دمج تقنية تحويل الكلام إلى نص مع النماذج اللغوية الكبرى (LLMs) و معالجة اللغة الطبيعية (NLP). يمكن استخدام النماذج اللغوية الكبرى لإضافة السياق، وهو ما يمكن أن يساعد عندما تكون خيارات الكلمات أكثر غموضًا أو عند وجود تباين في أنماط الكلام البشري.
تحتاج إلى حساب على ®IBM Cloud لإنشاء مشروع ™watsonx.ai.
رغم توافر عدة أدوات للاختيار منها، يُرشدك هذا البرنامج التعليمي حول كيفية إعداد حساب IBM لاستخدام Jupyter Notebook.
1. سجِّل الدخول إلى watsonx.ai باستخدام حسابك على IBM Cloud.
أنشئ مشروع watsonx.ai.
أنشئ Jupyter Notebook.
تأكد من اختيار
أو يمكنك تنزيل هذا الدفتر على نظامك المحلي وتحميله إلى مشروع watsonx.ai كأصل. هذا البرنامج التعليمي متاح أيضًا على GitHub. لمشاهدة المزيد من البرامج التعليمية حول Granite، تفضَّل بزيارة مجتمع IBM Granite.
لدينا بعض الارتباطات بهذا البرنامج التعليمي. تأكَّد من استيراد الحزم التالية؛ وإذا لم تكن مثبَّتة، فيمكنك تثبيتها باستخدام أمر التثبيت السريع pip.
إذا تلقيت خطأ "محلل ارتباطات pip" متعلقًا بحزمة "caikit-nlp"، فيمكنك تجاهله في الوقت الحالي حيث من المفترض أن يستمر عمل بقية الدفتر بشكل طبيعي.
# Install required packages
! pip install -q peft torchaudio soundfile pytubefix pytube moviepy tqdm https://github.com/huggingface/transformers/archive/main.zip
# Required imports
import json
import os
from pytubefix import YouTube
from tqdm import tqdm
from moviepy.audio.io.AudioFileClip import AudioFileClip
import torch
import torchaudio
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
from huggingface_hub import hf_hub_download
في هذا البرنامج التعليمي، سنستخدم أحدث حلقة من بودكاست IBM "Mixture of Experts" بعنوان "الذكاء الاصطناعي على IBM z17، وLlama 4 من Meta، وGoogle Cloud Next 2025". يُعرض البودكاست على YouTube. سنُنشئ أولاً كائنًا
url = "https://www.youtube.com/watch?v=90fUR1PQgt4" #latest episode 37 minutes
# Create a YouTube object
yt = YouTube(url)
# Download only the audio stream from the video
video = yt.streams.filter(only_audio=True).first()
# Save the audio to a file
out_file = video.download()
# Get the base name and extension of the downloaded audio
base = os.path.splitext(out_file)[0]
سنحتاج إلى إجراء بعض التعديلات على الملف الصوتي الخاص بالبودكاست قبل أن نتمكن من استخدامه في استنتاج النماذج.
أولاً، نحتاج إلى تحويل ملف M4A إلى ملف WAV لاستخدامه مع نموذج الكلام من Granite. سوف نستخدم مكتبة moviepy لإجراء هذا التحويل. يمكننا استخدام المتغير الأساسي الذي عرّفناه سابقًا لإنشاء اسم الملف الجديد بالامتداد .wav.
# Load the M4A file
audio_clip = AudioFileClip(out_file)
# Write the audio to a WAV file
audio_clip.write_audiofile(base+".wav")
# Close the audio clip
audio_clip.close()
audio_path = base+".wav"
بعد ذلك، سنستخدم 'torchaudiodio.load()` لتحميل الملف الصوتي على هيئة موتر واستخراج معدل العينة.
سنحتاج أيضًا إلى تحويل الشكل الموجي الناتج من صوت الاستريو إلى صوت أحادي. ويمكننا فعل ذلك بأخذ متوسط قنوات صوت الاستريو باستخدام "torch.mean()".
#Resulting waveform and sample rate
waveform, sample_rate = torchaudio.load(audio_path, normalize=True)
# convert from stereo to mono
mono_waveform = torch.mean(waveform, dim=0, keepdim=True)
# confirm the waveform is mono
assert mono_waveform.shape[0] == 1 # mono
بعد ذلك، نحتاج إلى إعادة تشكيل الشكل الموجي الأحادي إلى معدل العينة في النموذج: 16 كيلو هرتز. يمكننا استخدام واجهة برمجة التطبيقات الخاصة بإعادة التشكيل في torchaudio لتحقيق ذلك.
# Resample the mono waveform to the model's sample rate
resample_transform = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)
resampled_waveform = resample_transform(mono_waveform)
وأخيرًا، يمكننا تقسيم الشكل الموجي المعاد تشكيله إلى أجزاء متساوية الحجم لدمجها في النموذج لتسهيل الاستنتاج.
سنستخدم 'torch.split()' لتقسيم الشكل الموجي المعاد تشكيله بالكامل إلى أجزاء من 30 ثانية ويكون حجم عينة كل جزء يساوي 30 ثانية * 16 كيلو هرتز. ستقدم لنا هذه الخطوة قائمة بالأشكال الموجية، "الأجزاء"، كل منها يحتوي على 30 ثانية من البيانات الصوتية. سندمج كل جزء في النموذج من أجل الاستنتاج.
# Define the desired chunk size
chunk_size_seconds = 30
chunk_size_samples = chunk_size_seconds * 16000
# Split the waveform into chunks of equal size
chunks = torch.split(resampled_waveform, chunk_size_samples, dim=1)
الآن يمكننا البدء في إنشاء نسخة من نموذج الكلام.
سنعيّن أولاً جهاز torch ليعمل على وحدة المعالجة المركزية. إذا كان الجهاز مضبوطًا على وحدة معالجة الرسومات، فقد تواجه أخطاء نفاد الذاكرة عند تشغيل هذا الدفتر، لكن يجب أن تعمل وحدة المعالجة المركزية بشكل جيد على دفتر watsonx.ai. يمكننا بعد ذلك إعداد المعالج والرمز الخاص بالنموذج.
device = 'cpu'
model_name = "ibm-granite/granite-speech-3.3-8b"
speech_granite_processor = AutoProcessor.from_pretrained(
model_name, trust_remote_code=True)
tokenizer = speech_granite_processor.tokenizer
في حال تشغيل دفتر ملاحظاتك على منصة watsonx.ai، قد تحتاج أيضًا إلى تشغيل التعليمات البرمجية التالية لتعديل ملف 'adapter_config.json' يدويًا. سيؤدي هذا إلى تجنب حدوث خطأ عند تحميل النموذج.
adapter_config_file = hf_hub_download(model_name, 'adapter_config.json')
#load the existing config file and print it
with open(adapter_config_file, 'r') as file:
data = json.load(file)
#remove key, value pairs in config file throwing error
keys_to_delete = ['layer_replication', 'loftq_config', 'megatron_config', 'megatron_core', 'use_dora', 'use_rslora']
for key in keys_to_delete:
if key in data:
del data[key]
# write the updated config file back to disk
with open(adapter_config_file, 'w') as file:
json.dump(data, file, indent=4)
with open(adapter_config_file, 'r') as file:
data = json.load(file)
رائع، الآن يمكننا أخيرًا تحميل النموذج! سنستخدم "AutoModelForSpeechSeq2Seq" من مكتبة "transformers" وطريقة "from_pretrained" لتحميل النموذج.
speech_granite = AutoModelForSpeechSeq2Seq.from_pretrained(model_name, trust_remote_code=True).to(device)
الآن بعد تحميل النموذج وتجهيز البيانات الصوتية، يمكننا استخدامه لتوليد نص من الكلام.
سوف نبدأ بإنشاء موجِّه للنموذج لتفريغ البيانات الصوتية. سنستخدم 'tokenizer.apply_chat_template()' لتحويل الموجِّه إلى تنسيق يمكن إدخاله في النموذج.
chat = [
{
"role": "system",
"content": "Knowledge Cutoff Date: April 2025.\nToday's Date: April 16, 2025.\nYou are Granite, developed by IBM. You are a helpful AI assistant",
},
{
"role": "user",
"content": "<|audio|>can you transcribe the speech into a written format?",
}
]
text = tokenizer.apply_chat_template(
chat, tokenize=False, add_generation_prompt=True
)
ثم، يمكننا إعداد قائمة فارغة 'generated_texts' لجمع النص المُنشَأ من كل جزء من المدخلات الصوتية.
لقد أعددنا حلقة "for" لعرض كل جزء صوتي وتمريره إلى النموذج من أجل التوليد. وعندئذٍ، سنتتبع أيضًا تقدم الحلقة باستخدام شريط تقدم "tqdm".
تُنشأ إدخالات النموذج من خلال 'speech_granite_processor' الذي أنشأناه سابقًا. يأخذ المعالج text وchunk كمدخلات ويعيد النسخة المعالجة من البيانات الصوتية ليستخدمها النموذج.
تُنتج مخرجات النموذج باستخدام طريقة "generate" من نموذج الكلام. وعندئذٍ، نستخدم 'tokenizer' لتحويل مخرجات النماذج إلى نص يمكن للبشر قراءته وتخزين تفريغات كل جزء في قائمة 'generated_texts'.
generated_texts = []
for chunk in tqdm(chunks, desc="Generating transcript..."):
model_inputs = speech_granite_processor(
text,
chunk,
device=device, # Computation device; returned tensors are put on CPU
return_tensors="pt",
).to(device)
# Generate
model_outputs = speech_granite.generate(
**model_inputs,
max_new_tokens=1000,
num_beams=1,
do_sample=False,
min_length=1,
top_p=1.0,
repetition_penalty=1.0,
length_penalty=1.0,
temperature=1.0,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id,)
num_input_tokens = model_inputs["input_ids"].shape[-1]
new_tokens = torch.unsqueeze(model_outputs[0, num_input_tokens:], dim=0)
output_text = tokenizer.batch_decode(
new_tokens, add_special_tokens=False, skip_special_tokens=True)[0]
generated_texts.append(output_text)
بما أن النسخ النصية للأجزاء هي حاليًا سلاسل فردية في قائمة، سنربط السلاسل معًا مع وجود مسافة بينها لتكوين نسخة نصية كاملة متماسكة.
full_transcript = " ".join(generated_texts)
الآن بعد أن حصلنا على نسخة نصية كاملة، سنستخدم النموذج نفسه لتلخيصها. يمكننا الوصول إلى نموذج Granite-3.3-8B-Instruct مباشرةً من Granite-speech-3.3-8b ببساطة عن طريق استدعائه عبر موجِّه نصي لا يحتوي على رمز '<|audio|>'.
سنجهز موجِّهًا جديدًا لتوجيه هذا النموذج إلى توليد ملخص للنسخة النصية كاملة. يمكننا استخدام "tokenizer.apply_chat_template()" مرة أخرى لتحويل الموجِّه من أجل استنتاج النموذج.
conv = [{"role": "user",
"content": f"Compose a single, unified summary of the following transcript. Your response should only include the unified summary. Do not provide any further explanation. Transcript:{full_transcript}"}]
text = tokenizer.apply_chat_template(conv, tokenize=False, add_generation_prompt=True)
سنستخدم 'speech_granite_processor' مرة أخرى لإنشاء إدخالات النموذج، لكننا لن نمرر أي ملف صوتي هذه المرة.
model_inputs = speech_granite_processor(
text,
device=device, # Computation device; returned tensors are put on CPU
return_tensors="pt",
).to(device)
سنتلقى الإخراج من “speech_granite.generate()' على شكل موتر. يمكننا تحويل هذا الإخراج إلى نص باستخدام "tokenizer.decode()". واطبع ملخصنا النهائي!
output = speech_granite.generate(
**model_inputs,
max_new_tokens= 2000, # concise summary
)
summary = tokenizer.decode(output[0, model_inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(summary)
النتيجة:
In the 50th episode of Mixture of Experts, the panel discusses various AI-related topics.
Kate Soule, Director of Technical Product Management at Granite, estimates that 90% of enterprise data is unstructured.
Hilary Hunter, IBM Fellow and CTO of IBM Infrastructure, introduces IBM's new mainframe launch, IBM z, emphasizing its zero downtime and eight nines of reliability, crucial for global financial transactions.
The conversation also touches on Meta's Llama 4 release, featuring three models: Scout (100 billion parameters), Maverick (200 billion parameters), and Behemoth (two trillion parameters). The panelists discuss the implications of these models, particularly the mixture of experts architecture, and its potential to become more community-driven.
Shobhit Varshney Head of Data and AI for the Americas, shares insights on handling unstructured data in enterprises, advocating for bringing AI close to transaction data for low-latency, mission-critical applications.
The episode concludes with a brief overview of Google Cloud Next, highlighting advancements in AI models, on-premises AI capabilities, and Google's focus on AI for media creation and agent-to-agent communication.
The panel also references a Pew Research report on American perceptions of AI, noting discrepancies between experts' optimism and the general public's concerns about job impacts from AI.
في هذا البرنامج التعليمي، حملت ملفًا صوتيًا باللغة الإنجليزية من YouTube. وحولت الملف الصوتي ليستخدمه نموذج الكلام في Granite، وأنتجت نسخة نصية كاملة للمقطع الصوتي، واستخدمت نموذج تعليمات Granite لإنشاء ملخص للنسخة النصية.
يمكنك بسهولة تصميم مساعدي ووكلاء الذكاء الاصطناعي القابلين للتوسع وأتمتة المهام المتكررة وتبسيط العمليات المعقدة باستخدام IBM watsonx Orchestrate.
تسريع قيمة الأعمال باستخدام مجموعة قوية ومرنة من مكتبات وخدمات وتطبيقات الذكاء الاصطناعي.
أعدّ ابتكار عمليات ومهام سير العمل الحساسة بإضافة الذكاء الاصطناعي لتعزيز التجارب وصنع القرارات في الوقت الفعلي والقيمة التجارية.