0Pricing
AI Agents · درس

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

خطوط أنابيب متكاملة من البداية إلى النهاية: تحويل الكلام إلى نص ← الاستدلال ← الرد الصوتي.

سير عمل الوكلاء للصوت + النص درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

نظرة عامة على مسار عمل وكيل الصوت والنص

يحوّل مسار عمل وكيل الصوت والنص بين العالمين المنطوق والمكتوب. والتدفق الأساسي هو: صوت وارد ← نسخ باستخدام Whisper ← وكيل نصي ← صوت صادر باستخدام TTS. ويتيح ذلك المساعدات الصوتية، وتحليل المكالمات، وتلخيص الاجتماعات، والواجهات التي تعمل دون استخدام اليدين.

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

يقبل OpenAI Whisper التنسيقات التالية: mp3 وmp4 وmpeg وmpga وm4a وwav وwebm. الحد الأقصى لحجم الملف هو 25 ميغابايت. بالنسبة إلى الملفات الأكبر، يجب تقسيم الصوت أو ضغطه قبل إرساله.

احرص دائمًا على التسجيل أو التحويل إلى صوت أحادي القناة بتردد 16 كيلوهرتز للحصول على أفضل جودة تفريغ وأصغر حجم للملف.

import os

SUPPORTED_FORMATS = {'.mp3', '.mp4', '.mpeg', '.mpga', '.m4a', '.wav', '.webm'}
MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024  # 25 MB

def validate_audio_file(path: str) -> dict:
    ext = os.path.splitext(path)[1].lower()
    size = os.path.getsize(path) if os.path.exists(path) else 0
    return {
        'path': path,
        'format_ok': ext in SUPPORTED_FORMATS,
        'size_ok': size <= MAX_FILE_SIZE_BYTES,
        'size_mb': round(size / 1024 / 1024, 2),
        'extension': ext
    }

# Usage:
info = validate_audio_file('meeting.wav')
print(info)

تفريغ الصوت باستخدام Whisper

تغلّف نقطة النهاية audio.transcriptions.create في OpenAI تقنية Whisper. مرّر كائن الملف واسم النموذج، ويمكنك اختياريًا تمرير تلميح للغة (لتسريع العملية وتجنب اكتشاف اللغة بشكل خاطئ) وتعليمة prompt (لتهيئة المفردات الخاصة بالمجال).

from openai import OpenAI

client = OpenAI(api_key='YOUR_OPENAI_API_KEY')

def transcribe_audio(
    audio_path: str,
    language: str = 'en',
    prompt: str = ''
) -> str:
    with open(audio_path, 'rb') as audio_file:
        transcript = client.audio.transcriptions.create(
            model='whisper-1',
            file=audio_file,
            language=language,
            prompt=prompt,  # e.g. 'Python, NestJS, TypeScript, API'
            response_format='text'
        )
    return transcript

text = transcribe_audio('user_query.mp3', language='en',
                        prompt='Kubernetes, microservices, Docker')
print('Transcription:', text)

التفريغ الصوتي مع الطوابع الزمنية

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

def transcribe_with_timestamps(audio_path: str) -> dict:
    from openai import OpenAI
    client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
    with open(audio_path, 'rb') as f:
        result = client.audio.transcriptions.create(
            model='whisper-1',
            file=f,
            response_format='verbose_json',
            timestamp_granularities=['segment']
        )
    # result.segments: list of {start, end, text}
    segments = [
        {'start': s.start, 'end': s.end, 'text': s.text}
        for s in result.segments
    ]
    return {'full_text': result.text, 'segments': segments}

# Example output structure:
# {'full_text': 'Hello team...', 'segments': [{'start': 0.0, 'end': 2.3, 'text': 'Hello team'}]}

معالجة الوكيل للنص

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

import anthropic

VOICE_AGENT_SYSTEM = (
    'You are a helpful voice assistant. The user\'s message was transcribed from speech '
    'and may contain filler words ("um", "uh"), false starts, or incomplete sentences. '
    'Interpret the intent charitably and respond concisely in 1-3 sentences. '
    'Your response will be converted to speech, so avoid markdown, lists, or code blocks.'
)

def voice_agent_respond(transcription: str) -> str:
    client = anthropic.Anthropic(api_key='YOUR_ANTHROPIC_API_KEY')
    response = client.messages.create(
        model='claude-opus-4-5',
        max_tokens=256,
        system=VOICE_AGENT_SYSTEM,
        messages=[{'role': 'user', 'content': transcription}]
    )
    return response.content[0].text

تحويل النص إلى كلام باستخدام OpenAI TTS

حوّل الاستجابة النصية للوكيل مرة أخرى إلى كلام باستخدام واجهة OpenAI البرمجية لـ TTS. اختر صوتًا (alloy وecho وfable وonyx وnova وshimmer) ونموذجًا (tts-1 للسرعة وtts-1-hd للجودة). احفظ النتيجة كملف mp3 أو بثّها مباشرةً.

from openai import OpenAI
from pathlib import Path

client = OpenAI(api_key='YOUR_OPENAI_API_KEY')

def text_to_speech(
    text: str,
    output_path: str = 'response.mp3',
    voice: str = 'nova',
    model: str = 'tts-1'
) -> str:
    response = client.audio.speech.create(
        model=model,
        voice=voice,
        input=text,
        response_format='mp3'
    )
    Path(output_path).write_bytes(response.content)
    print(f'TTS audio saved to {output_path}')
    return output_path

# Full pipeline:
tts_file = text_to_speech(
    'The weather in London is currently 15 degrees and partly cloudy.',
    voice='nova'
)

بث الإخراج الصوتي

بالنسبة إلى الاستجابات الصوتية في الزمن الحقيقي، ابث صوت TTS على شكل أجزاء بدلًا من انتظار اكتمال الملف بأكمله. يتيح لك مساعد OpenAI stream_to_file أو التكرار اليدوي على الأجزاء بدء تشغيل الصوت بينما لا يزال باقي الصوت قيد التوليد.

from openai import OpenAI

client = OpenAI(api_key='YOUR_OPENAI_API_KEY')

def stream_tts_to_file(text: str, output_path: str):
    # OpenAI SDK streams the audio response
    with client.audio.speech.with_streaming_response.create(
        model='tts-1',
        voice='nova',
        input=text,
        response_format='mp3'
    ) as response:
        response.stream_to_file(output_path)
    print(f'Streamed to {output_path}')

def stream_tts_chunks(text: str):
    """Yield raw audio bytes for piping to an audio player."""
    with client.audio.speech.with_streaming_response.create(
        model='tts-1',
        voice='nova',
        input=text
    ) as response:
        for chunk in response.iter_bytes(chunk_size=4096):
            yield chunk  # pipe to audio player or WebSocket

تقسيم ملفات الصوت الطويلة

يجب تقسيم ملفات الصوت التي يزيد حجمها عن 25 ميغابايت قبل إرسالها إلى Whisper. استخدم مكتبة pydub للتقسيم وفق فواصل زمنية، وعالج كل جزء بشكل مستقل، ثم ادمج النصوص المفرغة.

from pydub import AudioSegment
import os

def split_audio(
    path: str,
    chunk_minutes: int = 10
) -> list:
    audio = AudioSegment.from_file(path)
    chunk_ms = chunk_minutes * 60 * 1000
    chunks = []
    os.makedirs('audio_chunks', exist_ok=True)
    for i, start in enumerate(range(0, len(audio), chunk_ms)):
        chunk = audio[start:start + chunk_ms]
        chunk_path = f'audio_chunks/chunk_{i:03d}.mp3'
        chunk.export(chunk_path, format='mp3')
        chunks.append(chunk_path)
    return chunks

def transcribe_long_audio(path: str) -> str:
    chunks = split_audio(path, chunk_minutes=10)
    transcripts = []
    for chunk_path in chunks:
        text = transcribe_audio(chunk_path)
        transcripts.append(text)
    # Clean up chunks
    for chunk_path in chunks:
        os.remove(chunk_path)
    return ' '.join(transcripts)

خط أنابيب صوتي في الزمن الحقيقي

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

import asyncio
import time

async def realtime_voice_loop(mic_stream, speaker_stream, client):
    """
    mic_stream: async generator yielding audio bytes
    speaker_stream: async callable accepting audio bytes
    """
    buffer = b''
    BUFFER_THRESHOLD = 50 * 1024  # ~3 seconds at 16kHz mono mp3

    async for audio_chunk in mic_stream:
        buffer += audio_chunk

        if len(buffer) >= BUFFER_THRESHOLD:
            t0 = time.time()
            # Save buffer to temp file
            with open('/tmp/voice_chunk.mp3', 'wb') as f:
                f.write(buffer)
            buffer = b''

            # Transcribe
            text = transcribe_audio('/tmp/voice_chunk.mp3')
            print(f'Transcribed ({time.time()-t0:.1f}s): {text}')

            # Agent response
            reply = voice_agent_respond(text)

            # TTS and stream to speaker
            for audio_bytes in stream_tts_chunks(reply):
                await speaker_stream(audio_bytes)

اكتشاف اللغة والتوجيه التلقائي

يكتشف Whisper اللغة المنطوقة تلقائيًا. استخدم اللغة المكتشفة لتوجيه المحادثة إلى شخصية الوكيل المناسبة أو لتعيين لغة TTS للاستجابة.

def transcribe_and_detect_language(audio_path: str) -> dict:
    from openai import OpenAI
    client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
    with open(audio_path, 'rb') as f:
        result = client.audio.transcriptions.create(
            model='whisper-1',
            file=f,
            response_format='verbose_json'
        )
    return {
        'text': result.text,
        'language': result.language,  # e.g. 'english', 'spanish'
        'duration': result.duration
    }

LANGUAGE_VOICE_MAP = {
    'english': 'nova',
    'spanish': 'alloy',
    'french': 'echo',
    'german': 'fable'
}

def respond_in_detected_language(audio_path: str) -> str:
    info = transcribe_and_detect_language(audio_path)
    voice = LANGUAGE_VOICE_MAP.get(info['language'], 'nova')
    reply = voice_agent_respond(info['text'])
    return text_to_speech(reply, voice=voice)

التعامل مع ضوضاء الخلفية والصوت منخفض الجودة

يؤدي الصوت منخفض الجودة إلى تراجع دقة التفريغ. وتشمل الإجراءات العملية للتخفيف من ذلك: المعالجة المسبقة باستخدام تقليل الضوضاء (مكتبة noisereduce)، وإضافة مفردات المجال إلى prompt في Whisper، والتحقق من مستوى الثقة في النص المفرغ، وطلب التوضيح عندما تكون الثقة منخفضة.

def transcribe_with_quality_check(
    audio_path: str,
    min_confidence_words: int = 3
) -> dict:
    from openai import OpenAI
    import string
    client = OpenAI(api_key='YOUR_OPENAI_API_KEY')
    with open(audio_path, 'rb') as f:
        result = client.audio.transcriptions.create(
            model='whisper-1',
            file=f,
            response_format='verbose_json',
            timestamp_granularities=['word']
        )
    # Word count as a basic quality proxy
    words = result.text.translate(
        str.maketrans('', '', string.punctuation)
    ).split()
    quality_ok = len(words) >= min_confidence_words
    return {
        'text': result.text,
        'word_count': len(words),
        'quality_ok': quality_ok,
        'fallback_message': None if quality_ok else 'I could not hear you clearly. Please repeat.'
    }

التحقق من المعرفة

ما وظيفة المعلمة prompt في Whisper؟

مراجعة: سير عمل الوكيل من الصوت إلى النص

ممتاز! إليك أهم النقاط:

  • Whisper: يدعم mp3 وwav وm4a وغيرها، بحد أقصى 25 ميغابايت؛ استخدم pydub لتقسيم الملفات الكبيرة
  • الطوابع الزمنية: استخدم verbose_json مع timestamp_granularities للحصول على توقيت المقاطع
  • TTS: يوفر OpenAI TTS خيارات متعددة للأصوات؛ ابث الأجزاء لتقليل زمن الاستجابة
  • اكتشاف اللغة: يكتشف Whisper اللغة تلقائيًا؛ وجّه المحادثة إلى الصوت أو الوكيل المناسب بناءً على اللغة المكتشفة
  • خط الأنابيب في الزمن الحقيقي: تخزين الأجزاء الصوتية مؤقتًا → التفريغ → الوكيل → بث TTS

التالي: فهم الفيديو لدى الوكلاء — استخراج الإطارات والاستدلال الزمني.

الأسئلة الشائعة

هل درس «سير عمل الوكلاء للصوت + النص» مجاني؟

نعم — نص درس «سير عمل الوكلاء للصوت + النص» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «سير عمل الوكلاء للصوت + النص»؟

خطوط أنابيب متكاملة من البداية إلى النهاية: تحويل الكلام إلى نص ← الاستدلال ← الرد الصوتي. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «سير عمل الوكلاء للصوت + النص»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. وكلاء الصور + النصوص باستخدام Claude Vision وGPT-4V
  2. سير عمل الوكلاء للصوت + النص
  3. فهم الفيديو لدى الوكلاء
  4. أنماط الاستدلال متعدد الوسائط
← العودة إلى AI Agents