تسلط بر معرفت‌شناسیراهنما · نقشه · صوت EN
«صدای صاحبش» اثر فرانسیس بارو (۱۸۹۸–۱۸۹۹)
نسخهٔ صوتی

صوت چگونه ساخته شد

فرانسیس بارو، «صدای صاحبش»، ۱۸۹۸–۱۸۹۹

هر فصلِ راهنما به شکلِ یک فایلِ صوتیِ روایت‌شده به زبانِ فارسی هم در دسترس است. آن را در پخش‌کنندهٔ صوتی بشنوید؛ این پخش‌کننده امکانِ پرش به بخش‌ها، تنظیمِ سرعت و ادامه دادن از جای قبلی را دارد. می‌توانید فایل‌های MP3 را هم مستقیم باز کنید: هر فایل نشانگرهای فصل دارد که برنامه‌های پادکست و کتابِ صوتی می‌توانند از آن‌ها استفاده کنند. متنِ کاملِ آنچه در هر فایل گفته می‌شود، با زمانِ آغازِ هر بخش، در transcripts/ است.

هر فصلی که روایتِ فارسی دارد، صفحهٔ «خواندن همراه با صدا» هم دارد: متنِ روایت همراهِ صدا پیش می‌رود و خطی که خوانده می‌شود رنگی است. همین متن و صدا را می‌توان به صورتِ یک فایلِ EPUB 3 با Media Overlays هم دریافت کرد، برای خواندن و شنیدنِ هم‌زمان و بی‌اینترنت در برنامه‌هایی مانند Apple Books یا Thorium Reader. زمانِ هر خط در sync/ نگه داشته می‌شود.

برای همراه داشتنِ کتابِ صوتی، صفحهٔ پخش‌کننده سه راه دارد: فصل‌ها را در مرورگر برای شنیدنِ بی‌اینترنت ذخیره کنید، همه را یک‌جا در یک فایلِ ZIP از فایل‌های MP3 با فهرستِ پخش دریافت کنید، یا خوراکِ https://epis.duckdns.org/fa/guide/audio/feed.xml را در یک برنامهٔ پادکست دنبال کنید.

روایت را صداهای ساختگی خوانده‌اند، نه انسان. فصل‌هایی که با ElevenLabs روایت شده‌اند دو راوی دارند، یک صدای مردانه و یک صدای زنانه؛ فصل‌های دیگر را مدلِ متن‌به‌گفتارِ فارسیِ «گویا بزرگ ۱٫۵» خوانده است، با صدایی که از صدای گوینده‌ای ایرانی الگو گرفته است.

فصل مدت
۱ معرفت‌شناسی چیست؟ ۴۹ دقیقه
۲ تاریخِ نظریهٔ معرفت ۱ ساعت و ۳۴ دقیقه
۳ منطق و کالبدشناسیِ استدلال ۱ ساعت و ۸ دقیقه
۴ زبان، مفهوم‌ها و تعریف‌ها ۱ ساعت و ۳ دقیقه
۵ معرفت چیست؟ ۱ ساعت و ۱۷ دقیقه
۶ توجیه: ساختارِ دلیل‌های خوب ۱ ساعت و ۱۲ دقیقه
۷ سرچشمه‌های معرفت ۱ ساعت و ۸ دقیقه
۸ شکاکیت و پاسخ‌هایش ۱ ساعت و ۱۷ دقیقه
۹ استقرا، احتمال و استدلالِ بیزی ۱ ساعت و ۲۹ دقیقه
۱۰ علم، شواهد و تبیین ۱ ساعت و ۳۱ دقیقه
۱۱ حقیقت، نسبی‌گرایی و عینیت ۵۹ دقیقه
۱۲ معرفت‌شناسیِ اجتماعی: با هم دانستن ۱ ساعت و ۲۴ دقیقه
۱۳ فضیلتِ فکری و اخلاقِ باور ۱ ساعت و ۳ دقیقه
۱۴ روان‌شناسیِ استدلال: ذهن واقعاً چطور کار می‌کند ۱ ساعت و ۲۳ دقیقه
۱۵ راهنمای میدانیِ مغالطه‌ها ۱ ساعت و ۱۸ دقیقه
۱۶ جعبه‌ابزارِ متفکرِ نقاد: تحلیلِ گفت‌وگوها و ساختنِ استدلال ۱ ساعت و ۲۷ دقیقه

جمع: ۲۰ ساعت و ۳ دقیقه.


وقتی راهنما بلند خوانده می‌شود چه چیزی عوض می‌شود

چشم یک صفحه را مرور می‌کند، اما یک ضبط را باید به ترتیب دنبال کرد. برای همین روایت متنِ مارک‌داون را کلمه‌به‌کلمه نمی‌خواند. هر فصل اول به یک متنِ روایت (scripts/) تبدیل می‌شود، یعنی نسخه‌ای ساده که برای گوش نوشته شده است:

دو راوی (ElevenLabs)

در فصل‌هایی که با ElevenLabs روایت می‌شوند، دو صدا کار را میانِ خود تقسیم می‌کنند تا شنونده از یک صدا خسته نشود. صدای مردانه فصل را آغاز می‌کند؛ پس از آن بخش‌ها به نوبت میانِ دو صدا می‌چرخند و هر راوی عنوانِ بخشِ خودش را هم می‌خواند. نقل‌قول را صدایی می‌خواند که راویِ آن بخش نیست؛ در گفت‌وگوها «الف» صدای مردانه است و «ب» صدای زنانه؛ در آزمونکِ پایانِ فصل صدای زنانه می‌پرسد، فرصتی برای فکر کردن هست، و صدای مردانه پاسخ می‌دهد؛ و فصل را صدای مردانه می‌بندد.

هر فصل در تکه‌هایی ساخته می‌شود که هر کدام را یک صدا می‌خواند، با شناسهٔ درخواست‌های پیشینِ همان صدا، تا آهنگِ گفتار از تکه‌ای به تکهٔ بعد پیوسته بماند. زنگِ آغازِ بخش‌ها و مکث‌ها همان‌اند که در روایتِ گویا. ElevenLabs زمانِ هر حرف را هم برمی‌گرداند، و از آن زمانِ آغاز و پایانِ هر خط برای «خواندن همراه با صدا» و EPUB به دست می‌آید. ابزارِ این کار tools/eleven_narrate.py است: پیش از هر فصل و هر تکه اعتبارِ باقی‌مانده را می‌سنجد و هرگز از سقفِ اشتراک فراتر نمی‌رود.

تکه‌ها بی‌آنکه دوباره رمزگذاری شوند به هم وصل می‌شوند. فایلی که روی سایت می‌آید همین صدا است که یک بار دیگر، تک‌کاناله و با نرخِ ۴۸ کیلوبیت در ثانیه، رمزگذاری شده است تا همهٔ کتاب (نزدیکِ بیست ساعت) در محدودیتِ حجمِ GitHub Pages جا شود. فایلِ همگام‌سازی جای هر تکه را در صدا هم نگه می‌دارد؛ اگر بعدها جمله‌ای در متنِ روایت اصلاح شود، --patch فقط تکه‌ای را که تغییر کرده دوباره می‌سازد و به جای تکهٔ قبلی در فایل می‌گذارد.

ویرایشِ دومِ روایت (فصل‌های هشت تا شانزده). در این فصل‌ها ElevenLabs متنی را می‌خواند که برای گوش بازنویسی شده است (narration/NN-*.txt): جمله‌ها کوتاه‌ترند، هر نکتهٔ نام‌دار اول نامش گفته می‌شود و بعد توضیحش، میانِ بخش‌ها و بندها مکثِ واقعی هست، زنگ فقط در آغازِ فصل، پیش از آزمونک و پیش از پایانِ فصل می‌آید، و سرعتِ گفتار کمی بیشتر است. عنوانِ بخش‌ها، نقل‌قول‌ها و منبعشان، گفت‌وگوها، پرسش‌ها و پاسخ‌های آزمونک و همهٔ اصطلاح‌های فصل همان‌اند که در متنِ روایت؛ tools/check_narration.py این را برای هر فصل می‌سنجد. فصل‌های یک تا هفت همان روایتِ نخست را دارند.

مکث پس از عنوان‌ها. صداها عنوان و جملهٔ پس از آن را گاهی پشتِ‌سرِهم و بی‌مکث می‌خوانند. tools/heading_pauses.py پس از هر عنوان در صدای منتشرشده مکث می‌گذارد، بی‌آنکه چیزی دوباره روایت شود: یک ثانیه پس از عنوانِ بخش، ۰٫۸ ثانیه پس از عنوانِ زیربخش، ۰٫۶ ثانیه پس از برچسب‌ها و نزدیکِ نیم ثانیه پس از نامِ هر نکتهٔ نام‌دار، با حسابِ سکوتی که از قبل بوده است. جای دقیقِ مرزِ دو واژه را یک مدلِ بازشناسیِ گفتارِ فارسی (هم‌ترازیِ اجباری) پیدا می‌کند، و فقط همان تکهٔ کوتاه دوباره رمزگذاری می‌شود؛ بقیهٔ صدا دست‌نخورده می‌ماند. زمان‌های فایلِ همگام‌سازی و نشانگرهای بخش‌ها هم به همان اندازه جابه‌جا می‌شوند.

چطور روایت طبیعی‌تر شده است

  1. یک صدای ایرانی، با چند رنگ. همهٔ متن را مدلِ «گویا بزرگ» می‌خواند، مدلِ Chatterbox که برای فارسی آموزش دیده است. این مدل صدای راوی را از ده ثانیه ضبطِ یک گوینده یاد می‌گیرد (tools/voice/narrator.flac)، که از مجموعه‌دادهٔ آزادِ Mana-TTS برداشته شده است، ضبط‌هایی که گوینده‌ای ایرانی خوانده است. تلفظ، اضافه و آهنگِ جمله‌ها را خودِ مدل می‌سازد. نقل‌قول‌ها کمی آهسته‌تر خوانده می‌شوند، و بعد راوی می‌گوید گوینده که بود. در گفت‌وگوها «الف» کمی زیرتر و پرشورتر و «ب» کمی بم‌تر و آرام‌تر حرف می‌زند، تا بحثِ سرِ سفرهٔ شام در فصلِ ۱ و دعوای اینترنتی در فصلِ ۱۶ مثلِ حرف زدنِ دو آدم شنیده شوند.
  2. چند جمله با هم. مدل هر بار چند جملهٔ پشتِ‌سرِهم را، تا حدودِ دویست حرف، یک‌جا می‌خواند، تا جمله‌های یک پاراگراف با آهنگی پیوسته و طبیعی پشتِ هم بیایند. هر تکه پس از ساخته شدن سنجیده می‌شود: طولش باید با مقدارِ متنش جور باشد، و یک مدلِ بازشناسیِ گفتار (Whisper) باید از آن همان متن را بشنود. اگر مدل کلمه‌ای را جا انداخته، بی‌جا ادامه داده یا نامفهوم خوانده باشد، آن تکه دوباره ساخته می‌شود.
  3. ریتم و ساختاری که شنیده می‌شود. یک زنگِ ملایمِ دونُتی و یک مکث هر بخشِ تازه را مشخص می‌کند. عنوان‌ها کمی آهسته‌تر خوانده می‌شوند، و استدلال‌های نمونه و بندهای جداشدهٔ دیگر هم کمی آهسته‌تر و با فاصله. میانِ بندهای فهرست و ردیف‌های جدول فاصله‌ها کوتاه‌تر از میانِ پاراگراف‌هاست. یک زنگِ آرام‌ترِ تک‌نُتی هر کادرِ نکته یا درس را معرفی می‌کند و راوی نامِ کادر را می‌گوید.
  4. عبارت‌های لاتین، آلمانی و فرانسوی با حروفِ فارسی بازنویسی می‌شوند (tools/lexicon.txt)، تا همان‌طور گفته شوند که یک خوانندهٔ ایرانی می‌گوید؛ مثلاً a priori «آ پریوری» و modus ponens «مودوس پونِنس». اصطلاح‌های انگلیسی را خودِ مدل می‌خواند؛ این مدل برای خواندنِ واژه‌های انگلیسی در میانِ جملهٔ فارسی هم آموزش دیده است.
  5. صدای یکدست. هر فایل با سکوت شروع و تمام می‌شود و بلندی‌اش روی −18 LUFS تنظیم شده، سطحی راحت برای گفتار که همهٔ فصل‌ها را هم‌بلند می‌کند، و یک محدودکننده اوج‌ها را پایین‌تر از حداکثر نگه می‌دارد. فایل‌ها به شکلِ MP3 تک‌کاناله با ۴۰ کیلوبیت بر ثانیه ذخیره شده‌اند و عنوان، آلبوم و شمارهٔ قطعه دارند. هر بخش یک نشانگرِ فصل در فایلِ MP3 است.

صدا ساختگی است، پس گاهی منتظرِ ناهمواری‌هایی باشید: تکیه روی هجای اشتباه یا نامی که درست خوانده نشده است. متنِ نوشتاریِ فصل همیشه مرجع است. نسخهٔ صوتیِ انگلیسی هم در guide/audio/ در دسترس است.

فایل‌ها

مسیر چیست
NN-*.mp3 یک فایل برای هر فصل، با نشانگرهای فصل
tracks.js فهرستِ فایل‌ها با زمانِ بخش‌ها، برای صفحهٔ پخش‌کننده
transcripts/NN-*.md متنِ هر روایت، همان‌طور که شنیده می‌شود، با زمانِ آغازِ بخش‌ها
sync/NN-*.json زمانِ آغاز و پایانِ هر خطِ روایت در فایلِ MP3، برای «خواندن همراه با صدا» و EPUB
scripts/NN-*.txt متن‌های روایت: چه چیزی، با کدام صدا و با کدام مکث‌ها خوانده می‌شود
tools/make_script.py متنِ مارک‌داونِ یک فصل را به متنِ روایت تبدیل می‌کند
tools/script_extras.py آغازها و پایان‌های دست‌نویس، خوانشِ جدول‌ها و بازنویسیِ گفتاریِ فرمول‌ها
tools/lexicon.txt شکلِ گفتاریِ عبارت‌های لاتین، آلمانی و فرانسوی، و هر واژه‌ای که صدا اشتباه بخواند
tools/voice/narrator.flac ده ثانیه صدای گوینده، که مدل صدای راوی را از آن می‌سازد
tools/narrate.py متن‌های روایت را با مدلِ «گویا بزرگ» به MP3 تبدیل می‌کند: صدا، ریتم، زنگ‌ها، بلندی، برچسب‌ها
tools/eleven_narrate.py روایت با ElevenLabs و دو راوی: شمارشِ حرف‌ها و هزینه، آزمونِ ۱٬۰۰۰ حرفی، و ساختِ تکه‌به‌تکه و ازسرگرفتنی
narration/NN-*.txt متنِ گفتاریِ ویرایشِ دوم (فصل‌های هشت تا شانزده)، که ElevenLabs می‌خواند
tools/check_narration.py متنِ گفتاری را با متنِ روایت می‌سنجد: عنوان‌ها، نقل‌قول‌ها، گفت‌وگوها، آزمونک و اصطلاح‌ها
tools/heading_pauses.py پس از عنوان‌ها در صدای منتشرشده مکث می‌گذارد و زمان‌ها را جابه‌جا می‌کند
tools/make_transcript.py از متن‌های روایت، متنِ شنیداری (transcripts/) را می‌سازد
tools/update_docs.py جدولِ فصل‌ها در همین صفحه و خطِ «صوت» در هر فصل را با فایل‌های ساخته‌شده هماهنگ می‌کند

ساختنِ دوبارهٔ صوت

پس از ویرایشِ یک فصل، متنِ روایت و صوتش را دوباره بسازید. تکه‌هایی که قبلاً ساخته شده‌اند ذخیره می‌شوند، پس فقط خط‌های تغییرکرده دوباره ساخته می‌شوند، و اجرایی که نیمه‌کاره بماند از همان‌جا ادامه پیدا می‌کند.

cd guide/fa/audio/tools
python3 make_script.py              # rebuild all scripts from the chapters
python3 narrate.py 05               # re-render chapter 5 (or --all)
python3 narrate.py --say "مسئلهٔ گتیه" test.wav   # hear one line
python3 make_transcript.py          # rewrite the transcripts
python3 update_docs.py              # refresh the chapter table and each chapter's audio line

نیازمندی‌ها: پایتونِ ۳٫۱۰ یا بالاتر با chatterbox-tts (و torch)، num2words، soundfile و numpy، به‌علاوهٔ ffmpeg، و فایل‌های مدلِ گویا بزرگ ۱٫۵ در پوشه‌ای که متغیرِ محیطیِ GOOYA_DIR به آن اشاره می‌کند. اگر کارتِ گرافیک باشد، مدل از آن استفاده می‌کند و هر فصل چند دقیقه طول می‌کشد؛ روی پردازندهٔ معمولی مدل چند برابرِ زمانِ خودِ گفتار وقت می‌گیرد، یعنی چند ساعت برای هر فصل. رمزگشای سبک‌ترِ Chatterbox Turbo خودکار از Hugging Face بارگیری می‌شود. برای سنجیدنِ تکه‌ها با Whisper، بستهٔ sherpa-onnx را نصب کنید و متغیرِ NARRATE_ASR را به پوشهٔ مدلِ sherpa-onnx-whisper-turbo اشاره دهید.

برای درست کردنِ یک تلفظِ اشتباه، خطی به tools/lexicon.txt اضافه کنید (مثلاً واژه را با اعراب بنویسید) و فصل را دوباره بسازید. برای تغییرِ آنچه خوانده می‌شود، فصل را ویرایش کنید و make_script.py را اجرا کنید، یا بازنویسی‌ای به script_extras.py اضافه کنید. تغییرهایی که با دست در یک متنِ روایت داده شوند، دفعهٔ بعد که make_script.py اجرا شود پاک می‌شوند.

منابع و مجوزها