SevenTnewS

دروس تعليمية في الذكاء الاصطناعي

أنشئ مساعدك الصوتي الأول باستخدام OpenAI وPython: دليل مطور

دليل عملي بلغة Python لبناء مساعد صوتي باستخدام واجهات برمجة تطبيقات Whisper وChatGPT وتحويل النص إلى كلام من OpenAI: تسجيل الصوت، النسخ، توليد رد مناسب للمخاطبة الصوتية، وتحويله مرة أخرى إلى صوت.

Emmanuel Fabrice Omgbwa Yasse

2026-07-15 · قراءة 3 دقائق

أنشئ مساعدك الصوتي الأول باستخدام OpenAI وPython: دليل مطور

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

ما ستحتاج إليه

  • Python 3.9 أو أحدث مثبتًا
  • مفتاح API من OpenAI مع تفعيل الفوترة (يستخدم هذا المشروع ثلاث نقاط نهاية منفصلة، كل منها مفوتر حسب الاستخدام)
  • ميكروفون، وطريقة لتشغيل الصوت من جهازك

الخطوة 1: تهيئة البيئة

أنشئ مجلد المشروع وقم بتثبيت الحزم المطلوبة:

pip install openai sounddevice scipy python-dotenv

قم بتخزين مفتاح API الخاص بك في ملف .env بدلاً من تضمينه بشكل ثابت في السكربت، وهذا الأمر أكثر أهمية مما يبدو: مفاتيح API المضمنة في الكود تنتهي بالتسرب في مستودعات git أكثر مما يتوقع المطورون.

OPENAI_API_KEY=your-key-here

الخطوة 2: تسجيل ونسخ الصوت باستخدام Whisper

تلتقط خطوة التسجيل بضع ثوانٍ من إدخال الميكروفون وتحفظه كملف WAV، يُرسل بعد ذلك إلى نقطة نهاية Whisper للنسخ:

import sounddevice as sd, scipy.io.wavfile as wav, os
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI()

def record_audio(filename="input.wav", duration=5, fs=44100):
    print("Recording...")
    audio = sd.rec(int(duration * fs), samplerate=fs, channels=1)
    sd.wait()
    wav.write(filename, fs, audio)

def transcribe(filename="input.wav"):
    with open(filename, "rb") as f:
        result = client.audio.transcriptions.create(model="whisper-1", file=f)
    return result.text

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

الخطوة 3: إرسال النص المنسوخ إلى ChatGPT

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

def get_response(user_text):
    completion = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "You are a voice assistant. Keep answers under 3 sentences, conversational, no markdown."},
            {"role": "user", "content": user_text}
        ]
    )
    return completion.choices[0].message.content

توجيه "no markdown" مهم هنا تحديدًا لأن قائمة نقطية لا معنى لها عند قراءتها بصوت عالٍ، هذه حالة يجب أن يأخذ فيها الموجه في الاعتبار وسيلة الإخراج، وليس المحتوى فقط.

الخطوة 4: تحويل الرد إلى كلام

نقطة نهاية تحويل النص إلى كلام من OpenAI تأخذ نص الرد وتعيد الصوت مباشرة:

def speak(text, filename="output.mp3"):
    response = client.audio.speech.create(model="tts-1", voice="alloy", input=text)
    response.stream_to_file(filename)
    os.system(f"start {filename}" if os.name == "nt" else f"afplay {filename}")

يقبل الوسيط voice عدة خيارات مسبقة: alloy، echo، fable، onyx، nova، وshimmer، لكل منها نغمة مميزة. جرب عدة خيارات حسب حالتك الاستخدامية؛ مساعد موجه للعملاء وأداة تدوين ملاحظات شخصية لا يحتاجان نفس الصوت.

الخطوة 5: الربط معًا

if __name__ == "__main__":
    record_audio()
    text = transcribe()
    print(f"You said: {text}")
    reply = get_response(text)
    print(f"Assistant: {reply}")
    speak(reply)

قم بتشغيل السكربت، وتحدث بسؤال عندما يُطلب منك ذلك، وتكتمل الحلقة الكاملة، التسجيل، النسخ، الرد، التحدث، في بضع ثوانٍ.

أين يحدث الخلل، وكيف تصلحه

المشكلة الأكثر شيوعًا هي الصوت المقتطع: إذا انتهت النافذة الثابتة البالغة 5 ثوانٍ قبل أن تنتهي من التحدث، سيكون النص المنسوخ غير مكتمل وسيجيب الرد عن السؤال الخطأ. زيادة المدة هو الإصلاح السريع؛ إضافة مكتبة كشف نشاط الصوت مثل webrtcvad هو الإصلاح الصحيح. زمن الاستجابة هو القيد الآخر الذي يستحق التخطيط له: ثلاثة استدعاءات متسلسلة لواجهة برمجة التطبيقات تضيف عادة من 2 إلى 4 ثوانٍ من زمن الرحلة ذهابًا وإيابًا، وهو ملحوظ لكنه مقبول عادةً لأداة شخصية، وأقل من ذلك لأي شيء يُقصد به أن يكون في الوقت الفعلي حقًا.