به آخرین قسمت از این سلسله مقالات خوش اومدید! توی این مقاله قراره هر چیزی که توی چهار مقالهی قبلی یاد گرفتیم و پیاده کردیم رو یککاسه کنیم و در نهایت یک منشی هوش مصنوعی بسازیم که بتونه به تماسهای ما پاسخ بده. برای اینکه به این نقطه برسیم، چه کارهایی کردیم؟
در قدم اول با ماژول EC25-EUX آشنا شدیم. بعد سراغ فعالسازی VoLTE رفتیم و در مرحلهی بعد، با کمک پایتون ماژول رو کنترل کردیم؛ از ارسال و دریافت پیامک گرفته تا مدیریت تماس. در قسمت قبلی، که از سختافزار فاصله گرفتیم، بهصورت کاملاً نرمافزاری و آفلاین با پایتون یک دستیار هوش مصنوعی ساختیم که میتونست با ما بهصورت صوتی تعامل داشته باشه.
حالا توی این قسمت قراره همهی اینها رو با هم ترکیب کنیم و ببینیم آیا میشه یک منشی تلفنی هوشمند ساخت یا نه!
قبل از شروع، باید پروژههای قبلی کنترل ماژول Quectel EC25-EUX با پایتون رو انجام داده باشید تا کتابخانهها و مدلهای مورد استفادهمون از قبل دانلود و آماده شده باشن.
پروژهی این مقاله در واقع چیزی فراتر از پروژههای قبلی نیست؛ فقط این بار بهجای اینکه صدای ورودی و خروجی از میکروفون و اسپیکر سیستم استفاده بشه، مسیر صوتی مستقیم به USB Audio ماژول EC25 وصل میشه. یعنی صدای تماسگیرنده وارد سیستم میشه، توسط برنامه پردازش میشه و پاسخ تولید شده دوباره از طریق ماژول روی تماس پخش میشه.
داخل هر دایرکتوری این ریپو یک فایل README.md قرار دادم و به فارسی توضیح دادم که هر پروژه دقیقاً چه کاری انجام میده و چطور باید راهاندازیش کنید.
برای اجرای این منشی، از ریشهی ریپو دستور زیر رو اجرا کنید:
02-ai/.venv/bin/python 03-ai-secretary/main.py –port /dev/ttyUSB0
فقط حواستون باشه مقدار –port باید با پورت واقعی AT ماژول روی سیستم شما یکی باشه. شمارهی این پورت ممکنه روی سیستمهای مختلف متفاوت باشه. تعداد نسبتاً زیادی گزینهی تنظیمات هم برای این منشی در نظر گرفتم که میتونید رفتار برنامه رو بدون دستکاری کد تغییر بدید. توضیحات کامل این گزینهها داخل README.md پروژه قرار داره.
حالا قرار نیست فقط یک کد رو اجرا کنیم و بگیم «خب، کار کرد!» در ادامه فقط بعضی از فایلهای مهم رو بررسی میکنم تا بدونید با چه چیزی سروکار دارید و ساختار پروژه چطوریه.
همونطور که از اسمش پیداست، تنظیمات منشی اینجاست. یکسری مقدار پیشفرض برای برنامه در نظر گرفتم و زمانی که اسکریپت رو اجرا میکنید، با استفاده از سویچهای مختلف میتونید این مقادیر رو بدون تغییر دادن خود کد بازنویسی کنید.
مثلاً میتونید مدل، پورت، دستگاه صوتی، زمان انتظار و تنظیمات مختلف تماس رو از طریق همین گزینهها تغییر بدید.
اینجا جاییه که بخشهای مختلف پروژه رو کنار هم میذاریم. کلاسها و اجزای مختلفی که ساختیم در این قسمت به هم متصل میشن و گزینههای خط فرمان هم از همینجا دریافت و اعمال میشن. به بیان سادهتر، میتونیم بگیم main.py همون قسمتیه که تکههای مختلف این پازل رو کنار هم قرار میده.
توی این فایل مدلهای دیتابیس رو تعریف کردیم و یکسری متد برای کار با اونها نوشتیم. این باعث میشه برای کارهای ساده لازم نباشه هر بار مستقیماً Query بنویسیم؛ هم کدمون خلوتتر میمونه و هم خوانایی اون بهتر میشه. اطلاعات مربوط به تماسها و مکالمه هم در دیتابیس این پروژه ذخیره میشن.
این فایل مسئول ارتباط سریال با ماژول و دریافت پاسخهای AT و اعلانهای مربوط به تماس هست. در واقع این همون بخشی از برنامهست که با خود مودم در ارتباطه و اتفاقاتی که از سمت ماژول دریافت میکنیم رو در اختیار بخشهای دیگهی برنامه قرار میده.
اینجا پرامپت اصلی منشی یا Agent رو تعریف کردیم. یکسری دستورالعمل و مثال هم براش قرار دادیم تا مدل بدونه چطور باید پاسخ بده. شما میتونید این فایل رو متناسب با نیاز خودتون تغییر بدید؛ مثلاً مشخص کنید منشی رسمی صحبت کنه یا خودمانی، چه اطلاعاتی از تماسگیرنده بگیره و به چه نوع سوالاتی پاسخ بده.
این فایل برای Cache کردن صدای خوشآمدگویی استفاده میشه. مثلاً وقتی یک نفر با ما تماس میگیره، لازم نیست هر بار عبارت خوشآمدگویی از ابتدا توسط مدل TTS تولید بشه. بار اول صدا تولید و ذخیره میشه و در تماسهای بعدی، فایل آماده مستقیماً استفاده میشه. این کار هم باعث کاهش زمان انتظار میشه و هم نیاز به تولید دوبارهی یک صدای ثابت رو از بین میبره. حتی اگر متن خوشآمدگویی، صدای مرجع یا تنظیمات مدل TTS تغییر کنه، Cache مربوط به این صدا مجدداً ساخته میشه.
و همین! 🙂
البته قبول دارم کدی که اینجا داریم لزوماً چیزی نیست که برای استفاده در یک محصول واقعی مستقیماً پیشنهاد بشه و همهی Best Practice ها هم رعایت نشده. علتش هم اینه که این پروژه از ابتدا با هدف آموزش ساخته شده و قدمبهقدم از چیزهایی که در قسمتهای قبلی ساختیم استفاده کردیم. اگر قرار باشه همین پروژه رو به یک محصول واقعی تبدیل کنیم، قطعاً باید بخشهایی مثل معماری، مدیریت خطا، همزمانی، تستها، امنیت و خیلی موارد دیگه باز طراحی و تکمیل بشن.
و بالاخره رسیدیم به آخر این مسیر!
ممنون از سیسوگ که این ماژول رو در اختیار من قرار داد تا بتونم این مجموعه مقالهها رو آماده کنم و با شما به اشتراک بذارم. خودم واقعاً از ساختن این پروژه لذت بردم و امیدوارم شما هم از خوندن و اجرای اونها لذت برده باشید. اگر این مجموعه مقالهها براتون جالب بود، خوشحال میشم برسونیدشون به دست آدمهایی که به این موضوعات علاقه دارن. 🙂 و در آخر هم از Codex و Antigravity تشکر میکنم که در تولید و توسعهی کد این پروژه کمکم کردن. این داستان اینجا تموم میشه… ولی پروژه تازه میتونه شروع بشه.
ریپازیتوری این پروژه: https://github.com/mthri/sisoog-ec25
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.