دستیار صوتی هوش مصنوعی شخصی برای Home Assistant با ESP32
همیشه دوست داشتی یک دستیار صوتی هوشمند توی خونه داشته باشی، اما دستیارهای معمولی مثل الکسا یا سیری برات خیلی محدود و خستهکننده به نظر میان؟ تو این پروژه از "آیسیمدار" میخوایم یه قدم خیلی بزرگ برداریم و دستیار صوتی خودمون رو بسازیم؛ اون هم با مغز متفکر هوش مصنوعی (مثل ChatGPT) و صداهای فوقالعاده طبیعی!
این پروژه بهت اجازه میده یه گجت کوچیک، ارزون و کاملا سفارشی بسازی که با سیستم خانه هوشمندت (Home Assistant) یکپارچه میشه. این یعنی نهتنها میتونی باهاش گپ بزنی و جوابهای هوشمندانه بگیری، بلکه میتونی ازش بخوای چراغها رو خاموش کنه یا وقتی وارد آشپزخونه شدی، خودش بهت صبحبخیر بگه و اخبار رو بخونه.
ساخت این گجت هم به شدت ساده و لذتبخش طراحی شده. فقط به یه برد کوچیک ESP32، یه میکروفون، یه آمپلیفایر و یه اسپیکر نیاز داریم. پس قطعاتت رو آماده کن تا بریم سراغ خلق جذابترین عضو هوشمند خونهات!
قطعات موردنیاز
- برد Waveshare ESP32-S3 Zero
- اسپیکر 8 اهم 2 وات (مدل گرد 28 میلیمتری)
- ماژول آمپلیفایر صوتی MAX98357 I2S
- ماژول میکروفون I2S MEMS
- سیم جامپر (ماده به ماده)
راههای جایگزین: آماده بخریم یا خودمون بسازیم؟
بخش اول این آموزش بهت یاد میده چطور یه دستگاه کوچیک و ارزون بسازی تا بتونی با دستیارت صحبت کنی و جوابش رو بشنوی. ساختن این مدار با دستای خودت، هم خیلی جذابه، هم هزینههات رو پایین میاره و هم دستت برای شخصیسازی بازه. اما اگه اصلا حوصله لحیمکاری و سیمکشی نداری، دستگاههای آمادهای تو بازار هستن که دقیقا همین کار رو میکنن.
اگه از اونا استفاده میکنی، میتونی مستقیم بری سراغ قدم چهارم. یکی از این گزینههای آماده Home Assistant Voice PE هست. گزینه مقرونبهصرفهتر دیگه، دستگاه M5Stack ATOM Echo هست که برای این کار عالی جواب میده.
سیمکشی و اتصالات سختافزاری
کار سختافزاری ما خیلی سادست! اول باید اسپیکر رو به آمپلیفایر وصل کنی، بعد آمپلیفایر و میکروفون رو به برد ESP32 متصل کنی. کل کار همینه.
اتصال میکروفون به ESP32-S3
- تغذیه: پین VDD یا 3 ولت به پین 3.3 ولت برد
- زمین: پین GND به GND برد
- انتخاب کانال: پین SEL به GND برد
- انتخاب کلمه: پین WS یا LRC به پین GP1 برد
- کلاک: پین SCK یا BCLK به پین GP2 برد
- خروجی دیتا: پین SD یا DOUT به پین GP3 برد
اتصال آمپلیفایر MAX98357A به ESP32-S3
- تغذیه: پین Vin به 5 ولت برد
- زمین: پین GND به GND برد
- پین LRC به GP4
- پین BCLK به GP5
- پین DIN به GP6
- پین GAIN رو خالی بذار (وصل نکن)
- پین SD رو هم خالی بذار
نصب فریمور با ESPHome
برای ریختن فریمور روی برد، از ابزار ESPHome استفاده میکنیم. برد ESP32 رو به کامپیوترت وصل کن و از طریق مرورگر به نسخه وب ESPHome برو، یا اگه روی Home Assistant افزونه ESPHome Device Builder رو داری، مستقیم از همونجا کار رو پیش ببر. فقط یادت باشه که ادآن ESPHome باید روی سیستمت نصب باشه.
مراحل انجام کار به این شکله:
- توی Home Assistant، افزونه ESPHome Device Builder رو باز کن.
- روی New Device کلیک کن، اسمش رو بذار voice-assistant، برد ESP32-S3 رو انتخاب کن و بعد Skip رو بزن.
- حالا روی Edit کلیک کن و کدهای زیر رو کپی کرده و جایگزین تمام محتوای قبلی کن.
esphome:
name: basic-voice-assistant
friendly_name: Basic Voice Assistant
esp32:
board: waveshare_esp32_s3_zero
framework:
type: esp-idf
psram:
mode: quad
speed: 80MHz
logger:
level: INFO
api:
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
i2s_audio:
- id: i2s_mic
i2s_lrclk_pin: GPIO2
i2s_bclk_pin: GPIO1
- id: i2s_spk
i2s_lrclk_pin: GPIO5
i2s_bclk_pin: GPIO4
microphone:
- platform: i2s_audio
adc_type: external
pdm: false
id: mic_i2s
channel: left
bits_per_sample: 32bit
i2s_audio_id: i2s_mic
i2s_din_pin: GPIO3
speaker:
- platform: i2s_audio
id: i2s_speaker
dac_type: external
i2s_dout_pin: GPIO6
i2s_audio_id: i2s_spk
sample_rate: 16000
bits_per_sample: 16bit
channel: mono
buffer_duration: 500ms
media_player:
- platform: speaker
id: media_out
name: "Media Player"
announcement_pipeline:
speaker: i2s_speaker
format: MP3
num_channels: 2
light:
- platform: esp32_rmt_led_strip
id: status_led
name: "Status LED"
pin: GPIO21
num_leds: 1
chipset: WS2812
rgb_order: GRB
effects:
- pulse:
name: "Pulse"
transition_length: 0.5s
update_interval: 0.5s
binary_sensor:
- platform: status
name: "API Connection"
id: api_connection
filters:
- delayed_on: 1s
on_press:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
- script.execute: led_idle
on_release:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
- script.execute: led_off
script:
- id: led_idle
then:
- light.turn_on:
id: status_led
brightness: 30%
red: 0%
green: 0%
blue: 100%
effect: "Pulse"
- id: led_listening
then:
- light.turn_on:
id: status_led
brightness: 100%
red: 0%
green: 100%
blue: 100%
effect: "None"
- id: led_thinking
then:
- light.turn_on:
id: status_led
brightness: 100%
red: 100%
green: 80%
blue: 0%
effect: "None"
- id: led_speaking
then:
- light.turn_on:
id: status_led
brightness: 100%
red: 0%
green: 100%
blue: 0%
effect: "None"
- id: led_error
then:
- light.turn_on:
id: status_led
brightness: 100%
red: 100%
green: 0%
blue: 0%
effect: "None"
- id: led_off
then:
- light.turn_off:
id: status_led
- id: restart_va
then:
- delay: 500ms
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
- script.execute: led_idle
voice_assistant:
microphone: mic_i2s
media_player: media_out
id: va
noise_suppression_level: 2
auto_gain: 31dBFS
volume_multiplier: 4.0
use_wake_word: true
on_wake_word_detected:
- script.execute: led_listening
on_listening:
- script.execute: led_listening
on_stt_vad_start:
- script.execute: led_listening
on_stt_end:
- script.execute: led_thinking
on_tts_start:
- script.execute: led_speaking
on_end:
- wait_until:
condition:
speaker.is_playing: i2s_speaker
timeout: 10s
- wait_until:
condition:
not:
- speaker.is_playing: i2s_speaker
timeout: 120s
- delay: 300ms
- if:
condition:
switch.is_on: use_wake_word
then:
- script.execute: led_idle
else:
- script.execute: led_off
on_error:
- script.execute: led_error
- delay: 2s
- script.execute: restart_va
on_client_connected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
- script.execute: led_idle
on_client_disconnected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
- script.execute: led_off
switch:
- platform: template
name: "Use wake word"
id: use_wake_word
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
entity_category: config
on_turn_on:
- lambda: id(va).set_use_wake_word(true);
- if:
condition:
not:
- voice_assistant.is_running
then:
- voice_assistant.start_continuous
- script.execute: led_idle
on_turn_off:
- voice_assistant.stop
- lambda: id(va).set_use_wake_word(false);
- script.execute: led_off
- از بالا سمت راست روی Secrets کلیک کن و نام وایفای (SSID) و رمز عبورت رو اونجا وارد کن.
# Your Wi-Fi SSID and password
wifi_ssid: "[WIFI NETWORK NAME]"
wifi_password: "[PASSWORD]"
# OTA update password (used by the basic-voice-assistant config)
ota_password: "[PASSWORD]" #Choose any password you like
- روی Install کلیک کن. برای اولین بار که میخوای برد رو فلش کنی، باید با کابل USB به کامپیوتر وصل باشه. اگه سیستم برد رو نشناخت، موقع وصل کردن کابل، دکمه BOOT روی برد رو نگه دار. آپدیتهای بعدی به صورت بیسیم (OTA) انجام میشن.
اتصال مغز متفکر هوش مصنوعی (ChatGPT)
از اینجا به بعد، فرقی نمیکنه دستگاه رو خودت ساخته باشی یا آماده خریده باشی؛ تنظیمات نرمافزاری کاملا یکسانه. ما باید سه تا ویژگی به سیستممون اضافه کنیم: یک مغز هوش مصنوعی، یک صدای طبیعی و یه سیستم تشخیص گفتار.
راهاندازی مغز هوش مصنوعی (ChatGPT)
این بخش به دستیارت قدرت میده تا مکالمات هوشمندانه و پاسخهای منطقی داشته باشه. مدلهای مختلفی مثل Gemini یا Claude قابل استفاده هستن، اما من اینجا از ChatGPT استفاده میکنم چون راهاندازیش از همه راحتتره.
اول باید افزونه OpenAI Conversation رو اضافه کنیم. برو به پلتفرم API سایت OpenAI، یه اکانت بساز و توی بخش API keys، روی گزینه Create new secret key کلیک کن تا یه کلید اختصاصی بهت بده.
حالا تو محیط Home Assistant برو به مسیر Settings و بعد Devices & Services. ادآن OpenAI رو باز کن، سرویس رو اضافه کن و وقتی ازت خواست، همون کلید API که ساختی رو وارد کن.
صدای دستیار صوتی (ElevenLabs)
تبدیل متن به صدا با ElevenLabs
سیستم تبدیل متن به صدا (TTS) وظیفه داره متن تولید شده توسط هوش مصنوعی رو به یه صدای واقعگرایانه و انسانی تبدیل کنه. گزینههای زیادی برای این کار هست، اما من ElevenLabs رو انتخاب کردم چون هزاران صدای باکیفیت و جذاب داره. پس باید این ادآن رو نصب کنیم.
برای این کار، برو تو سایت ElevenLabs و ثبتنام کن. تب API keys رو باز کن و روی Create key کلیک کن تا یه کلید بهت بده. حالا تو Home Assistant افزونه ElevenLabs رو باز کن، Add service رو بزن و این کلید رو وارد کن.
تشخیص صدا و کلمه بیدارباش (Wyoming Protocol)
تبدیل گفتار به متن با پروتکل Wyoming
ادآن Wyoming Protocol وظیفه تبدیل گفتار به متن (STT) رو بر عهده داره؛ یعنی حرفهایی که میزنی رو به متن تبدیل میکنه تا برای هوش مصنوعی ارسال بشه. علاوه بر این، ابزار OpenWakeWord رو هم در اختیارت میذاره که باهاش میتونی یه کلمه بیدارباش (مثل Hey Siri) اختصاصی برای خودت بسازی. پس این ادآن رو هم به سیستم اضافه کن.
راهاندازی و تنظیم نهایی دستیار
حالا که همه چی نصبه، تو Home Assistant برو به Settings و بعد Voice assistants. روی Add assistant کلیک کن، یه اسم براش بذار و زبان مورد نظرت رو انتخاب کن.
انتخاب مغز متفکر (Conversation agent)
توی بخش Conversation agent، باید سرویس OpenAI که قبلا تنظیمش کردی رو انتخاب کنی.
شخصیت دادن به دستیار
روی آیکون چرخدنده کنار اسم agent کلیک کن تا باکس Instructions باز بشه. اینجا میتونی مشخص کنی هوش مصنوعی با چه لحنی جواب بده. از "همیشه عصبانی باش" گرفته تا "مثل یه فیلسوف حرف بزن"! پیشنهاد میکنم بهش بگی جوابها رو کوتاه بده، چون خوندن متنهای طولانی از طریق اسپیکر کمی خستهکننده میشه.
تنظیمات تشخیص و پخش صدا
برای بخش تبدیل گفتار به متن (Speech-to-text)، گزینه Whisper رو انتخاب کن که سرعت خیلی خوبی داره. برای بخش متن به صدا (Text-to-speech) هم ElevenLabs رو انتخاب کن و از لیست بلندبالای صداهای زن، مرد، لهجههای مختلف و... اونی که بیشتر دوست داری رو برای دستیارت مشخص کن.
ساخت کلمه بیدارباش اختصاصی
کلمه بیدارباش همون عبارتیه که وقتی میگیش، دستیارت شروع میکنه به گوش دادن. میتونی از گزینههای پیشفرض مثل Alexa استفاده کنی، اما اگه میخوای یه کلمه کاملا اختصاصی برای خودت داشته باشی، باید از ابزار آموزش OpenWakeWord (که بر بستر Google Colab اجرا میشه) کمک بگیری.
کلمهای که دوست داری رو تو بخش target word بنویس (بهتره کلمهات حداقل دو بخش یا سیلاب داشته باشه). از بالای صفحه روی Run all کلیک کن. این ابزار هزاران صدای مصنوعی که اون کلمه رو میگن تولید میکنه و به یه مدل هوش مصنوعی یاد میده که اون رو تشخیص بده. این پروسه بین 20 دقیقه تا یه ساعت طول میکشه.
در نهایت یه فایل بهت میده که باید تو Home Assistant آپلود کنی و به عنوان کلمه بیدارباش تنظیمش کنی.
معرفی دستگاههای هوشمند به دستیار
توی تب Expose در تنظیمات، میتونی مشخص کنی که دستیار صوتیت به کدوم یکی از دستگاههای هوشمندت دسترسی داشته باشه. اینطوری میتونه مستقیما اونها رو کنترل کنه یا وضعیت سنسورها رو برات بخونه.
فراتر از کلمه بیدارباش: اتوماسیونهای جذاب
حالا میرسیم به جذابترین بخش ماجرا! تو مجبور نیستی همیشه برای حرف زدن با دستیارت از کلمه بیدارباش استفاده کنی؛ میتونی اون رو از طریق اتوماسیونها هم فعال کنی. این یعنی دستیارت میتونه بدون اینکه تو چیزی بهش بگی، بر اساس وضعیت سنسورهای خونه شروع به صحبت کنه. این کار باعث میشه حس کنی یه موجود واقعا زنده تو خونه داری!
ایده اصلی اینه: کلمه بیدارباش فقط یکی از راههای شروع مکالمه است. اجرای یه اتوماسیون هم راه دومه. میتونی یه متن رو از طریق اتوماسیون براش بفرستی تا اون رو بلند اعلام کنه. برای این کار برو به Settings و بعد Automations & scenes.
روی Create automation کلیک کن. محرک (Trigger) رو هر چیزی که دوست داری بذار؛ مثلا باز شدن در، تغییر وضعیت سنسور حرکتی، یا یه ساعت خاص (مثلا هر روز ساعت 07:30 صبح به عنوان آلارم و ارائه یه گزارش صوتی). بعد تو بخش اکشن، گزینه Assist Satellite رو انتخاب کن تا مکالمه با هوش مصنوعی استارت بخوره.
چند ایده جالب برای اتوماسیون
- گزارش صبحگاهی: محرک رو روی سنسور حرکتی آشپزخونه بذار (فقط بین ساعت 6 تا 9 صبح) تا وضعیت آبوهوا رو برات بخونه.
- پایان کار ماشین لباسشویی: وقتی ماشین خاموش شد، دستیارت بهت یادآوری کنه که لباسها رو در بیاری.
- کسی پشت دره: با زنگ خوردن در، هوش مصنوعی با یه لحن بامزه حضورت مهمون رو اعلام کنه.
- غروب آفتاب: پردههای هوشمند بسته بشن و دستیارت این رو بهت اعلام کنه.
امیدوارم از این آموزش اختصاصی "آیسیمدار" لذت برده باشی. حالا کافیه کلمه بیدارباش رو بگی و از گپ زدن با دستیار صوتی شخصی خودت تو یه خونه هوشمند حسابی کیف کنی! اگه تو مراحل ساخت به مشکلی خوردی یا ایده باحالی برای اتوماسیونها داری، حتما تو بخش نظرات برامون بنویس تا با هم در موردش حرف بزنیم.
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!