Hast du dich jemals gefragt, wie du deinen Sprachassistenten wie Amazon Alexa oder Google Home durch einen lokalen Sprachassistenten ersetzen kannst, der deine Sprachdaten nicht um die Welt schickt, sondern alles lokal bei dir zu Hause verarbeitet, weil du dir Sorgen machst, wie die großen Konzerne deine Daten verwenden? Oder bist du einfach nicht zufrieden mit den Funktionen und der Intelligenz, die sie bieten, und möchtest eigene Funktionen hinzufügen?

Wenn deine Antwort „ja“ lautet, dann ist diese Beitragsreihe perfekt für dich. Ich zeige dir in verschiedenen Episoden, wie du deinen eigenen, lokalen Sprachassistenten bauen kannst.

In dieser ersten Episode konzentriere ich mich darauf, einen groben Prototyp zu bauen. In den kommenden Episoden werden wir ein Gehäuse bauen und den Assistenten noch intelligenter machen!

Das folgende Video gibt dir einen Überblick darüber, was passieren wird. Alle Schritte werden im folgenden Artikel detaillierter erklärt. Hinweis: Video nur auf Englisch.

Überblick über die Architektur

Das folgende Schaubild zeigt die Gesamtarchitektur des Systems. Im Zentrum der Architektur steht ein ESP32-Entwicklungsboard mit installiertem ESPHome. Das ESP32-Entwicklungsboard ist mit einem Mikrofon (zum Aufzeichnen deiner Stimme), einem Verstärker und einem Lautsprecher (zum Antworten) und einem LED-Kreis (zur Anzeige des Status) verbunden. Das ESP32 kommuniziert mit Home Assistant und sendet die Sprachaufnahmen, um das Aktivierungswort zu erkennen. Wenn das Aktivierungswort erkannt wurde, hört es auf Befehle.

Benötigte Teile und Werkzeuge

  • INMP441 Mikrofon
  • MAX98375A Verstärker
  • 5W Lautsprecher
  • WS2812 RGB LED Ring
  • ESP32-Entwicklungsboard (Ich benutze ein ESP32 DEV Kit C NodeMCU)
  • Home Assistant Installation mit installiertem ESPHome Add-on (Besuche https://www.home-assistant.io/ und https://esphome.io/ für Details zur Einrichtung)

Schritt 1: Verkabelung

Das folgende Bild zeigt genau, wie alles verkabelt werden muss. Die von mir gewählten Pins zum Anschließen des Mikrofons und des Verstärkers an das ESP32 sind nur Beispiele. Du kannst auch andere verwenden, musst dann jedoch auch die YAML-Datei anpassen (Schritt 2).

Schritt 2: ESPHome YAML-Code schreiben

Dies ist mein Beispiel-ESPHome-YAML-Code, um den Sprachassistenten sowie den LED-Ring prototypisch zum Laufen zu bringen:

esphome:
  name: my-smart-speaker
  friendly_name: my-smart-speaker

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
  level: DEBUG
  
# Enable Home Assistant API
api:
  encryption:
    key: <YOUR_ENCRYPTION_KEY>

ota:
  password: <YOUR_OTA_PASSWORD>

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "My-Smart-Speaker"
    password: <YOUR_HOTSPOT_FALLBACK_PASSWORD>

captive_portal:



i2s_audio:
  - id: i2s_in
    i2s_lrclk_pin: GPIO27
    i2s_bclk_pin: GPIO26
  - id: i2s_out
    i2s_lrclk_pin: GPIO25
    i2s_bclk_pin: GPIO14

microphone:
  - platform: i2s_audio
    i2s_audio_id: i2s_in
    adc_type: external
    pdm: false
    id: mic_i2s
    i2s_din_pin: GPIO13
    bits_per_sample: 32bit

speaker:
  - platform: i2s_audio
    i2s_audio_id: i2s_out
    id: speaker_i2s
    dac_type: external
    i2s_dout_pin: GPIO32
    mode: mono

voice_assistant:
  microphone: mic_i2s
  speaker: speaker_i2s
  use_wake_word: false
  noise_suppression_level: 3
  auto_gain: 31dBFS
  volume_multiplier: 2.0
  id: assist
  on_end:
  - light.turn_off:
      id: led_ring
  on_wake_word_detected:
  - light.addressable_set:
      id: led_ring
      range_from: 16
      range_to: 17
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 15
      range_to: 18
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 14
      range_to: 19
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 13
      range_to: 20
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 12
      range_to: 21
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 11
      range_to: 22
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 10
      range_to: 23
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 9
      range_to: 1
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 9
      range_to: 24
      red: 0%
      green: 0%
      blue: 100%
  - delay: 0.03s
  - light.addressable_set:
      id: led_ring
      range_from: 7
      range_to: 8
      red: 0%
      green: 50%
      blue: 50%
  - light.addressable_set:
      id: led_ring
      range_from: 0
      range_to: 1
      red: 0%
      green: 50%
      blue: 50%
  - delay: 0.1s
  - light.addressable_set:
      id: led_ring
      range_from: 2
      range_to: 6
      red: 0%
      green: 100%
      blue: 00%

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(assist).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - voice_assistant.start_continuous
    on_turn_off:
      - voice_assistant.stop
      - lambda: id(assist).set_use_wake_word(false);

light:
  - platform: neopixelbus
    type: GRB
    variant: WS2812
    pin: GPIO4
    num_leds: 24
    name: "LED Ring"
    id: "led_ring"

Nachdem du den YAML-Code geschrieben hast, musst du ihn auf das ESP-Entwicklungsboard flashen. Ich möchte dies hier nicht im Detail erklären, da es bereits zahlreiche Tutorials gibt, die dies ausführlich beschreiben.

Schritt 3: Sprachpipeline in Home Assistant einrichten

Um eine Sprachpipeline in Home Assistant einzurichten, folge diesen Schritten:

  1. Installiere die Whisper- und Piper-Add-ons über „Einstellungen“ > „Add-ons“ – diese Add-ons sind notwendig, um Text in Sprache und umgekehrt zu konvertieren. Du musst dann die beiden Add-ons starten.
  2. Gehe nun zum Abschnitt „Einstellungen“ > „Geräte & Integrationen“, wo du sowohl Piper als auch Whisper automatisch entdeckt sehen solltest. Klicke auf „konfigurieren“ für beide Add-ons. Du solltest nun sowohl Piper als auch Whisper in deiner Liste der Integrationen sehen.
  3. Danach kannst du zu „Einstellungen“ > „Sprachassistent“ gehen, um eine Sprachpipeline einzurichten. Wähle „Assistent hinzufügen“.
  4. Jetzt musst du deinem Assistenten einen Namen geben. Unter „Conversation Agent“ wähle „Home Assistant“. Unter „Speech-to-Text“ wähle „Whisper“ und unter „Text-to-Speech“ wähle „Piper“.
  5. Schließlich wähle ein Aktivierungswort. Für Teil I der Serie wählen wir ein vordefiniertes Aktivierungswort wie „Alexa“.

Schritt 4: Experimentiere mit deinem neuen prototypischen Sprachassistenten!

Nun hast du einen prototypischen lokalen Sprachassistenten eingerichtet – Glückwunsch! Ich hoffe, er funktioniert. Viel Spaß beim Experimentieren. Wenn du auf Probleme stößt, hinterlasse bitte einen Kommentar!

Teil II dieser Tutorial-Reihe findest du hier.

Categories:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert