بناء مساعد افتراضي متطور قائم على الصوت باستخدام مكتبات Hugging Face

يقدم هذا المقال شرحًا تفصيليًا لكيفية بناء مساعد افتراضي متطور قائم على الصوت، وذلك باستخدام نماذج Hugging Face المجانية، بطريقة مبسطة تعمل بسلاسة على Google Colab. سنقوم بدمج ثلاث مكتبات رئيسية: Whisper للتعرف على الكلام، و FLAN-T5 للاستدلال على اللغة الطبيعية، و Bark لتحويل النص إلى كلام، كلها متصلة عبر أنابيب Transformers. بهذه الطريقة، نتجنب الاعتماد على مكتبات معقدة أو مفاتيح API أو إعدادات مُعقدة، ونركز على إظهار كيفية تحويل إدخال الصوت إلى محادثة ذات معنى والحصول على ردود صوتية طبيعية في الوقت الفعلي.

1. تثبيت المكتبات وتحميل النماذج

نقوم أولاً بتثبيت المكتبات اللازمة وتحميل أنابيب Hugging Face الثلاثة: Whisper لتحويل الصوت إلى نص، و FLAN-T5 لتوليد الردود، و Bark لتحويل النص إلى كلام. يُحدد النظام تلقائيًا ما إذا كان سيتم استخدام وحدة معالجة الرسومات (GPU) إن وجدت.

pip -q install "transformers>=4.42.0" accelerate torchaudio sentencepiece gradio soundfile
import os, torch, tempfile, numpy as np
import gradio as gr
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM

DEVICE = 0 if torch.cuda.is_available() else -1
asr = pipeline(
    "automatic-speech-recognition",
    model="openai/whisper-small.en",
    device=DEVICE,
    chunk_length_s=30,
    return_timestamps=False
)
LLM_MODEL = "google/flan-t5-base"
tok = AutoTokenizer.from_pretrained(LLM_MODEL)
llm = AutoModelForSeq2SeqLM.from_pretrained(LLM_MODEL, device_map="auto")
tts = pipeline("text-to-speech", model="suno/bark-small")

2. تعريف المُطالبات وتنسيق الحوار

نقوم بتعريف مُطالبة للنظام توجه المساعد للبقاء مُوجزًا ومنظمًا، ونُنفذ دالة format_dialog التي تأخذ سجل المحادثة السابقة بالإضافة إلى إدخال المستخدم، وتُنشئ سلسلة مُطالبة للنموذج لتوليد رد المساعد.

SYSTEM_PROMPT = (
    "You are a helpful, concise voice assistant. "
    "Prefer direct, structured answers. "
    "If the user asks for steps or code, use short bullet points."
)

def format_dialog(history, user_text):
    turns = []
    for u, a in history:
        if u:
            turns.append(f"User: {u}")
        if a:
            turns.append(f"Assistant: {a}")
    turns.append(f"User: {user_text}")
    prompt = (
        "Instruction:n"
        f"{SYSTEM_PROMPT}nn"
        "Dialog so far:n"
        + "n".join(turns) + "nn"
        "Assistant:"
    )
    return prompt

3. وظائف أساسية للمساعد الافتراضي

نقوم بإنشاء ثلاث وظائف أساسية لمساعدنا الصوتي:

  • transcribe: لتحويل الصوت المسجل إلى نص باستخدام Whisper.
  • generate_reply: لبناء ردود مُدركة للسياق من FLAN-T5.
  • synthesize_speech: لتحويل الرد إلى صوت مُتكلم باستخدام Bark.
def transcribe(filepath):
    out = asr(filepath)
    text = out["text"].strip()
    return text

def generate_reply(history, user_text, max_new_tokens=256):
    prompt = format_dialog(history, user_text)
    inputs = tok(prompt, return_tensors="pt", truncation=True).to(llm.device)
    with torch.no_grad():
        ids = llm.generate(
            **inputs,
            max_new_tokens=max_new_tokens,
            temperature=0.7,
            do_sample=True,
            top_p=0.9,
            repetition_penalty=1.05,
        )
        reply = tok.decode(ids[0], skip_special_tokens=True).strip()
        return reply

def synthesize_speech(text):
    out = tts(text)
    audio = out["audio"]
    sr = out["sampling_rate"]
    audio = np.asarray(audio, dtype=np.float32)
    return (sr, audio)

4. وظائف تفاعلية واجهة المستخدم

نضيف وظائف تفاعلية لمساعدنا:

  • clear_history: لإعادة تعيين المحادثة.
  • voice_to_voice: للتعامل مع إدخال الصوت وإرجاع رد صوتي.
  • text_to_voice: للتعامل مع إدخال النص وتحويله إلى صوت.
  • export_chat: لحفظ الحوار كاملاً في ملف نصي قابل للتنزيل.
# ... (وظائف clear_history, voice_to_voice, text_to_voice, export_chat  كما هي في النص الأصلي) ...

5. واجهة المستخدم الرسومية (GUI) باستخدام Gradio

نقوم ببناء واجهة مستخدم رسومية أنيقة باستخدام Gradio، تتيح لنا التحدث أو الكتابة ثم سماع رد المساعد. نقوم بربط الأزرار بالوظائف، والحفاظ على حالة المحادثة، وبث النتائج في محادثة نصية، ونص، ومشغل صوت، كل ذلك يتم تشغيله في تطبيق Colab واحد.

# ... (كود واجهة المستخدم الرسومية كما هو في النص الأصلي) ...

6. الخاتمة

يُظهر هذا المثال كيف تُمكننا أنابيب Hugging Face بسلاسة من إنشاء مساعد محادثة مدعوم بالصوت يستمع، يفكر، ويرد. لدينا الآن عرضًا توضيحيًا يعمل على التقاط الصوت، وكتابته، وتوليد ردود ذكية، وإرجاع مخرجات صوتية، كل ذلك داخل Colab. بناءً على هذا الأساس، يمكننا تجربة نماذج أكبر، إضافة دعم متعدد اللغات، أو حتى توسيع النظام بمنطق مخصص. لكن الفكرة الأساسية تبقى كما هي: يمكننا الجمع بين التعرف على الكلام، والاستدلال على اللغة الطبيعية، وتحويل النص إلى كلام في تدفق عمل سلس لتجربة تفاعلية للذكاء الاصطناعي الصوتي.

المصدر: MarkTechPost