How-To Guides

بناء روبوت محادثة ذكاء اصطناعي مدعوم بالصوت: دمج Whisper وTTS مع LangChain

تتصدر الواجهات النصية المشهد الحالي لتطبيقات الذكاء الاصطناعي، لكن مستقبل تفاعل الإنسان مع الحاسوب يكمن في المحادثات الصوتية الطبيعية والسلسة. من خلال دمج Whisper من OpenAI لتحويل الصوت إلى نص (STT) بدقة عالية، وLangChain لتنسيق منطق نماذج اللغة الكبيرة (LLM)، ومحرك تحويل النص إلى كلام (TTS)، يمكننا إنشاء روبوتات محادثة تبدو حيةً حقًا. يشرح هذا الدليل البنية المعمارية وتنفيذ مثل هذا النظام، مع التركيز على تحسين زمن الاستجابة والتكامل الموثوق.

فهم البنية المعمارية

قبل الغوص في الأكواد، من الضروري فهم تدفق البيانات. يتبع روبوت المحادثة المدعوم بالصوت عادةً خط أنابيب من أربع مراحل:

  1. التقاط الصوت: تسجيل مدخلات المستخدم من ميكروفون أو ملف صوتي.
  2. النسخ (Transcription): تحويل البايتات الصوتية الخام إلى نص باستخدام Whisper.
  3. الاستدلال: معالجة النص عبر LangChain لتوليد ردود واعية بالسياق.
  4. التوليف (Synthesis): تحويل النص المولّد مرة أخرى إلى صوت باستخدام خدمة TTS.

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

إعداد البيئة

تأكد من تثبيت Python 3.9 أو أحدث. ثبّت المكتبات اللازمة عبر pip:


pip install openai-whisper langchain langchain-openai gtts soundfile

ملاحظة: بينما يُستخدم gtts (Google Text-to-Speech) هنا من أجل البساطة والاستخدام المجاني، قد تفضل تطبيقات الإنتاج استخدام OpenAI TTS أو خدمات Azure Speech للحصول على دقة أعلى.

التنفيذ: خط الأنابيب الأساسي

فيما يلي مثال مختصر يوضح عملية الدمج. في بيئة الإنتاج، ستقوم بتغليف هذه الخطوات في إطار غير متزامن (Asynchronous) مثل FastAPI للتعامل مع عدة مستخدمين بشكل متزامن.


import whisper
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
import gtts
import io

# Load the Whisper model once for efficiency
model = whisper.load_model("base")

# Initialize LangChain LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)

def transcribe_audio(audio_file_path: str) -> str:
    """
    Uses Whisper to convert audio file to text.
    """
    result = model.transcribe(audio_file_path)
    return result['text'].strip()

def generate_response(user_input: str, chat_history: list) -> str:
    """
    Sends the transcribed text and history to the LLM.
    """
    system_prompt = "You are a helpful voice assistant. Keep your responses concise and conversational."
    
    messages = [
        SystemMessage(content=system_prompt),
        *chat_history,
        HumanMessage(content=user_input)
    ]
    
    response = llm.invoke(messages)
    return response.content

def synthesize_speech(text: str, output_file_path: str) -> None:
    """
    Converts text to MP3 using gTTS.
    """
    tts = gtts.TTS(text=text, lang='en')
    tts.save(output_file_path)

# Main Execution Flow
if __name__ == "__main__":
    # Simulate audio input (in reality, this comes from a microphone stream)
    audio_path = "user_input.wav"
    
    # 1. Transcribe
    print("Processing audio...")
    text_input = transcribe_audio(audio_path)
    print(f"User said: {text_input}")

    if not text_input:
        print("No speech detected.")
        exit()

    # 2. Generate Response
    print("Thinking...")
    chat_history = [] # In a real app, this would be persisted
    bot_response = generate_response(text_input, chat_history)
    print(f"Bot says: {bot_response}")

    # 3. Synthesize
    print("Generating audio...")
    output_path = "bot_response.mp3"
    synthesize_speech(bot_response, output_path)
    print(f"Audio saved to {output_path}")

تحسينات للإنتاج

لجعل هذا النظام قابلاً للتطبيق للتفاعل الفوري، خذ في الاعتبار هذه التقنيات المتقدمة:

1. بث Whisper

يعالج Whisper القياسي ملف الصوت بأكمله. للمحادثات الحية، تحتاج إلى معالجة مقسمة (Chunked processing). تتيح لك مكتبات مثل whisper-streaming أو استخدام تدفقات الصوت WebRTC نسخ الصوت أثناء نطقه، مما يقلل بشكل كبير من الوقت حتى ظهور أول رمز (TTFT).

2. التخزين المؤقت وإدارة السياق

نماذج اللغة الكبيرة مكلفة. قم بتنفيذ قاعدة بيانات متجهية (Vector Database) عبر LangChain لاسترجاع السياق ذي الصلة فقط عند الحاجة، بدلاً من إرسال سجل المحادثة بأكمله في كل مرة. استخدم Redis للذاكرة قصيرة المدى للجلسات للحفاظ على سرعة الأدوار الأخيرة.

3. تحسين تنسيق الصوت

قم دائمًا بتطبيع مدخلات الصوت الخاصة بك إلى 16kHz أحادي القناة (Mono) قبل تمريرها إلى Whisper. يقلل هذا التنسيق القياسي من وقت المعالجة المسبقة ويضمن دقة نسخ ثابتة عبر الميكروفونات المختلفة.

معالجة الحالات الحدية

تواجه الواجهات الصوتية تحديات فريدة مقارنة بالنص:

  • الضوضاء الخلفية: Whisper قوي، لكن البيئات شديدة الضوضاء يمكن أن تسبب هلاوس (Hallucinations). قم بتنفيذ كاشف نشاط صوتي (VAD) مثل Silero VAD لتصفية الفترات الصامتة قبل النسخ.
  • معالجة المقاطعة: إذا تحدث المستخدم بينما يقوم الروبوت بتشغيل TTS، فأنت بحاجة إلى آلية "Barge-in". يتطلب هذا مراقبة صوتية فورية يمكنها إيقاف تشغيل TTS فورًا.
  • تصحيح الأخطاء: إذا كانت ثقة النسخ منخفضة، يجب أن يطلب نموذج اللغة الكبيرة توضيحًا بدلاً من التخمين. يمكنك تمرير درجة الثقة من Whisper إلى سياق الموجه (Prompt).

الخلاصة

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

Share: