Skip to main content

Home Assistantによるスマートホーム音声制御

概要

新しいReSpeaker XMOS XVF3800 with XIAO ESP32S3でスマートスペースと会話しましょう。音声でライトを点けたり、音楽を大きくしたり、天気を聞いたりできます。

この章では、ReSpeaker XMOS XVF3800 with XIAO ESP32S3 HA Voice AssistantとSonoffスマートスイッチを接続して、音声によるライトスイッチの制御を実現します。

必要なハードウェア

ReSpeaker XVF3800 with XIAO ESP32S3Home AssistantデバイスSonoff BASICR2

ファームウェアアップデート

最高の再生体験を得るために、XMOSファームウェアをアップデートする必要があります。 ファームウェアをここからダウンロードしてください。コンピューターでReSpeaker XMOS XVF3800 with XIAO ESP32S3を接続し、ガイドに従って実行してください:

pir

note

XVF3800マイクアレイは動作するために12.288 MHz MCLKが必要ですが、ESPHome(Home Assistantで使用)はAPI制限のため生成できません。このファームウェアはXVF3800をI2Sマスターとして動作させ、ESP32からのMCLKを必要とせずに独自のクロックを生成できるようにします。 私たちのファームウェアはこの制限を修正し、マイクがHome Assistantで正常に動作するようにします。

ファームウェアはこちらからダウンロードできます

インストールガイドはこちらです

ReSpeaker XMOS XVF3800 with XIAO ESP32S3の準備

Home Assistant > Settings > Add-onsに移動します。

pir

Add-on Storeをクリックします(通常は右下にあります)

pir

Official add-onsの下で、ESPHome Device Builderを検索してインストールします。

pir

インストール後、StartをクリックしてESPHomeアドオンを実行します。

pir

簡単にアクセスできるように、Start on Boot、Watchdog、Show in Sidebarを有効にします。

Home Assistantサイドバーから、ESPHome Builderに移動します。

+ NEW DEVICEをクリックします。

pir

pir

プロンプトが表示されたら、SKIPをクリックします – 設定を手動で作成します。

pir

新しいデバイスエントリを選択し、EDITをクリックします。

pir

内容をカスタムYAML設定に置き換えます

YAML説明

WiFi

このセクションでは、デバイスがWi-Fiに接続する方法を設定します。

wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
  • ssid & password: secrets.yamlファイルから取得されるため、パスワードが平文で表示されません。
  • Events: Wi-Fi接続時または切断時にアクションを実行:
    • on_connect:

      • BLE improvセットアップを停止します。
      • control_ledsスクリプトを実行します(Wi-Fi接続時のLED効果)。
    • on_disconnect:

      • control_ledsスクリプトを実行します(Wi-Fi切断時のLED効果)。

I²Cバス

I²Cは、ESP32がマイクやオーディオコーデックなどの他のチップと通信するための通信ラインです。

i2c:
id: internal_i2c
sda: GPIO5
scl: GPIO6
scan: true
frequency: 100kHz
  • id: 他の場所でこのバスを参照するための名前。
  • sda / scl: データとクロックに使用されるピン。
  • scan: 起動時に接続されたデバイスをチェックします。
  • frequency: 通信速度(100kHzが標準)。

スイッチ

switch:
# Mute Sound Switch.
- platform: template
id: mute_sound
name: Mute/unmute sound
icon: "mdi:bullhorn"
entity_category: config
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
......
......

スイッチは、Home Assistantのソフトウェア制御「ボタン」です。音声、タイマー、アラームなどの機能を制御します。

Wake Word Sound Switch: ウェイクワードオーディオを制御します。

Timer Ringing Internal Switch:

  • タイマーがアクティブかどうかを追跡します。
  • on_turn_on: 他のオーディオを-20dBダッキング、タイマー音開始、LED更新、15分後に自動停止。
  • on_turn_off: タイマー停止、音量復元、LED更新。

Alarm On Switch:

  • アラーム状態を追跡します。
  • オン/オフ時にLEDスクリプトを実行します。

LED Ring Brightness:

  • ユーザーがスライダーで明度を調整できます。
  • min_value / max_valueで制限を定義します。
  • restore_valueで再起動後も前の設定を保持します。

センサー

Next Timer

  • 次のタイマーの残り時間を表示します。
  • タイマーが変更された時のみ更新します(リソース節約)。

Alarm Time & Device Time

  • 現在のアラームとESP32システム時刻を表示します。

インターバルでのLED効果

interval:
- interval: 50ms
id: led_animation_interval
then:
- lambda: |-
if (id(volume_display_active)) {
id(update_volume_display_effect).execute();
return;
}
std::string effect = id(current_led_effect);
if (effect == "off") {
return;
} else if (effect == "breathe") {
id(update_breathe_effect).execute();
} else if (effect == "rainbow") {
id(update_rainbow_effect).execute();
} else if (effect == "comet_cw") {
id(update_comet_cw_effect).execute();
} else if (effect == "comet_ccw") {
id(update_comet_ccw_effect).execute();
} else if (effect == "twinkle") {
id(update_twinkle_effect).execute();
} else if (effect == "timer_tick") {
id(update_timer_tick_effect).execute();
} else if (effect == "led_beam") {
id(update_led_beam_effect).execute();
}
  • インターバルはバックグラウンドでコードを繰り返し実行します。
  • 50ms: 1秒間に20回コードを実行します。
  • システム状態または選択された効果に基づいてLEDアニメーションを制御します。

LED制御

 # =========================================================================
# == Centralized script to control all LED effects ==
# =========================================================================
- id: led_set_effect
mode: restart
parameters:
effect: std::string
r: float
g: float
b: float
speed: float
then:
- lambda: |-
// Update global variables with the new parameters
id(led_ring_color_r) = r;
id(led_ring_color_g) = g;
id(led_ring_color_b) = b;
id(led_ring_speed) = speed;
id(current_led_effect) = effect;

// Handle the two types of effects: Off and Animated
if (effect == "off") {
uint32_t colors[12] = {0};
id(respeaker).set_led_ring(colors);
} else {
id(last_led_update_time) = millis(); // Reset timer for smooth animation start
}

# Individual update scripts for each animated effect
- id: update_breathe_effect
then:
- lambda: |-
static float phase = 0.0f;
uint32_t now = millis();
float dt = (now - id(last_led_update_time)) / 1000.0f;
id(last_led_update_time) = now;

phase += dt * id(led_ring_speed);
while (phase >= 1.0f) phase -= 1.0f;

float master_brightness = id(led_ring_brightness).state;
float breath_brightness = 0.5f * (1.0f + sinf(phase * 2.0f * M_PI)) * master_brightness;
......
......

中央コントローラー (led_set_effect)

  • すべてのLEDエフェクトを一箇所で管理します。
  • エフェクトタイプ、色(R/G/B)、速度を動的に設定できます。
  • スムーズなモーションのためにアップデートスクリプトを使用します。
  • オフエフェクトは即座にLEDをオフにします。

個別スクリプト

  • 各アニメーション(ブリーズ、レインボー、コメット、トゥインクル、タイマーティック、ボリューム表示、LEDビーム)には独自のスクリプトがあります。
  • システムをモジュラー化し、保守しやすくします。
  • led_animation_intervalまたは中央コントローラーによって定期的にトリガーされます。
デバイス状態LEDエフェクト
起動失敗赤ブリーズ
Improv BLEモード暖色トゥインクル
初期化青トゥインクル
HA接続なし赤トゥインクル
音声アシスタント待機紫ビーム
音声アシスタント聞き取り中明るい紫ビーム
音声アシスタント思考中紫ブリーズ
音声アシスタント応答中紫コメット
音声アシスタントエラー赤ブリーズ
音声アシスタントアイドルLEDオフ
タイマー鳴動紫高速ブリーズ
ボリューム変更一時表示

オーディオ設定

i2s_audio:
- id: i2s_output
i2s_lrclk_pin:
number: GPIO7
allow_other_uses: true
i2s_bclk_pin:
number: GPIO8
...
...

I²S入力/出力

  • I²S経由でマイク入力とスピーカー出力を処理します。
  • i2s_input: マイク/コーデックから48kHz、32ビットステレオオーディオをキャプチャします。
  • i2s_output: DAC/スピーカーに48kHz、32ビットステレオオーディオを再生します。

ミキサー

  • 複数のオーディオストリーム(メディア + アナウンス)を1つの出力に結合します。

リサンプラー

  • すべてのオーディオソースがサンプルレートとビット深度に一致することを保証します。

メディアプレーヤー

  • ボリューム、ミュート、再生、ダッキング(アナウンス中にメディアボリュームを下げる)を制御します。
  • イベント用のプリロードサウンド(タイマー、ウェイクワード、エラー)。

Respeaker XVF3800統合

respeaker_xvf3800:
id: respeaker
address: 0x2C
mute_switch:
id: mic_mute_switch
name: "Microphone Mute"
update_interval: 1s
on_turn_on:
...
...
  • i2cアドレス: 0x2C
  • ID: respeaker
  • マイクミュートスイッチ: 1秒ごとに更新、切り替え時にサウンド再生。
  • DFUバージョンレポート: 120秒ごとにファームウェアをレポート。
  • ビーム方向センサー: 音声ビームを追跡(内部のみ)。
  • ファームウェア管理: 必要に応じてXVF3800ファームウェアを自動フラッシュ。

参考資料/リポジトリ

external_components:
- source:
type: git
url: https://github.com/formatBCE/esphome
ref: respeaker_microphone
components:
- i2s_audio
refresh: 0s
- source:
type: git
url: https://github.com/formatBCE/Respeaker-XVF3800-ESPHome-integration
ref: main
components:
- respeaker_xvf3800
- aic3104
refresh: 0s

  • formatBCE/esphome: カスタムI²Sオーディオコンポーネント。
  • formatBCE/Respeaker-XVF3800-ESPHome-integration:
  • XVF3800ドライバー
  • AIC3104オーディオコーデックドライバー
  • refresh: 0s: 常にリポジトリから最新のコードを取得します。

Micro Wake Word

micro_wake_word:
id: mww
microphone:
microphone: i2s_mics
channels: 1
# gain_factor: 4
stop_after_detection: false
....
....

ウェイクワード(「Okay Nabu」など)を検出し、音声アシスタントを開始します。

  • id: mww → 参照名。
  • microphone: i2s_mics、1チャンネル。
  • stop_after_detection: false → 継続的に聞き続けます。
  • okay_nabu、kenobi、hey_jarvis、hey_mycroft、stop(内部停止コマンド;独自のものを追加可能)。
  • vad probability_cutoff: 0.05 → 音声感度。

検出時(マイクがミュートされていない場合)

  • アクティブな場合、タイマー、アナウンス、または音声アシスタントを停止します。
  • ウェイクサウンドを再生します(有効な場合)。
  • コマンド用に音声アシスタントを開始します。

音声アシスタント

voice_assistant:
id: va
microphone:
microphone: i2s_mics
channels: 0
media_player: external_media_player
micro_wake_word: mww
use_wake_word: false
noise_suppression_level: 0
....
....

音声アシスタント(VA)の動作と相互作用を制御します。

  • マイクとメディア: i2s_micsと外部メディアプレーヤーを使用します。
  • ウェイクワード: mwwにリンクされていますが、ウェイクワードは不要です(use_wake_word: false)。
  • オーディオ設定: ノイズ抑制オフ、自動ゲイン0 dB、通常ボリューム。
イベント/何が起こるか
  • on_client_connected: VAを開始、LEDを更新、必要に応じてマイクのミュートを解除。
  • on_client_disconnected: VAを停止、LEDをリセット。
  • on_error: LEDにエラー状態を表示;クラウド認証が失敗した場合はローカルサウンドを再生。
  • on_start: VAが開始されるとメディアボリュームを下げます(ダッキング)。
  • on_listening / on_stt_vad_start / on_stt_vad_end: 聞き取りと思考中にVAフェーズとLEDを更新。
  • on_intent_progress / on_tts_start / on_tts_end: 発話を処理、LEDを更新、停止ワードスクリプトをトリガー可能。
  • on_stt_end: 認識されたテキストイベントを送信。
  • on_end: VAを停止、LEDをリセット、ダッキングを終了。
タイマーイベント
  • on_timer_started / on_timer_updated / on_timer_cancelled / on_timer_finished / on_timer_tick:
    • タイマー状態と名前を更新。
    • LEDを更新。
    • ティッキングタイマーのLED更新を5秒ごとに削減。
important

YAMLファイルはこちらから見つけることができます

YAMLが保存されたら、INSTALLをクリックします。

pir

Manual Downloadを選択します

pir

ファームウェアのコンパイルを待ちます。

生成された.binファームウェアファイルをコンピューターにダウンロードします。

pir

ESP32-S3ボード(XVF3800が接続された状態)をUSB Type-Cケーブルを使用してPCに接続します。

ChromeまたはEdgeでWeb-ESPHomeを開きます。

CONNECTをクリックし、適切なシリアルポートを選択します

pir

接続されたら、INSTALLをクリックします

pir

先ほどダウンロードした.binファイルを選択します。

pir

インストールが完了するまで待ちます(数分かかる場合があります)。

成功後、確認メッセージが表示されます。

pir

Home Assistant > Settings > Devices & Servicesに戻ります。

ESPHomeが発見された統合として表示されるはずです。

CONFIGUREをクリックし、Submitをクリックしてセットアップを完了します。

pir

スマートデバイスの追加

メーカーのユーザーマニュアルに従ってSonoff BASICR2デバイスをセットアップします。eWeLinkアカウントを作成する必要があります。

HACSのインストール

まだインストールされていない場合は、公式ガイドに従ってHome Assistant Community Storeをセットアップしてください:

サイドバーからHACSを開きます。 検索セクションでSonoff LANを検索します。

pir

Installをクリックして統合を追加します。 変更を適用するためにHome Assistantを再起動します。

Sonoff

Settings → Devices & Servicesに移動します。 Add Integrationをクリックします。 Sonoffを検索して選択します。

pir

認証のためにeWeLinkアカウント認証情報を入力します。

pir

正常に接続されると、関連するエンティティが以下に表示されます: Settings → Devices & Services → Entities

pir

Nabu Cloudを使用した音声アシスタント

このデモでは、音声を使用してHome Assistant Cloud (Nabu Casa)に接続する方法を紹介しています。セットアップは簡単で、1ヶ月の無料トライアルを利用してその全機能を探索できます。 内蔵のウェイクワード「Okay Nabu」により、音声コマンドを簡単にトリガーし、複雑な設定なしにいつでも、どこでもデバイスやサービスとシームレスに統合できます。

pir

pir

特別な感謝

Seeed Studio ReSpeaker XVF3800用のこの素晴らしいYAMLファイルを作成してくれたFormatBCEに感謝いたします。 彼のGitHubでサポートしてください

技術サポート & 製品ディスカッション

弊社製品をお選びいただき、ありがとうございます!お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供いたします。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルをご用意しています。

Loading Comments...