İçeriğe geç
Tüm Yazılar

8 Kasım 2026

Kendi Home Mini'ni Yap, Türkçe Konuştur

Google Home Mini Türkçe konuşmuyor; ben de 'Hey Jarvis' deyince uyanan, Türkçe konuşan, evi Home Assistant üzerinden yöneten bir asistan yaptım. Malzeme listesi, lehim, ESPHome kodu, 3D baskı kutu (STL'ler dahil) ve üç haftalık ince ayarın hepsi burada.

Akıllı EvHome AssistantESPHomeESP32-S3Sesli AsistanKendin Yap3D BaskıTürkçe

Evimde yıllardır bir Google Home Mini var. Anons hoparlörü olarak kusursuz: bulaşık makinesi bitince "bulaşık hazır" diyor, çocuklar okuldan gelince karşılıyor. Ama ona Türkçe bir şey sormak mümkün değil; Türkiye'de Türkçe asistan hiç gelmedi, "Hey Google" dışında bir isim veremezsiniz, beynini değiştiremezsiniz. Çocuklar "neden bizimle konuşmuyor" diye sorunca karar verdim: kendi asistanımızı yapacağız. Adı Jarvis olacak, Türkçe konuşacak, evi yönetecek.

Üç hafta sonra salonda 3D baskı bir kutunun içinde duran Jarvis, "Hey Jarvis, dışarısı kaç derece?" deyince "Dışarısı 8,6 derece, parçalı bulutlu" diyor; "arka lambayı aç" deyince açıp "Arka ışığı açtım" diyor; çocukların sorduğu bilmeceye bilmeceyle cevap veriyor. Bu yazı, aynısını yapmak isteyenler için her şey: parça listesi, lehim, firmware, ESPHome kodu, kutunun STL dosyaları ve öğrendiğim dersler.

Hazır akıllı hoparlör mü, kendin yap mı?
Home Mini'yi atmadım; anonslar hâlâ ondan çalıyor. Konuşmayı Jarvis yapıyor.

Malzeme listesi

Hepsi Türkiye'den (Robot Sepeti) geldi; elektronik toplamı bir akıllı hoparlör fiyatının altında.

ParçaNe işe yarıyorNot
Seeed ReSpeaker Lite (USB 2-Mic)İki mikrofon + XMOS XU316 ses işlemcisi: yankı ve gürültü temizleme, hoparlör çıkışıKartın üstünde XIAO yuvası, 3,5 mm jak, JST PH 2.0 hoparlör soketi var
Seeed XIAO ESP32-S3Wi-Fi + "Hey Jarvis" uyandırma kelimesini cihazda tanımaHarici anten takılı gelir (kutunun içinde kalıyor)
WS2812B LED halka, 12'li (Ø50 mm)Dinlerken kırmızı, düşünürken mor, konuşurken yeşil16'lı (Ø67) da olur; kutu 12'liye göre
Hoparlör Ø45 mm, 4 Ω 5 WKutu içi sesAlternatif: 3,5 mm jaktan harici bir set
USB-C adaptör 5 V 2–3 ABesleme, ReSpeaker'ın kendi USB-C'sindenTelefon şarjı yeter
Pin header 2×7 (XIAO için), 3 kablo, (isteğe bağlı) 330 Ω direnç, 1000 µF kondansatörLehim
3D baskı kutu, 5 parça, PETGAşağıda, STL'ler yazının sonunda~60 g filament

Yazılım: ESPHome (Home Assistant eklentisi) + formatBCE'nin ReSpeaker Lite paketi. Seeed'in resmi yoluna göre çok daha az uğraş; Home Assistant'ın kendi Voice PE cihazının bütün özellikleri geliyor.

Fotoğraflarla montaj

ReSpeaker Lite kutunun içinde
ReSpeaker Lite, iki mikrofon (MIC 1 / MIC 2) kartın iki ucunda. Üstteki Usr/Mute butonları ve XIAO yuvası görünüyor. Kutu ilk sürüm; USB-C ve jak deliklerini sonraki sürümde 1 mm büyüttüm.
XIAO ESP32-S3 kartın üstünde
XIAO pin header ile oturuyor; antenin küçük kablosu kartın üstüne bantla sabit. Alttaki yeşil LED ReSpeaker'ın güç LED'i, turuncu XIAO'nun şarj LED'i.
USB-C ve 3,5 mm jak delikleri
Kutunun kısa kenarında iki delik: güç için USB-C, harici hoparlör için 3,5 mm jak. İkisi de ReSpeaker'ın kendi soketleri; XIAO'nun USB-C'si sadece ilk firmware yüklemesi için.
LED halka, kapak ve parçalar
16'lı halka, kapak ve kutu. Kapaktaki delikler mikrofon sesini geçiriyor; ortadaki daire difüzörün yeri.
LED halka lehimi
Halkada üç kablo: kırmızı 5V, siyah GND, mavi DIN. İlk denemede mavi kabloyu GND pedine lehimlemiştim; ne halka ne kartın kendi LED'i yandı. Lehimden önce fotoğraf çekip pedleri okuyun.
LED halka çalışıyor
İlk test: "Hey Jarvis" sonrası halka yanıyor. Kutuya girince difüzör bu ışığı yumuşatıyor.
Jarvis'in içi — şema
Üç kablo, iki lehim köprüsü. Hepsini bir akşamda bitirdim.

Lehim: üç kablo, iki köprü

1. XIAO'yu ReSpeaker'a. Kartın üstünde XIAO'nun yeri ve USB-C ucunun yönü çizili; o çizime göre, pin header ile lehimleyin (doğrudan yüzeye değil; sökmek gerekirse kolay oluyor). Ben ilk hafta header'ı lehimsiz "takarak" kullandım; ses kesik kesik geldi, iki hafta Wi-Fi'dan şüphelendim. Sorun temassızlıktı. Lehimleyin.

2. Buton köprüleri. ReSpeaker'daki iki buton XIAO'ya lehim köprüsüyle bağlanıyor: USR → D2, MUTE → D3. Yapılmazsa butonlar ve yazılımdan mikrofon kapatma çalışmıyor.

3. LED halka. Halkanın arkasında dört ped: DI (DIN), DO, 5V, GND. DO boş kalır.

Halka→XIAO
DIN→D0 (GPIO1)
5V→5V
GND→GND

D0 zaten kartın kendi RGB LED'ini sürüyor; halka ona paralel bağlanıyor, ikisi birlikte yanıyor. Başka boş pin yok, bilinçli tercih. Data hattına seri 330 Ω direnç sinyali korur; halka titrerse 5V hattına bir 1N4001 diyot (voltajı 4,3 V'a düşürüp 3,3 V sinyali daha iyi okutur). Halkanın DIN pedi lehimde kalkarsa (benimki kalktı) kabloyu doğrudan ilk LED'in DIN bacağına lehimleyebilirsiniz.

4. Hoparlör. JST PH 2.0 2 pinli kabloyla kartın SPK soketine. Harici set kullanacaksanız 3,5 mm jak.

XMOS firmware'i (bir kez)

ReSpeaker fabrikadan USB mikrofon modunda geliyor; Home Assistant için I2S 48 kHz firmware'i yüklenmeli. Kabloyu ReSpeaker'ın kendi USB-C'sine (jakın yanındaki) takın, XIAO'nunkine değil:

bash
brew install dfu-util          # Linux: apt install dfu-util
dfu-util -l                    # kartı gör
dfu-util -R -e -a 1 -D respeaker_lite_i2s_dfu_firmware_48k_v1.1.0.bin

Dosya formatBCE'nin GitHub deposundaki sürümle aynı etiketten indirilir (ör. 2026.10.3). Yükleme sırasında kabloyu çekmeyin; bitince çıkarıp takın.

ESPHome: tüm kod

Home Assistant → ESPHome Builder → yeni cihaz → ESP32-S3 → kurulumu atlayıp editöre şunu yapıştırın. Paket tüm ses işini yapıyor; dosya yalnızca LED halkayı ve Jarvis renklerini değiştiriyor:

yaml
substitutions:
  respeaker_lite_ref: 2026.10.3

packages:
  respeaker-satellite: github://formatBCE/Respeaker-Lite-ESPHome-integration/config/common/respeaker-satellite-base.yaml@${respeaker_lite_ref}

esphome:
  name: jarvis-salon
  friendly_name: Jarvis Salon

wifi:
  power_save_mode: none        # (1) ses kesilmesinin ilk çözümü
  output_power: 11dB           # (2) modemin dibindeyse verici gücünü düşür

improv_serial:                 # Wi-Fi bilgisi ilk yüklemede web.esphome.io'dan girilir

ota:
  - platform: esphome
    id: ota_esphome

speaker:
  - id: !extend i2s_audio_speaker
    buffer_duration: 600ms     # (3) paket varsayılanı 100 ms; takılmanın asıl çözümü

button:
  - platform: restart
    name: Yeniden Başlat

sensor:
  - platform: wifi_signal
    name: Wi-Fi sinyal
    update_interval: 60s

light:
  - id: !remove led_internal
  - id: !remove led_respeaker_onboard

  - platform: esp32_rmt_led_strip
    id: led_internal
    internal: true
    channel_colors: GRB
    pin: GPIO1                 # XIAO D0
    num_leds: 12               # 16'lı halkada 16
    rmt_symbols: 192
    bit0_high: 300ns
    bit0_low: 975ns
    bit1_high: 650ns
    bit1_low: 650ns
    reset_low: 300us
    reset_high: 0us
    max_refresh_rate: 15ms
    default_transition_length: 0s
    color_correct: [55%, 55%, 55%]   # güç sınırı: 12 LED beyazda ~0,4 A
    effects:
      - addressable_lambda:
          name: "Slow Pulse"
          update_interval: 30ms
          lambda: |-
            static float f = 0.0; static bool up = true;
            auto v = id(led_internal)->current_values;
            Color c(v.get_red() * 255, v.get_green() * 255, v.get_blue() * 255);
            it.all() = Color(c.red * f, c.green * f, c.blue * f);
            f += up ? 0.05 : -0.05;
            if (f > 1.0) { f = 1.0; up = false; } else if (f < 0.0) { f = 0.0; up = true; }
      - addressable_lambda:
          name: "Fast Pulse"
          update_interval: 10ms
          lambda: |-
            static float f = 0.0; static bool up = true;
            auto v = id(led_internal)->current_values;
            Color c(v.get_red() * 255, v.get_green() * 255, v.get_blue() * 255);
            it.all() = Color(c.red * f, c.green * f, c.blue * f);
            f += up ? 0.05 : -0.05;
            if (f > 1.0) { f = 1.0; up = false; } else if (f < 0.0) { f = 0.0; up = true; }
      - addressable_lambda:
          name: "Spin"            # düşünürken halkada dönen kuyruklu ışık
          update_interval: 45ms
          lambda: |-
            static int head = 0;
            auto v = id(led_internal)->current_values;
            Color c(v.get_red() * 255, v.get_green() * 255, v.get_blue() * 255);
            const int n = it.size();
            for (int i = 0; i < n; i++) {
              int d = (head - i + n) % n;
              float f = d == 0 ? 1.0f : d == 1 ? 0.5f : d == 2 ? 0.22f : d == 3 ? 0.08f : 0.0f;
              it[i] = Color(c.red * f, c.green * f, c.blue * f);
            }
            head = (head + 1) % n;

  - platform: partition         # HA'dan açılıp kapatılabilen "gece lambası" ışığı
    id: led_respeaker_onboard
    name: LED halka
    entity_category: config
    restore_mode: RESTORE_DEFAULT_OFF   # boşta sönük; sadece "Hey Jarvis" sonrası yanar
    segments:
      - id: led_internal
        from: 0
        to: 11

script:
  - id: !remove control_leds_voice_assistant_waiting_for_command_phase
  - id: !remove control_leds_voice_assistant_listening_for_command_phase
  - id: !remove control_leds_voice_assistant_thinking_phase
  - id: !remove control_leds_voice_assistant_replying_phase

  - id: control_leds_voice_assistant_waiting_for_command_phase   # "Hey Jarvis" dedin, bekliyor
    then:
      - light.turn_on: {id: led_internal, brightness: 35%, red: 100%, green: 0%, blue: 0%, effect: "Slow Pulse"}
  - id: control_leds_voice_assistant_listening_for_command_phase # dinliyor
    then:
      - light.turn_on: {id: led_internal, brightness: 35%, red: 100%, green: 0%, blue: 0%, effect: "None"}
  - id: control_leds_voice_assistant_thinking_phase              # düşünüyor
    then:
      - light.turn_on: {id: led_internal, brightness: 35%, red: 70%, green: 0%, blue: 100%, effect: "Spin"}
  - id: control_leds_voice_assistant_replying_phase              # konuşuyor
    then:
      - light.turn_on: {id: led_internal, brightness: 35%, red: 0%, green: 100%, blue: 25%, effect: "Fast Pulse"}

Derlemesi Raspberry Pi'de yarım saat sürüyor; sabır. İlk yükleme: Install → Manual download → Factory, sonra kabloyu XIAO'nun USB-C'sine takıp Chrome'da web.esphome.io → Install. Sonrakiler kablosuz (OTA). İlk açılışta XMOS sürümü doğrulanır; LED beyaz yanıp sönerken gücü kesmeyin.

Numaralı üç satır benim üç haftamı yedi:

  1. power_save_mode: none — ESP32 varsayılanı Wi-Fi'ı uyutup uyandırıyor; ses akışı kesik geliyor.
  2. output_power: 11dB — Jarvis modemin hemen yanında (−20 dBm). Çok güçlü sinyal de sorun çıkarıyor.
  3. buffer_duration: 600ms — asıl çözüm. Paketin 100 ms tamponu her cümlenin başında takılıyordu. !extend yazmazsanız "platform key" hatası alırsınız.

Home Assistant ayarları

  • Cihaz → Uyandırma kelimesi: Hey Jarvis (cihazda tanınıyor, bulut yok). Hassasiyet: "Slightly sensitive".
  • Bitmiş konuşma tespiti: relaxed. "Aggressive" ile cümlenin sonunu yiyordu.
  • Ayarlar → Sesli asistanlar → yeni hat: STT, beyin, TTS. Seçimlerim aşağıda. "Komutları önce yerelde işle" açık: "arka ışığı aç" LLM'e gitmeden 0,3 saniyede çalışıyor.
  • Cihaz sayfasında asistan olarak bu hattı seçin.
  • Cihazı HA'da bir alana koyun; o alandaki cihazları yerel komutla açınca konuşmak yerine sadece onay sesi çalıyor, çok daha az yorucu.
  • Jarvis'in LED halkasını başka otomasyonlardan da sürebilirsiniz (light.jarvis_salon_led_halka): gol olunca kırmızı-sarı, doğum gününde gökkuşağı.

Türkçe: asıl zor kısım

Donanım bir akşamda bitti; Türkçe'yi düzgün konuşturmak üç hafta sürdü.

Ses tanıma (STT). Ücretsiz Whisper kısa Türkçe komutlarda uyduruyor ("dekoratif ışığı aç"ı "ağaç" diye duydu). Groq üzerinden Whisper large-v3 daha iyi, cihaz adlarını ipucu metni olarak vermek de yardımcı oluyor; ama en isabetlisi Google'ın bulut STT'si. Tamamen yerel istiyorsanız Türkçe için ince ayarlı Whisper modelleri var; kalite farkı hissediliyor.

Beyin (LLM). Evdeki bir bilgisayarda çalışan Gemma 4; bilgisayar kapalıyken Gemini. Ayrıntısı ve talimatın tamamı Hibrit Yapay Zekâlı Ev Kontrol Sistemi yazısında. Hangi model olursa olsun asıl iş talimatta: "cihaz belirsizse sor, tahmin etme", "televizyon sesine cevap verme", "sayıları rakamla yaz" gibi kurallar olmadan asistan kafasına göre ışık kapatıyor.

Seslendirme (TTS). Edge TTS'in Türkçe "Emel" sesi doğal ve ücretsiz. Tamamen yerel Piper'ın Türkçe sesleri var ama daha robotik. Tuzak: cevabın sonuna "." koyunca TTS 8 saniye takılıyordu, "Ok." çözdü. Emoji ve madde işareti sesli okunduğu için talimatta yasak.

İngilizce hata mesajı. Beyin hata verince HA "Sorry, I had a problem…" diyor. Firmware'e bir satır ekleyip (on_tts_start: metin "Sorry" ile başlıyorsa bayrak kaldır) HA'da "Bir sorun oldu, tekrar dener misin?" dedirtiyorum.

Aile. Talimatta aile üyeleri tanıtılı; çocuklara sabırlı ve basit anlatıyor, sohbet sürerken kısa bir soruyla devam ediyor. Küçük olan bilmece sorduruyor, büyük olan maç skoru soruyor (internet arama aracı sayesinde cevap veriyor).

Kutu: 3D baskı, beş parça

Kutuyu kendim tasarladım (Python + Manifold ile parametrik), beş sürüm oldu: ilkine halka sığmadı, ikincide jak deliği dar geldi, üçüncüsü raylı oturma ve klipsli kapak, dördüncüsü altında hoparlör bölmesi, beşincide jak ve USB-C ağızları yüzde 20 büyüdü, hoparlör kablosunun deliği kartın soket ucuna taşındı.

Jarvis kutusu — patlatılmış görünüm
Yukarıdan aşağı: delikli kapak, difüzör, LED halka, ReSpeaker Lite + XIAO, taban. Bu ikinci sürümün çizimi; dördüncü sürüm aynı yapının altına hoparlör bölmesi ve ayaklar ekliyor, aşağıdaki 3D modelde görebilirsiniz.
  • Dış ölçü 91 × 59 × 57 mm; kart tabanının iç genişliği 54 mm.
  • ReSpeaker iki uzun kenardaki raylara kayarak oturuyor, iki adet M2×5 vida ile sabitleniyor.
  • Kapak klipsli; XIAO ucundaki çentikten tırnakla açılıyor.
  • Hoparlör tabana ağzı aşağı bakacak şekilde oturuyor, ses ızgaradan ve ayakların açtığı boşluktan çıkıyor. Kablosu Ø5 delikten kart tabanına geçiyor.
  • Baskı: PETG, 0,2 mm katman, %20 dolgu, destek yok (her parça düz yüzü tablaya gelecek şekilde tasarlandı). Toplam ~3,5 saat.

STL dosyaları: jarvis_hoparlor_govdesi.stl, jarvis_taban.stl, jarvis_difuzor.stl, jarvis_kapak.stl, jarvis_ayaklar_4adet.stl — jarvis-kutu-v5-stl.zip. 16'lı halka ya da hoparlörsüz sürüm isteyen İletişim'den yazsın, parametrik dosyadan üretip gönderirim.

Ne kadar sürdü, ne kadar tuttu

Zaman: lehim ve kutu bir hafta sonu, yazılım ve Türkçe ince ayar üç haftaya yayılan akşamlar. Bugün Jarvis'in cevap süresi, uyandırmadan sesin çalmasına kadar 2–3 saniye; yerel komutlar 0,3 saniye.

Sonuç

Google Home Mini Türkçe konuşmuyor ve konuşmayacak. Ama bir hafta sonu ve dört parçayla, istediğiniz isme cevap veren, Türkçe konuşan, beynini istediğiniz zaman değiştirebildiğiniz ve evinizi gerçekten yöneten bir asistan yapmak mümkün. Üstelik ne söylediğinizin kimin sunucusuna gittiğine siz karar veriyorsunuz.

Sorular, takıldığınız yerler ve kendi Jarvis'lerinizin fotoğrafları için İletişim sayfasından yazabilirsiniz.

Kaynaklar: formatBCE/Respeaker-Lite-ESPHome-integration (GitHub); Seeed ReSpeaker Lite wiki; Home Assistant "Assist" ve "Voice" dokümanları; ESPHome esp32_rmt_led_strip ve i2s_audio dokümanları.

Yorumlar

Yorumlar yükleniyor…

Yorum yaz

Yorumlar yayınlanmadan önce incelenir. Bağlantı (link) içeren yorumlar kabul edilmez.

Adınız yorumla birlikte görünür. E-posta istenmez; IP adresiniz yalnızca kötüye kullanımı önlemek için anonim (hash) olarak tutulur.