هذا المقال للمستوى المتوسط — يحتاج إلفة بـ Python وسطر الأوامر، ومفتاح API لـ OpenAI وAnthropic.
اعمل سكريبت يحوّل اجتماعاتك الصوتية لـ Action Items في 15 دقيقة
لو بتقعد بعد كل اجتماع 20 دقيقة تكتب action items من ذاكرتك، أو بتنسى نقطة طلبها العميل تحديدًا، اللي قدامك هنا هيعمل ده بدلك. اجتماع 30 دقيقة بيتلخّص في 90 ثانية بتكلفة قدرها 0.19$.
المشكلة باختصار
الذاكرة بتفقد جزء كبير من تفاصيل أي اجتماع خلال 24 ساعة (Ebbinghaus, 1885). والكتابة اليدوية وقت الاجتماع بتسحب تركيزك من النقاش الفعلي. النتيجة: action items مش واضحة، أصحابها مش متحددين، أو بتتنسى تمامًا.
السكريبت اللي هنبنيه بياخد ملف صوتي ويرجّع ملف Markdown فيه: ملخص في 3 جمل، Action Items مع أصحابها، قرارات اتاخدت، وأسئلة مفتوحة.
مثال بسيط قبل ما ندخل في التفاصيل
تخيّل إنك قاعد مع صديق في كافيه وبيحكيلك خطته للأسبوع. بعد ساعة، انت ممكن تفتكر الفكرة العامة، بس مش هتفتكر إنه قال "الأربع الصبح هطلع للمطار". الـ action item فاتك من غير قصد.
اللي هنعمله ده زي صديق تالت قاعد معاكم بياخد الـ notes الدقيقة دي لوحده، ويرجّعلك ملف منظم بعد ما الاجتماع يخلص.
الفكرة العلمية: pipeline من خطوتين
المعمارية بسيطة، لكن تقسيمها مهم:
- Speech-to-Text (STT): نموذج Whisper من OpenAI بيحوّل الصوت لنص. بيدعم العربي والإنجليزي وممزوجين، ودقّته على الكلام الواضح ~95% حسب ورقة Radford et al. 2022.
- LLM Extraction: نموذج Claude بياخد النص ويستخرج منه action items + decisions + open questions بصيغة JSON ثابتة.
ليه التقسيم ده؟ Whisper متخصص في الصوت، Claude متخصص في فهم السياق. لو حاولت تستعمل Whisper لوحده، مش هيقدر يحلل أو يستنتج المهام. ولو استعملت Claude مع Voice mode مباشرة، هتدفع تكلفة أعلى بكتير.
الخطوات التنفيذية
1. تجهيز البيئة
# انشئ مجلد المشروع
mkdir meeting-extractor && cd meeting-extractor
# بيئة Python معزولة
python3 -m venv .venv && source .venv/bin/activate
# المكتبات المطلوبة
pip install openai anthropic
# المفاتيح
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
2. ملف تحويل الصوت لنص
# stt.py
from openai import OpenAI
client = OpenAI()
def transcribe(audio_path: str, lang: str = "ar") -> str:
with open(audio_path, "rb") as f:
result = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language=lang, # "ar" عربي، "en" إنجليزي
)
return result.text