تحويل النص إلى صوت (TTS) والصوت إلى نص (Whisper): بناء مساعد صوتي متكامل

دقائق القراءة: 6

تحويل النص إلى صوت TTS والصوت إلى نص Whisper: بناء مساعد صوتي متكامل

بناء مساعد صوتي حديث لم يعد مجرد ربط ميكروفون بموديل ذكاء اصطناعي، بل هو خط أنابيب هندسي كامل يبدأ من التقاط الإشارة الصوتية، ثم تحويلها إلى نص، ثم تمرير النص إلى نموذج لغوي، وأخيراً إعادة الجواب على شكل صوت طبيعي. هذا النوع من الأنظمة يجمع بين طبقات Speech I/O وطبقة الفهم اللغوي عبر نماذج اللغة الكبيرة، مع إدارة دقيقة للتأخير Latency وجودة المخرجات وتجربة الاستخدام.

عملياً، يتكون المساعد الصوتي من أربع مراحل مترابطة: التقاط صوت المستخدم، ثم التفريغ النصي عبر Whisper أو أي محرك ASR، ثم تمرير النص إلى LLM لمعالجة الطلب، ثم تحويل الرد إلى كلام عبر Text-to-Speech. وإذا أردت توسيع النظام لاحقاً بذاكرة محادثة أو استرجاع معرفي، فيمكن دمجه مع LangChain أو معمارية RAG بسهولة.

المعمارية الهندسية للمساعد الصوتي

أفضل طريقة لفهم المشروع هي النظر إليه كمعمارية تدفق بيانات Pipeline Architecture. كل طبقة تستقبل مدخلاً محدداً وتنتج مخرجاً منظماً للطبقة التالية. هذا الفصل يقلل التعقيد، ويسهّل الاختبار، ويمنحك القدرة على استبدال أي مكوّن دون كسر النظام بالكامل.

تدفق البيانات من الميكروفون حتى الرد الصوتي

  • التقاط الصوت من الميكروفون أو ملف WAV/MP3.
  • إجراء معالجة أولية مثل إزالة الضجيج أو توحيد معدل العينة Sample Rate.
  • إرسال الملف إلى نموذج Whisper لاستخراج النص.
  • تمرير النص إلى نموذج محادثة بعد تطبيق قواعد هندسة الأوامر.
  • توليد إجابة نصية، ويمكن ضبط إبداعها عبر Temperature.
  • إرسال الجواب النصي إلى محرك TTS للحصول على ملف صوتي.
  • تشغيل الصوت للمستخدم أو تخزينه في الواجهة الأمامية داخل ووردبريس أو تطبيق ويب.

هذا الفصل بين المراحل ضروري أيضاً عند مراقبة الأداء. فإذا لاحظت بطئاً عاماً، يمكنك تحديد ما إذا كان السبب في التفريغ الصوتي، أو في زمن استجابة LLM، أو في توليد الصوت النهائي.

تهيئة البيئة البرمجية

قبل البدء، احرص على إعداد بيئة نظيفة كما شرحنا في إعداد بيئة العمل الذكية، ثم احصل على المفاتيح البرمجية وفق الخطوات الموجودة في جلب مفاتيح API. في مشروعنا سنستخدم مكتبة openai مع python-dotenv لإدارة المتغيرات السرية.

pip install openai python-dotenv sounddevice scipy
from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

تنفيذ مرحلة الصوت إلى نص باستخدام Whisper

نموذج Whisper يبرع في التعرف على الكلام متعدد اللغات، مع قدرة جيدة على التعامل مع اللهجات والضوضاء النسبية. هندسياً، هو يحول الإشارة الصوتية إلى تمثيل رقمي، ثم يمررها إلى طبقات تعلم عميق تستنتج التسلسل النصي الأقرب لما قيل. هذه العملية تشبه من ناحية المبدأ تحويل المدخلات الخام إلى تمثيل مفهوم للنموذج، تماماً كما تفعل Embeddings مع النصوص، لكن على مستوى الصوت.

audio_file = open("user_question.wav", "rb")

transcription = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file
)

user_text = transcription.text
print(user_text)

عند هذه النقطة صار لدينا نص قابل للمعالجة من قبل أي طبقة ذكاء اصطناعي لاحقة. إذا كنت تبني تطبيق دعم فني أو بحث داخلي، يمكنك إرسال هذا النص إلى نظام Retriever لاستحضار المعرفة ذات الصلة قبل التوليد.

تمرير النص إلى النموذج اللغوي

بعد الحصول على النص، نحتاج إلى توليد استجابة ذكية ومضبوطة. هنا تظهر أهمية تصميم Prompt واضح يحدد نبرة الإجابة وطولها وحدودها. في الأنظمة الصوتية، من الأفضل أن تكون الردود مختصرة نسبياً لأن المستخدم يستمع ولا يقرأ، وبالتالي الإطالة قد تضعف التجربة.

أنت مساعد صوتي عربي احترافي. أجب بإيجاز ووضوح، واستخدم لغة طبيعية سهلة السماع. إذا كان السؤال تقنياً، قدّم الخطوات على شكل نقاط ذهنية مرتبة، وتجنب المصطلحات المعقدة دون شرح سريع.

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "أنت مساعد صوتي عربي احترافي. أجب بإيجاز ووضوح."},
        {"role": "user", "content": user_text}
    ],
    temperature=0.4
)

assistant_text = response.choices[0].message.content
print(assistant_text)

وإذا احتجت إلى سلاسل أكثر تنظيماً أو ذاكرة محادثة طويلة، فراجع إنشاء أول Chain ومفهوم الذاكرة في الذكاء الاصطناعي، لأن المساعد الصوتي الحقيقي غالباً يحتاج تذكّر آخر التعليمات أو آخر سؤالين على الأقل.

تنفيذ مرحلة تحويل النص إلى صوت TTS

الخطوة الأخيرة هي جعل النظام يتكلم. في طبقة TTS يتحول النص إلى موجة صوتية اصطناعية تحاول محاكاة النبرة البشرية. جودة هذه الطبقة تؤثر مباشرة على الإحساس بالاحتراف؛ لأن الرد الجيد إذا خرج بصوت آلي جاف سيفقد جزءاً كبيراً من قيمته.

speech_file_path = "assistant_reply.mp3"

with client.audio.speech.with_streaming_response.create(
    model="gpt-4o-mini-tts",
    voice="alloy",
    input=assistant_text
) as response:
    response.stream_to_file(speech_file_path)

print(f"Saved to {speech_file_path}")

يمكنك لاحقاً تشغيل الملف في الواجهة أو إرساله مباشرة إلى المتصفح. وعند الحاجة إلى تجربة تفاعلية أكثر سلاسة، يمكن الاستفادة من مفهوم Streaming Responses لتقليل الإحساس بالانتظار، خصوصاً إذا كان الرد طويلاً.

بناء سكربت متكامل للمساعد الصوتي

الميزة الهندسية الحقيقية تظهر عند دمج المراحل كلها داخل وظيفة تشغيل واحدة. بهذه الطريقة يصبح لديك نموذج أولي Prototype جاهز للتطوير نحو تطبيق ويب أو بوت داخلي.

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def transcribe_audio(file_path: str) -> str:
    with open(file_path, "rb") as audio_file:
        transcription = client.audio.transcriptions.create(
            model="whisper-1",
            file=audio_file
        )
    return transcription.text

def generate_reply(user_text: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "أنت مساعد صوتي عربي محترف. أجب بوضوح وباختصار."},
            {"role": "user", "content": user_text}
        ],
        temperature=0.4
    )
    return response.choices[0].message.content

def text_to_speech(text: str, output_file: str) -> None:
    with client.audio.speech.with_streaming_response.create(
        model="gpt-4o-mini-tts",
        voice="alloy",
        input=text
    ) as response:
        response.stream_to_file(output_file)

def run_voice_assistant(input_audio: str, output_audio: str) -> None:
    user_text = transcribe_audio(input_audio)
    print("User:", user_text)

    assistant_text = generate_reply(user_text)
    print("Assistant:", assistant_text)

    text_to_speech(assistant_text, output_audio)
    print("Audio reply generated successfully.")

run_voice_assistant("user_question.wav", "assistant_reply.mp3")

اعتبارات هندسية متقدمة لتحسين الجودة

تقليل التأخير وتحسين التجربة

  • استخدم تسجيلات قصيرة بدلاً من ملفات طويلة لتقليل زمن التفريغ.
  • اضبط التعليمات ليكون الرد الصوتي مختصراً ومباشراً.
  • راقب استهلاك الرموز عبر إدارة Tokens خاصة إذا كان النظام يعمل على نطاق كبير.
  • أضف طبقة تخزين مؤقت Cache للردود المتكررة.

دمج المعرفة الخارجية

إذا كان المساعد الصوتي موجهاً لخدمة العملاء أو الوثائق الداخلية، فلا يكفي الاعتماد على النموذج العام. الأفضل هو توصيله بمخزن معرفي عبر Vector Database مثل ChromaDB، ثم بناء تدفق دمج السياق المسترجع مع النموذج لكي يجيب بدقة أعلى وبهلوسة أقل.

إخراج منظم للتكامل مع التطبيقات

في بعض السيناريوهات تحتاج أن يرجع النظام نصاً وصيغة بنيوية معاً، مثل نية المستخدم ودرجة الثقة والخطوة التالية. هنا يفيدك أسلوب إجبار النموذج على إخراج JSON لربط المساعد الصوتي مع أنظمة تنفيذ أو Agents.

خلاصة هندسية

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *