تخطَّ إلى المحتوى

الاجتماعات والنسخ النصي

يستطيع Control Center تسجيل مكالمة وإعادة خلاصة مرتبة إليك: ملخص، وبنود عمل، وقرارات، مع تعرّف على الكلام وفصل للمتحدثين يعملان على عتادك. مثل Granola، لكن على خادمك وموصولًا بمساحة العمل نفسها التي يعيش فيها وكلاؤك.

الاجتماع جلسة مُسجَّلة ومُفرَّغة. وهو ليس حدث تقويم بالمعنى نفسه: الحدث التزام مُجدوَل يُزامَن من Google، والاجتماع ما سجّلته فعلًا. يمكن ربط الاثنين، إذ تستطيع بدء التسجيل من حدث، لكنهما يبقيان سجلين منفصلين.

كل اجتماع نطاقه مساحة العمل، كسائر ما في Control Center. ما يُسجَّل في مساحة لا يظهر في مساحة أخرى.

«على الجهاز» حدس في محله، والاسم ليس كذلك. يلتقط العميل الصوت ويبث إطارات 16 kHz PCM16 إلى الجهاز الذي يشغّل cc_server. ينجز ذلك المضيف الباقي: يكتب ملفات WAV لكل قناة تحت <dataDir>/meetings/<meetingId>/، ويفرّغ النص في isolate عامل، ويرشّح الصدى، ويفصل المتحدثين لاحقًا. على حاسوب مستقل يكون هذا المضيف الجهاز نفسه. وإذا وُجّه العميل إلى خادم بعيد فلا، فجملة «لا شيء يغادر حاسوبي المحمول» لا تصح إلا إذا كان الخادم هو حاسوبك المحمول.

يبقى استثناء واحد، وهو الأهم.

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

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

تختلف مدخلات المنتقي الأربع في الحجم وتغطية اللغات والدقة:

  • Parakeet TDT 0.6B v3، متعدد اللغات، وهو الافتراضي الموصى به (~600 MB)
  • Parakeet TDT 0.6B v2، الإنجليزية (~480 MB)
  • Whisper large-v3-turbo، متعدد اللغات (~626 MB)
  • Whisper base.en، الإنجليزية فقط، وهو الافتراضي التاريخي الصغير (~198 MB)

النماذج هي الأثر الوحيد الذي يجلبه الخادم أثناء التشغيل، وكل مكتبة أصلية تُشحَن داخل الحزمة.

يسجّل الاجتماع قناتين صوتيتين في آن واحد:

  • أنت (“me”): ميكروفونك.
  • هم (“them”): خرج صوت الاجتماع، يُلتقط بحلقة عودة من غير مشغّل إضافي — التقاطات Core Audio للعملية والجهاز (process/device taps) على macOS، وحلقة عودة WASAPI على Windows، ومراقب PipeWire / PulseAudio على Linux.

ولأن القناتين تُلتقطان منفصلتين، يُنسب التفريغ إلى المتحدث منذ البداية: كلماتك تُوسَم بـ me، وكل من في المكالمة يُوسَم بـ them.

يتسرّب صوتك من خرج النظام عائدًا إلى الميكروفون، ولولا المرشّحان لَفُرّغ مرتين. يعمل AEC3 على مستوى الإشارة في كل تسجيل بالوضع البعيد للالتقاط، وهو مطلوب — إذا تعذّر تحميل مكتبة AEC الأصلية، يرفض التسجيل البدء بدل أن يبث الميكروفون بصمت وهو ملوّث بالصدى. (في وضع الحضور الشخصي لا توجد إشارة طرف بعيد تُستخدم لإلغاء الصدى، فيمرّر AEC الإشارة من غير تعديل.) وفوقه يعمل مرشّح صدى على مستوى النص، من جهة المضيف، على كل المنصات.

تُعطَّل معالجة الميكروفون على مستوى نظام التشغيل عمدًا. تفعيل إلغاء الصدى أو الكسب التلقائي الخاص بالمنصة على macOS ينقل الميكروفون إلى Voice Processing I/O، وفي هذا البناء عطّل ذلك الميكروفون والتقاط صوت النظام معًا.

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

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

بعد الإيقاف يعمل فصل المتحدثين على التسجيل كاملًا، ويقسم القناة البعيدة إلى متحدثين منفردين (Person 1 وPerson 2 و…) تستطيع إعادة تسميتهم. يُستنتج عدد المتحدثين من عتبة تجميع، لا من عدد تحدده أنت، فهو أثر لتلك العتبة، وقد يُدمَج متحدث هادئ أو متداخل في جاره. يُعرَض التفريغ أسطرًا على شكل [mm:ss] SPEAKER: text.

إعادة تسمية المتحدث تتجاوز وسم تفريغ واحد. يستطيع Control Center حفظ بصمة صوت المتحدث في ملف تعريف الصوت، فيتعرّف عليه تلقائيًا في الاجتماعات القادمة. حين تسمّي متحدثًا بعد الفصل، يُسأَل إن كنت تريد حفظ البصمة؛ وإن حفظتها، تُمزَج في مركز ثقل جارٍ لذلك الاسم، وتُطابَق مع المتحدثين الجدد بتشابه جيب التمام، فيظهر الشخص نفسه باسمه في المرة التالية من غير أن تعيد وسمه.

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

حين يتوقف التسجيل ينشر الخادم MeetingRecordingStopped، وهو حدث نطاق. يُشغَّل بذلك الحدث قالب خط الأنابيب المضمّن meeting_summary. لا ينتظره المسجّل. ينتقل الاجتماع عبر دورة حالته:

recording → processing → done

يتلقى وكيل التلخيص العنوان وملاحظاتك الحية التقريبية والتفريغ النصي، ويعيد JSON مهيكلًا. الأقسام التي يكتبها يحدّدها قالب ملاحظات الاجتماع النشط لمساحة العمل (الإعدادات ← مساحة العمل ← الاجتماعات). يُطبَّق القالب النشط على الملخصات الجديدة والمعاد توليدها. ثم تكتب خطوات الحفظ الـ JSON الناتج في صفوف منفصلة:

  • enhancedNotes وsummary في ملاحظات الاجتماع
  • كل بند عمل في صف MeetingActionItem (المحتوى، والمالك، ورابط تذكرة اختياري)
  • كل قرار في صف MeetingDecision

لا تُستخرَج بنود العمل والقرارات أبدًا من markdown حر، بل من مصفوفات الوكيل المهيكلة فقط. إذا لم يُنتج التشغيل خرجًا مهيكلًا، تُتخطى خطوات الحفظ ويُحفَظ التفريغ الخام بديلًا، فلا يضيع السجل. لا شيء في خط الأنابيب يضع الاجتماع في حالة done. يفعل ذلك مُوفِّق واحد من الحدث النهائي للتشغيل، فلا يترك فشل خطوة شقيقة اجتماعًا نصف مكتوب يبدو منجزًا.

السطح ما يعرضه
/meetings قائمة الاجتماعات، مع أعداد بنود العمل والقرارات
/meetings/record شاشة التسجيل الحي: ملاحظاتك في جانب، والتفريغ النصي المباشر في الجانب الآخر
/meetings/:meetingId تفاصيل الاجتماع: علامات تبويب الملاحظات والتفريغ النصي وبنود العمل والقرارات
الإعدادات ← مساحة العمل ← الاجتماعات قوالب الملاحظات وملفات تعريف الصوت المحفوظة لمساحة العمل هذه

الالتقاط بلا مشغّل إضافي على منصات الحاسوب الثلاث (التقاطات Core Audio على macOS، وWASAPI على Windows، وPipeWire على Linux).

عميل الويب يسجّل أيضًا، وقد يخفي ذلك تأطير بقية هذه الصفحة على أنها للحاسوب: يأخذ المتصفح الميكروفون عبر getUserMedia وصوت الاجتماع عبر getDisplayMedia (مشاركة الشاشة)، ويحوّله إلى 16 kHz PCM16 ويبث إلى المضيف نفسه. ثلاثة قيود:

  • السطح الذي تشاركه يجب أن يحمل مسارًا صوتيًا. مشاركة Safari وFirefox، ومشاركة الشاشة الكاملة على macOS، لا تعطي مسارًا، فيرفض التسجيل البدء.
  • لا يوجد AEC3 أصلي. يُطلب إلغاء الصدى الخاص بالمتصفح على الميكروفون، ويظل مرشّح الصدى النصي على المضيف يعمل. تعرض شاشة التسجيل مقياس مستوى الدخل مستمدًا من PCM الميكروفون.
  • إعادة تشغيل التلخيص وإيقاف المعالجة متاحان على الحاسوب فقط.

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