رفتن به محتوا

جلسه‌ها و رونویسی

Control Center می‌تواند یک تماس را ضبط کند و در پایان یک نوشتهٔ مرتب — خلاصه، موارد اقدام و تصمیم‌ها — تحویل دهد، در حالی که بازشناسی گفتار و تفکیک گویندگان روی سخت‌افزار خودتان اجرا می‌شوند. مثل Granola، اما خودمیزبان و متصل به همان فضای کاری‌ای که عامل‌هایتان در آن زندگی می‌کنند.

یک جلسه یک نشست ضبط‌شده و رونویسی‌شده است. این با یک رویداد تقویم یکی نیست: رویداد یک تعهد زمان‌بندی‌شده است که از Google همگام می‌شود، در حالی که جلسه چیزی است که واقعاً ضبط کرده‌اید. این دو می‌توانند به هم پیوند بخورند، چون می‌توانید یک ضبط را از روی یک رویداد شروع کنید، اما دو رکورد جداگانه باقی می‌مانند.

هر جلسه، مثل هر چیز دیگری در Control Center، در محدودهٔ فضای کاری است. جلسه‌هایی که در یک فضای کاری ضبط می‌شوند هرگز در فضای کاری دیگری ظاهر نمی‌شوند.

«روی دستگاه» شهود درستی است اما اسم اشتباهی است. کلاینت صدا را می‌گیرد و فریم‌های 16 kHz PCM16 را به ماشینی که cc_server روی آن اجرا می‌شود استریم می‌کند. آن میزبان بقیهٔ کارها را انجام می‌دهد: فایل‌های WAV هر کانال را زیر <dataDir>/meetings/<meetingId>/ می‌نویسد، در یک ایزولهٔ کارگر رونویسی می‌کند، پژواک را فیلتر می‌کند و پس از پایان، تفکیک گوینده انجام می‌دهد. روی یک دسکتاپ مستقل، آن میزبان همان ماشین است. اما وقتی به یک سرور راه دور وصل باشد، این‌طور نیست — پس «هیچ‌چیز از لپ‌تاپ من بیرون نمی‌رود» تنها وقتی درست است که سرور همان لپ‌تاپ شما باشد.

یک استثنای دیگر هم وجود دارد و همان استثنای مهم است.

همه‌چیز پیش از خلاصه — ضبط، رونویسی، حذف پژواک، تفکیک گوینده و تطبیق اثر صدا — بدون هیچ فراخوان شبکه‌ای روی سرور اجرا می‌شود.

چه مدل‌هایی همراه عرضه می‌شوند

بخش با عنوان “چه مدل‌هایی همراه عرضه می‌شوند”

مدل‌های امبدینگ، تفکیک گوینده و گفتار (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»): خروجی صوتی جلسه، که با یک loopback بدون درایور گرفته می‌شود — tapهای فرایند/دستگاه Core Audio در macOS، loopback مربوط به WASAPI در Windows و مانیتور PipeWire / PulseAudio در Linux.

چون این دو کانال جداگانه ضبط می‌شوند، رونوشت از همان ابتدا به گوینده نسبت داده می‌شود: سخنان شما با me برچسب می‌خورند و هر کس دیگری در تماس با them.

صدای خودتان از خروجی سیستم دوباره به میکروفون سرریز می‌کند و در غیر این صورت دو بار رونویسی می‌شد. دو فیلتر جلوی این را می‌گیرند. AEC3 در سطح سیگنال روی هر ضبط حالت راه دور اجرا می‌شود و الزامی است — اگر کتابخانهٔ بومی AEC بارگذاری نشود، ضبط از شروع سرباز می‌زند، به‌جای اینکه بی‌صدا میکروفونی آغشته به پژواک را استریم کند. (حالت حضوری هیچ مرجع سرِ دوری برای حذف ندارد، بنابراین AEC در آنجا یک عبور بی‌اثر است.) علاوه بر آن، یک فیلتر پژواک متنی در سمت میزبان روی هر سکو اجرا می‌شود.

همهٔ پردازش‌های میکروفون در سطح سیستم‌عامل به‌عمد غیرفعال شده‌اند. فعال‌کردن حذف پژواک یا بهرهٔ خودکارِ خودِ سکو در macOS، میکروفون را به Voice Processing I/O سوئیچ می‌کند که در این بیلد هم میکروفون و هم tap صدای سیستم را از کار انداخت.

هنگام ضبط، صدا در پنجره‌های غلتان — که با یک سکوت کوتاه پایانی یا در حداکثر طول پنجره بریده می‌شوند — بیرون از رشتهٔ رابط کاربری رمزگشایی می‌شود. هر پنجره به یک قطعهٔ رونوشت گوینده‌دارشده با افست‌های میلی‌ثانیه‌ای تبدیل می‌شود.

پنجره‌هایی که هرگز از آستانهٔ RMS بالاتر نرفتند، بدون هیچ رمزگشایی‌ای رد می‌شوند، چون یک مدل گفتار سکوت را به‌شکل توکن‌های توهمیِ غیرگفتاری بازمی‌دهد و رمزگشایی، هدررفت CPU است. پیامد عملی: گوینده‌ای که پیوسته بسیار آهسته حرف می‌زند هیچ رونوشتی تولید نمی‌کند. اگر کسی خالی برگشت، پیش از سرزنش مدل، سطح ورودی‌اش را بررسی کنید.

پس از توقف، تفکیک گوینده به‌صورت آفلاین روی ضبط اجرا می‌شود و کانال راه دور را به گویندگان جداگانه (Person 1، Person 2، …) تقسیم می‌کند که می‌توانید نامشان را عوض کنید. تعداد گویندگان از یک آستانهٔ خوشه‌بندی استنتاج می‌شود، نه از عدد مشخصی که شما تعیین کرده باشید — پس محصول جانبی آستانه است و ممکن است گوینده‌ای آهسته یا هم‌پوشان در گویندهٔ همسایه ادغام شود. رونوشت به‌شکل خطوط [mm:ss] SPEAKER: text نمایش داده می‌شود.

تغییر نام یک گوینده کاری بیشتر از برچسب‌زدن به یک رونوشت است. Control Center می‌تواند اثر صدای گوینده را به‌عنوان یک نمایهٔ صوتی ذخیره کند تا در جلسه‌های آینده او را خودکار بشناسد. وقتی به گوینده‌ای جداشده نام می‌دهید، از شما پرسیده می‌شود که آیا اثر صدا ذخیره شود؛ اگر ذخیره کنید، در یک مرکز ثقل جاری برای آن نام ترکیب می‌شود و با شباهت کسینوسی در برابر گویندگان جدید تطبیق داده می‌شود، تا همان شخص دفعهٔ بعد با نامش ظاهر شود، بدون اینکه دوباره برچسبش بزنید.

نمایه‌های صوتی در محدودهٔ فضای کاری‌اند و هرگز از این مرز عبور نمی‌کنند. آن‌ها را در تنظیمات → فضای کاری → جلسات مدیریت کنید. تغییر نام گوینده‌ای که پیش‌تر ذخیره شده بود، نام قدیمی را از ثبت خارج می‌کند و پیشنهاد ثبت نام جدید را می‌دهد؛ حذف یک نمایه، اثر صدای ذخیره‌شده را برمی‌دارد اما نام‌هایی که قبلاً روی جلسه‌های گذشته اعمال شده‌اند دست‌نخورده می‌مانند.

وقتی ضبط متوقف می‌شود، سرور یک MeetingRecordingStopped رویداد دامنه منتشر می‌کند. قالب پایپ‌لاین داخلی meeting_summary با آن رویداد راه‌اندازی می‌شود. ضبط‌کننده منتظر آن نمی‌ماند؛ جلسه صرفاً از چرخهٔ عمر وضعیت خود عبور می‌کند:

recording → processing → done

عامل خلاصه‌ساز عنوان، یادداشت‌های زندهٔ ناویراستهٔ شما و رونوشت را می‌گیرد و JSON ساخت‌یافته برمی‌گرداند. اینکه چه بخش‌هایی بنویسد را قالب فعال یادداشت جلسه فضای کاری شکل می‌دهد (تنظیمات → فضای کاری → جلسات)؛ قالب فعال روی خلاصه‌های جدید و اجراشدهٔ مجدد اعمال می‌شود. گام‌های ذخیره‌سازی پایپ‌لاین سپس آن JSON را در سطرهای جداگانه می‌نویسند:

  • enhancedNotes و summary → یادداشت‌های جلسه
  • هر مورد اقدام → یک سطر MeetingActionItem (محتوا، مسئول، پیوند اختیاری تیکت)
  • هر تصمیم → یک سطر MeetingDecision

موارد اقدام و تصمیم‌ها هرگز از مارک‌داون آزاد استخراج نمی‌شوند، فقط از آرایه‌های ساخت‌یافتهٔ عامل. اگر یک اجرا هیچ خروجی ساخت‌یافته‌ای تولید نکند، گام‌های ذخیره‌سازی رد می‌شوند و رونوشت خام به‌عنوان جایگزین نگه داشته می‌شود، تا هرگز رکورد را از دست ندهید. هیچ‌چیز در پایپ‌لاین جلسه را done علامت نمی‌زند — یک آشتی‌دهندهٔ واحد این کار را از رویداد پایانی اجرا انجام می‌دهد، تا شکست یک گام هم‌زاد نتواند جلسه‌ای نیمه‌نوشته را که از پیش تمام‌شده به نظر می‌رسد، در راه رها کند.

سطح چه چیزی را نشان می‌دهد
/meetings فهرست جلسه‌ها، همراه با شمار موارد اقدام و تصمیم‌ها
/meetings/record نمای ضبط زنده: یادداشت‌های شما در یک سو و رونوشت جریانی در سوی دیگر
/meetings/:meetingId جزئیات یک جلسه: زبانه‌های یادداشت‌ها، رونوشت، موارد اقدام و تصمیم‌ها
تنظیمات → فضای کاری → جلسات قالب‌های یادداشت و نمایه‌های صوتی ذخیره‌شده برای این فضای کاری

ضبط روی هر سه سکوی دسکتاپ بدون درایور است (tapهای Core Audio در macOS، WASAPI در Windows و PipeWire در Linux).

کلاینت وب هم ضبط می‌کند، چیزی که قالب دسکتاپ‌محورِ بقیهٔ این صفحه می‌تواند پنهانش کند: مرورگر میکروفون شما را از طریق getUserMedia و صدای جلسه را از طریق getDisplayMedia (اشتراک صفحه) می‌گیرد، به 16 kHz PCM16 نمونه‌برداری کاهشی می‌کند و به همان میزبان استریم می‌کند. سه هشدار در آنجا وجود دارد:

  • سطح به‌اشتراک‌گذاشته‌شده باید یک رد صوتی داشته باشد. اشتراک‌گذاری تمام‌صفحه در Safari، Firefox و macOS هیچ‌کدام را نمی‌دهد و ضبط از شروع سرباز می‌زند.
  • AEC3 بومی وجود ندارد. حذف پژواک خودِ مرورگر برای میکروفون درخواست می‌شود؛ فیلتر پژواک متنیِ سمت میزبان همچنان اجرا می‌شود. نمای ضبط یک سطح‌سنج ورودی را نشان می‌دهد که از PCM میکروفون تغذیه می‌شود.
  • اجرای دوبارهٔ خلاصه و لغو پردازش فقط در دسکتاپ در دسترس‌اند.

کنش شروع ضبط و پیوند تقویم فقط در دسکتاپ در دسترس است و در وب صریحاً همین را گزارش می‌دهد، هرچند جریان ضبط خودِ صفحهٔ جلسه‌ها در آنجا کار می‌کند.