Skip to main content

Grove オフライン音声認識センサー

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

Grove オフライン音声認識センサー

概要

Grove - オフライン音声認識モジュールは、VC-02モジュールをベースにした低消費電力の純オフライン音声認識に適しています。このモジュールには最大150個の事前プログラム済みコマンドがあり、スマート家電を制御するために使用できます。認識時間は100ms未満で、18mm * 17mmというコンパクトなサイズが特徴です。このモジュールはUARTペリフェラルを介して通信し、認識された各コマンドに固有の16進コードを提供します。このモジュールに必要なのは5Vだけで、すぐにコマンドを認識できます!

特徴

  • 150個の音声コマンドをサポート
  • 低消費電力
  • ESD保護付き電源レール
  • コマンド用LEDインジケーター
  • Grove UARTインターフェース

仕様

パラメータ

範囲/値

入力電圧5V/3.3V
デフォルトボーレート115200
デフォルト出力検出されたコマンドの16進値

はじめに

デモ1: Grove オフライン音声認識モジュールと Arduino IDE

ハードウェアのセットアップ

以下を準備してください:

tip

一部のUSBケーブルは電力供給のみでデータ転送ができません。USBケーブルを持っていない場合や、使用中のUSBケーブルがデータ転送可能か不明な場合は、Seeed USB Type-C support USB 3.1を確認してください。

ステップ1. USB Type-Cケーブルを使用してXIAO RP2040をコンピュータに接続します。

ステップ2. XIAO RP2040をXIAO拡張ボードに接続します。

ステップ3. Groveケーブルを使用して、XIAO拡張ボードのUARTポートにオフライン音声認識モジュールを接続します。

ステップ4. オフライン音声認識モジュールをスピーカーに接続します。

以下は接続例の画像です。

ソフトウェアのセットアップ

ステップ1. オペレーティングシステムに応じて、最新バージョンのArduino IDEをダウンロードしてインストールします。

ステップ2. 開発ボードモデルを選択し、Arduino IDEに追加します。後の手順でXIAO RP2040を使用する場合は、このチュートリアルを参照して追加を完了してください。

tip

他の種類のXIAOを使用したい場合は、こちらを参照してください。

ステップ3. Arduinoコードライブラリをインストールします。

まず、GitHubからコードベースを取得し、ローカルコンピュータにダウンロードします。

ZIPライブラリをダウンロードしたら、Arduino IDEを開き、スケッチ > ライブラリをインクルード > .ZIPライブラリを追加をクリックします。先ほどダウンロードしたZIPファイルを選択し、ライブラリが正しくインストールされると、通知ウィンドウにライブラリがライブラリに追加されましたと表示されます。これでライブラリのインストールが成功しました。

オフライン音声認識デモ

ステップ1. Arduinoでこのファイルを開きます。

以下のようなコードが表示されます。

#include "GroveOfflineSensor.h"
#include <SoftwareSerial.h>
#define RX_VC02 D7
#define TX_VC02 D6

SoftwareSerial groveSerial(RX_VC02, TX_VC02); // RX, TX

void setup() {
Serial.begin(115200);
// シリアルポートが接続されるのを待つ。ネイティブUSBポートのみ必要。このポートはGroveセンサーが送信するデータを表示するためのもの
while (!Serial);
// 通信に合わせてボーレートを設定
groveSerial.begin(115200);
}

void loop() {
// 音声認識センサーから音声を検出
uint8_t *voiceData = detectVoiceFromGroveSensor(&groveSerial);

// 音声をコマンド文字列に変換
if(voiceData != NULL){
String response = getCommandInString(voiceData);
Serial.println(response);
}
delay(1000);
}

ステップ2. アップロードボタンをクリックしてコードをボードにアップロードします。

ステップ 3. センサーにウェイクワード「hello pudding」と話しかけると、スピーカーから音声フィードバックが聞こえ、Arduino IDEのシリアルモニターから文字フィードバックが表示されます。詳細な手順については、この記事の下部にあるResourcesセクションをご参照ください。

デモ2: Grove オフライン音声認識をESPHomeとHome Assistantで使用する

ハードウェアのセットアップ

以下のものを準備してください:

  • Home Assistantがインストールされたデバイス

Home Assistantを始める最初のステップは、デバイスにインストールすることです。ステップバイステップのガイドはこちらをご参照ください。

tip

一部のUSBケーブルは電力供給のみでデータ転送ができません。USBケーブルを持っていない場合や、USBケーブルがデータ転送可能かどうかわからない場合は、Seeed USB Type-C support USB 3.1をご確認ください。

ステップ 1. ハードウェアの準備

XIAO ESP32S3をUSB Type-Cケーブルを使用してコンピュータに接続します。
XIAO ESP32S3をXIAO拡張ボードに接続します。
XIAO拡張ボードをGroveケーブルを使用してUARTポート経由でオフライン音声認識モジュールに接続します。
オフライン音声認識モジュールをスピーカーに接続します。
XIAO ESP32S3にアンテナを接続します。

以下は接続図です。

ステップ 2. スマートホームの作成
ブラウザのアドレスバーにHome Assistantデバイスのアドレスを入力し、Home Assistantアカウントを作成します。ステップバイステップのガイドはこちらをご参照ください。

ステップ 3. Home AssistantにESPHomeをインストール
こちらを参照して、Home AssistantにESPHomeを迅速にセットアップできます。

ソフトウェア

XIAO ESP32S3をESPHomeに追加する

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

  • CONTINUEをクリックします。

  • デバイスの名前を入力し、WiFiの認証情報(ネットワーク名パスワード)を入力します。その後、NEXTをクリックします。

  • ESP32-S3を選択し、NEXTをクリックします。

  • Installをクリックし、Manual downloadを選択します。

  • ダウンロードが成功した後、ESPHome Webを開き、Modern formatを選択します。

  • XIAO ESP32S3のポートを接続し、取得したbinファイルをインストールします。これにより、必要なボードパッケージがすべてダウンロードされ、ESPHomeファームウェアがXIAO ESP32S3にフラッシュされます。

  • LOGSを開き、フラッシュが成功した場合、以下の出力が表示されます。ESPHomeページに戻り、ボードのステータスがONLINEと表示されていれば、WiFiへの接続が成功したことを意味します。

tip

"[wifi_esp32:482][arduino_events]: Event: Disconnected …… reason='Auth Expired'"という警告が表示された場合は、ESP32デバイスがWiFiネットワークの範囲内にあることを確認してください。信号強度が弱いと接続問題が発生する可能性があります。アンテナをRod Antennaに交換することを検討してください。

これでXIAO ESP32C3をコンピュータから切断し、USBケーブルで電源を供給するだけで済みます。今後、XIAO ESP32C3にファームウェアをフラッシュする場合は、USBケーブルを使用してX86ボードに接続することなく、OTAで簡単に行うことができます。

  • 3つのドットをクリックし、Installを選択します。Wirelesslyを選択すると、変更がボードにワイヤレスでプッシュされます。

  • 設定に移動し、Devices & Servicesを選択します。ESPHomeが検出された統合として表示されます。CONFIGUREをクリックします。暗号化キーを求められた場合は、ESPHomeページに戻り、APIキーをコピーして入力してください。

オフライン音声認識

ステップ1. 以前に作成したoffline-voice-recognition.yamlファイルの末尾に以下を追加し、OTAでXIAO ESP32S3にプッシュします。

完全なコードをプレビューするにはここをクリック
uart:
id: uart_bus
tx_pin: GPIO43
rx_pin: GPIO44
baud_rate: 115200

globals:
- id: hex_code
type: uint8_t
restore_value: no
initial_value: '0'

interval:
- interval: 1s
then:
- lambda: |-
while (id(uart_bus).available() >= 5) {
uint8_t receivedData[5];
for (int i = 0; i < 5; i++) {
id(uart_bus).read_byte(&receivedData[i]);
}
id(hex_code) = receivedData[1];
ESP_LOGD("main", "Hex code: %02X", id(hex_code));
}

sensor:
- platform: template
name: "Received Hex Code"
lambda: |-
return id(hex_code);
update_interval: 5s
unit_of_measurement: ""
accuracy_decimals: 0
on_value:
then:
- lambda: |-
auto call_acwind = id(acwind).make_call();
auto call_actemp = id(actemp).make_call();
switch (id(hex_code)) {
case 0x03:
id(ac).publish_state(true);
break;
case 0x04:
id(ac).publish_state(false);
break;
case 0x05:
id(acmode).publish_state("automatic mode");
break;
case 0x06:
id(acmode).publish_state("cold mode");
break;
case 0x07:
id(acmode).publish_state("heat mode");
break;
case 0x08:
id(acmode).publish_state("dry mode");
break;
case 0x09:
id(acmode).publish_state("fan mode");
break;
case 0x0A:
id(acmode).publish_state("sleeping mode");
break;
case 0x0B:
id(acwind).publish_state("automatic fan");
break;
case 0x0C:
id(acwind).publish_state("low fan");
break;
case 0x0D:
id(acwind).publish_state("medium fan");
break;
case 0x0E:
id(acwind).publish_state("high fan");
break;
case 0x0F:
call_acwind.select_next(false);
call_acwind.perform();
break;
case 0x10:
call_acwind.select_previous(false);
call_acwind.perform();
break;
case 0x11:
id(actemp).publish_state("sixteen centigrade");
break;
case 0x12:
id(actemp).publish_state("seventeen centigrade");
break;
case 0x13:
id(actemp).publish_state("eighteen centigrade");
break;
case 0x14:
id(actemp).publish_state("nineteen centigrade");
break;
case 0x15:
id(actemp).publish_state("twenty centigrade");
break;
case 0x16:
id(actemp).publish_state("twenty one centigrade");
break;
case 0x17:
id(actemp).publish_state("twenty two centigrade");
break;
case 0x18:
id(actemp).publish_state("twenty three centigrade");
break;
case 0x19:
id(actemp).publish_state("twenty four centigrade");
break;
case 0x1A:
id(actemp).publish_state("twenty five centigrade");
break;
case 0x1B:
id(actemp).publish_state("twenty six centigrade");
break;
case 0x1C:
id(actemp).publish_state("twenty seven centigrade");
break;
case 0x1D:
id(actemp).publish_state("twenty eight centigrade");
break;
case 0x1E:
id(actemp).publish_state("twenty nine centigrade");
break;
case 0x1F:
id(actemp).publish_state("thirty centigrade");
break;
case 0x20:
call_actemp.select_next(false);
call_actemp.perform();
break;
case 0x21:
call_actemp.select_previous(false);
call_actemp.perform();
break;
case 0x22:
id(fan).publish_state(true);
break;
case 0x23:
id(fan).publish_state(false);
break;
case 0x24:
id(acswept).publish_state("air swing up and down");
break;
case 0x25:
id(acswept).publish_state("air swing left and right");
break;
case 0x26:
id(acmode).publish_state("automatic mode");
id(acwind).publish_state("automatic fan");
id(actemp).publish_state("twenty six centigrade");
id(fan).publish_state(false);
break;
case 0x27:
id(light).publish_state(true);
break;
case 0x28:
id(light).publish_state(false);
break;
case 0x29:
id(cold_light).publish_state(true);
break;
case 0x2A:
id(cold_light).publish_state(false);
break;
case 0x2B:
id(warm_light).publish_state(true);
break;
case 0x2C:
id(warm_light).publish_state(false);
break;
default:
ESP_LOGW("main", "Unknown hex code: %02X", id(hex_code));
break;
}

switch:
- platform: template
name: "air conditioner"
id: ac
optimistic: True
- platform: template
name: "fan"
id: fan
optimistic: True
- platform: template
name: "light"
id: light
optimistic: True
- platform: template
name: "cold light"
id: cold_light
optimistic: True
- platform: template
name: "warm light"
id: warm_light
optimistic: True

select:

- platform: template
name: Air conditioner mode
id: acmode
optimistic: True
options:
- "automatic mode"
- "cold mode"
- "heat mode"
- "dry mode"
- "fan mode"
- "sleeping mode"
initial_option: "automatic mode"

- platform: template
name: Fan mode
id: acwind
optimistic: True
options:
- "automatic fan"
- "low fan"
- "medium fan"
- "high fan"
initial_option: "automatic fan"

- platform: template
name: Temperature
id: actemp
optimistic: True
options:
- "sixteen centigrade"
- "seventeen centigrade"
- "eighteen centigrade"
- "nineteen centigrade"
- "twenty centigrade"
- "twenty one centigrade"
- "twenty two centigrade"
- "twenty three centigrade"
- "twenty four centigrade"
- "twenty five centigrade"
- "twenty six centigrade"
- "twenty seven centigrade"
- "twenty eight centigrade"
- "twenty nine centigrade"
- "thirty centigrade"
initial_option: "twenty six centigrade"

- platform: template
name: Fan direction
id: acswept
optimistic: True
options:
- "air swing up and down"
- "air swing left and right"
note

新しいデバイスを作成する際に自動生成される yaml ファイルは、異なる構成やデバイスタイプによって異なります。そのため、ファイルの冒頭部分を変更しないことを推奨し、コードを末尾に追加するだけにしてください。

  • Uart Busについての詳細はこちらをご覧ください。
  • Switch Componentについての詳細はこちらをご覧ください。
  • Select Componentについての詳細はこちらをご覧ください。

ステップ2. Dashboardでの可視化

  • デバイスに戻り、オフライン音声認識を選択します。

  • ADD TO DASHBOARDNEXTADD TO DASHBOARDをクリックし、OVERVIEWに戻ります。これで、Home Assistant のダッシュボードは以下のようになります。

ステップ3. センサーに向かってウェイクワード「hello pudding」を話しかけると、音声フィードバックが聞こえ、Home Assistant 上でアクションフィードバックが表示されます。詳細な手順については、この記事の下部にあるResourcesをご覧ください。

リソース

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

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

Loading Comments...