Grove Speech Recognizer Kit for Arduino
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
Grove Speech Recognizer Kit for Arduinoは、スマートホームのプロトタイプ用に設計されており、音声認識や赤外線エミッターなどの基本的な家庭要素を含んでいます。このキットを使用することで、音声認識の機能や応用を迅速に学ぶことができます。ガイドラインにはいくつかの一般的なデモが示されており、例えば「音楽を再生して」という音声コマンドで音楽を再生したり、対応するコマンドに従ってライトをオンにすることができます。
パーツリスト
Grove - Speech Recognizer SKU:101020232
応用例
テレビをオンにする方法
時々、テレビやエアコンなどを音声で操作したいことがあります。これらのデバイスは赤外線リモコンで操作されるため、まず赤外線リモコンの各ボタンのコードを知る必要があります。その後、そのコードをプログラムに組み込みます。最終的に、音声でボタンコードをトリガーし、赤外線リモコンのようにデバイスを操作することができます。
このデモを作成する前に、以下の必要なコンポーネントを準備してください:
Grove - Infrared Receiver
Grove - Infrared Emitter
Grove - Speech Recognizer
Base Shield
Arduino UNO
赤外線リモコン
Grove - Infrared Receiverを使用して赤外線リモコンのコードを取得する
必要なライブラリをGitHubからダウンロードしてください:IRSendRev。ライブラリのパスに注意してください: .../arduino/libraries
次に、"recv"の例ファイルを開きます:File --> Sketchbook --> libraries --> IRSendRev --> recv。
プログラムをArduino UNOにアップロードします。
Base ShieldをArduino UNOに接続し、Grove - ReceiverをBase ShieldのD2ポートに接続します。
const int pinRecv = 2;
また、ピンの定義を変更することで別のポートを使用することもできます。
- Arduino UNOのモニターを開きます。
任意の赤外線リモコンのボタンを押すと、そのボタンの詳細な情報コードが表示されます。以下のようになります:
押したいボタンの詳細情報を書き留めます。以下はボタンの情報です:
+------------------------------------------------------+
LEN = 9
START_H: 179 START_L: 88
DATA_H: 11 DATA_L: 33
DATA_LEN = 4
DATA: 0x80 0x7E 0x10 0xEF
DATA: 128 126 16 239
+------------------------------------------------------+
IRSendプログラムを修正する
次に、ボタンの情報コードを使用します。
"send"の例ファイルを開きます:File --> Sketchbook --> libraries --> IRSendRev --> send。
プログラムをArduino UNOにアップロードします。
Base ShieldをArduino UNOに接続し、Grove - ReceiverをBase ShieldのD3ポートに接続します。
まず、ボタンのデフォルト情報を修正する必要があります:
unsigned char dtaSend[20];
void dtaInit()
{
............
}
以前に書き留めた情報に従ってこれらの情報を修正します:
unsigned char dtaSend[20];
void dtaInit()
{
dtaSend[BIT_LEN] = 9; // 送信する必要があるすべてのデータ
dtaSend[BIT_START_H] = 179; // ボタンの論理的な高い持続時間
dtaSend[BIT_START_L] = 88; // ボタンの論理的な低い持続時間
dtaSend[BIT_DATA_H] = 11; // 通信における論理的な「長い」持続時間
dtaSend[BIT_DATA_L] = 33; // 通信における論理的な「短い」持続時間
dtaSend[BIT_DATA_LEN] = 4; // 送信されるデータの数。他の数値の場合、dtaSend[BIT_DATA+x]を増減する必要があります。
dtaSend[BIT_DATA+0] = 128; // 送信されるデータ
dtaSend[BIT_DATA+1] = 126;
dtaSend[BIT_DATA+2] = 16;
dtaSend[BIT_DATA+3] = 239;
//dtaSend[BIT_DATA+4] = 192;
//dtaSend[BIT_DATA+5] = 63;
}
以下のように観察できます:
DATA_LEN = 4
したがって、これらの2行をメモまたは削除することができます。
//dtaSend[BIT_DATA+4] = 192;
//dtaSend[BIT_DATA+5] = 63;
もちろん、多くのボタンを定義することもできます:
#include <IRSendRev.h>
#define BIT_LEN 0
#define BIT_START_H 1
#define BIT_START_L 2
#define BIT_DATA_H 3
#define BIT_DATA_L 4
#define BIT_DATA_LEN 5
#define BIT_DATA 6
const int ir_freq = 38;
unsigned char OpenTV[20];
unsigned char CloseTV[20];
unsigned char IncreaseTemp[20];
unsigned char DecreaseTemp[20];
void OpenTVInit()
{
OpenTV[BIT_LEN] = 11;
OpenTV[BIT_START_H] = 179;
/*............ omit ............*/
}
void CloseTVInit()
{
CloseTV[BIT_LEN] = 11;
CloseTV[BIT_START_H] = 179;
/*............ omit ............*/
}
void IncreaseTempInit()
{
IncreaseTemp[BIT_LEN] = 11;
IncreaseTemp[BIT_START_H] = 179;
/*............ omit ............*/
}
void DecreaseTempInit()
{
DecreaseTemp[BIT_LEN] = 11;
DecreaseTemp[BIT_START_H] = 179;
/*............ omit ............*/
}
void setup()
{
OpenTVInit();
CloseTVInit();
IncreaseTempInit();
DecreaseTempInit();
}
void loop()
{
IR.Send(OpenTV, 38);
delay(200);
IR.Send(CloseTV, 38);
delay(200);
IR.Send(IncreaseTemp, 38);
delay(200);
IR.Send(DecreaseTemp, 38);
delay(2000);
}
IRSendプログラムに音声認識機能を追加する
- 音声認識機能を単独で使用するのは非常に簡単です。まずはそのWikiをご覧ください。
以下の表に基づいて必要なボタンを選択できます。Grove - Speech Recognizerの返り値の表をご参照ください。以下は返り値の表です:
コマンド | 返り値 |
---|---|
ライトを点ける | 1 |
ライトを消す | 2 |
音楽を再生 | 3 |
一時停止 | 4 |
次へ | 5 |
前へ | 6 |
上へ | 7 |
下へ | 8 |
テレビを点ける | 9 |
テレビを消す | 10 |
温度を上げる | 11 |
温度を下げる | 12 |
時間を教えて | 13 |
ドアを開ける | 14 |
ドアを閉める | 15 |
左へ | 16 |
右へ | 17 |
停止 | 18 |
開始 | 19 |
モード1 | 20 |
モード2 | 21 |
進む | 22 |
以下の例では、2つのコマンド「テレビを点ける」と「テレビを消す」を使用します。
- 読み取った後、音声認識プログラムをIRSendプログラムに組み込むことができます。以下は完成したプログラムです:
#include <IRSendRev.h>
#include <SoftwareSerial.h>
/*======== IRタイプ ========*/
#define BIT_LEN 0
#define BIT_START_H 1
#define BIT_START_L 2
#define BIT_DATA_H 3
#define BIT_DATA_L 4
#define BIT_DATA_LEN 5
#define BIT_DATA 6
const int ir_freq = 38; // 38k
/* ======== 送信するIRボタンの数を設定 ========*/
unsigned char OpenTV[20];
unsigned char CloseTV[20];
/*========= 音声認識のピンを選択 ==========*/
#define SOFTSERIAL_RX_PIN 5
#define SOFTSERIAL_TX_PIN 6
SoftwareSerial speech(SOFTSERIAL_RX_PIN,SOFTSERIAL_TX_PIN);
/* ======= IRデータの書き方 ========*/
/* ==== IR受信機を使用してこれらのデータを取得可能 ==== */
void OpenTVInit()
{
OpenTV[BIT_LEN] = 9; // 送信する全データ
OpenTV[BIT_START_H] = 180; // "OpenTV"の論理ハイの持続時間
OpenTV[BIT_START_L] = 88; // "OpenTV"の論理ローの持続時間
OpenTV[BIT_DATA_H] = 11; // 通信中の論理"長い"持続時間
OpenTV[BIT_DATA_L] = 33; // 通信中の論理"短い"持続時間
OpenTV[BIT_DATA_LEN] = 4; // 送信するデータの数。異なる場合はdtaSend[BIT_DATA+x]を増減する必要があります。
OpenTV[BIT_DATA+0] = 50; // 送信するデータ
OpenTV[BIT_DATA+1] = 166;
OpenTV[BIT_DATA+2] = 80;
OpenTV[BIT_DATA+3] = 175;
}
void CloseTVInit()
{
CloseTV[BIT_LEN] = 9; // 送信する全データ
CloseTV[BIT_START_H] = 178; // "CloseTV"の論理ハイの持続時間
CloseTV[BIT_START_L] = 89; // "CloseTV"の論理ローの持続時間
CloseTV[BIT_DATA_H] = 10; // 通信中の論理"長い"持続時間
CloseTV[BIT_DATA_L] = 33; // 通信中の論理"短い"持続時間
CloseTV[BIT_DATA_LEN] = 4; // 送信するデータの数。異なる場合はdtaSend[BIT_DATA+x]を増減する必要があります。
CloseTV[BIT_DATA+0] = 50; // 送信するデータ
CloseTV[BIT_DATA+1] = 166;
CloseTV[BIT_DATA+2] = 168;
CloseTV[BIT_DATA+3] = 87;
}
void setup()
{
OpenTVInit();
CloseTVInit();
Serial.begin(9600);
speech.begin(9600);
speech.listen();
}
void loop()
{
int a=0;
if(speech.available())
{
a = speech.read(); // 音声認識機から返り値を読み取る
switch (a)
{
case 9: // もし(返り値)なら(IRデータを送信)
IR.Send(OpenTV, 38);
delay(1000);
break;
case 10:
IR.Send(CloseTV, 38);
delay(1000);
break;
default:
break;
}
}
}
音楽を制御する方法
音声認識機能のコマンドを見ると、「音楽を再生」「一時停止」「停止」「前へ」「次へ」など、音楽に関連する多くのコマンドがあります。では、この音声音楽ボックスを作りましょう!
必要なライブラリをGitHubからダウンロードしてください: Grove_Serial_MP3_Player_V2.0; ライブラリ、Grove - MP3 v2.0、ライブラリのパスに注意してください:.../arduino/libraries 。
Grove - MP3 v2に関する便利な関数
Grove - MP3にはいくつかの便利な基本関数があります:
PlayPause(); // 音楽を一時停止
PlayResume(); // 音楽を再開
PlayNext(); // 次の曲
PlayPrevious(); // 前の曲
PlayLoop(); // 全曲をループ再生
SetVolume(uint8_t volume); // 音量を設定。デフォルト値は"0x0E"、範囲は0x00から0x1E。
IncreaseVolume(); // 音量を上げる
DecreaseVolume(); // 音量を下げる
しかし、注意が必要な特殊な関数もあります:
- SelectPlayerDevice(uint8t device)。デフォルトのデバイス値は0x02で、SDカードをプレイヤーデバイスとして選択します。_
SelectPlayerDevice(0x02);
- SpecifyMusicPlay(uint16t index)。名前で曲を再生します。_
- 曲の名前に注意してください。以下の形式のように設定できます:
- この関数を使用して「005」という曲を再生できます:
SpecifyMusicPlay(5);
- SpecifyfolderPlay(uint8_t folder, uint8_t index); // 指定したフォルダ内の名前で曲を再生します
- さらに、新しいフォルダで音楽を再生する場合、前述の機能が便利です。
フォルダのインデックス範囲は01-99です。そのため、フォルダ名は01から99までの任意の数字になります。1から9の数字については、フォルダ名を01-09として追加する必要があります。
例えば、フォルダ「01」の中の「005」を再生したい場合、以下のようにします:
SpecifyfolderPlay(1,5);
- その他の注意点:
各曲には再生時間があります。そのため、曲を1つずつ指定して再生したい場合、以下の2つの方法から選べます:
delay(length of time); // 曲が再生されるまでの時間を遅延させる
while(QueryPlayStatus() != 0); // 戻り値: 0: 再生終了; 1: 再生中
通常、後者の方法を使用します。例えば:
SpecifyMusicPlay(1);
while(QueryPlayStatus() != 0);
SpecifyMusicPlay(2);
while(QueryPlayStatus() != 0);
SpecifyMusicPlay(3);
while(QueryPlayStatus() != 0);
統合プログラム
では、Speech RecognizerとGrove - MP3を統合してみましょう。以下のデモでは、音楽の再生、音楽の一時停止、再開、次の曲、前の曲といったMP3のいくつかの機能を制御できます。
プログラムをコピーしてArduino UNOにアップロードしてください。
Base ShieldをArduino UNOに接続し、Grove - MP3 v2をBase ShieldのD2ポートに接続してください。
# include <SoftwareSerial.h>
# include <MP3Player_KT403A.h>
/****** MP3のピンを定義 ******/
SoftwareSerial mp3(2, 3);
/****** Speech Recognizerのピンを定義 ******/
# define SOFTSERIAL_RX_PIN 5
# define SOFTSERIAL_TX_PIN 6
SoftwareSerial speech(SOFTSERIAL_RX_PIN,SOFTSERIAL_TX_PIN);
void setup()
{
mp3.begin(9600);
speech.begin(9600);
Serial.begin(9600);
delay(100);
SelectPlayerDevice(0x02); // SDカードをプレイヤーデバイスとして選択
SetVolume(0x15); // 音量を設定、範囲は0x00から0x1E
}
void loop()
{
int a=0;
if(speech.available())
{
a = speech.read(); // Speech Recognizerからの戻り値を読み取る
switch (a)
{
case 3: // 音声コマンド: 音楽を再生
SpecifyMusicPlay(1); // MP3: "001"を再生
break;
case 4: // 音声コマンド: 一時停止
PlayPause(); // MP3: 音楽を一時停止
break;
case 19: // 音声コマンド: 再開
PlayResume(); // MP3: 音楽を再開
break;
case 5: // 音声コマンド: 次の曲
PlayNext(); // MP3: 次の曲を再生
break;
case 6: // 音声コマンド: 前の曲
PlayPrevious(); // MP3: 前の曲を再生
break;
default:
break;
}
delay(1000);
}
}
リアルタイム放送の方法
Grove - MP3を使用してリアルタイム放送を行ったことはありますか?Speech Recognizer、Grove - MP3、Grove - RTCを使用して試してみましょう。
リアルタイムの調整
必要なライブラリをGitHubからダウンロードしてください:RTC_DS1307;library, Grove - RTC; ライブラリのパスに注意してください: .../arduino/libraries 。
"SetTimeAndDisplay"のサンプルファイルを開きます:File --> Sketchbook --> libraries --> RTC_DS1307 --> SetTimeAndDisplay。
Base ShieldをArduino UNOに接続し、Grove - RTCをBase ShieldのI2Cポートに接続します。
RTCの正しい時刻を設定します。
clock.fillByYMD(2016,1,19);//2016年1月19日
clock.fillByHMS(15,28,30);//15:28:30
clock.fillDayOfWeek(Mon);//月曜日
- 修正したプログラムをArduino UNOにアップロードします。
テキスト読み上げ
ご存知の通り、時間を放送する際には60個の数字(0〜59)があります。また、MP3が時間を放送する前にいくつかの単語を追加することができます(例: "It's")。そのため、SDカードに61個の音声ファイルを追加する必要があります。
ただし、SDカードについて注意すべき点があります:SDカードの形式:FAT32。
曲を削除する前にSDカードをフォーマットしてください。曲を追加する場合は何もする必要はありません。
再生の順序は、SDカードに曲を追加した順序に依存します。したがって、特定の順序で曲を再生したい場合は、SDカードにその順序で曲を追加する必要があります。
ちなみに、61個の音声ファイルをフォルダにまとめましたので、こちらからダウンロードしてSDカードにコピーしてください。もちろん、最初にSDカードをフォーマットする必要があるかもしれません。
音声ファイル名 | SDカード内のファイル番号 | 音声テキスト |
---|---|---|
000 | 1番目 | 0 |
001 | 2番目 | 1 |
... | ... | ... |
059 | 60番目 | 59 |
060 | 61番目 | It's |
統合プログラムとリアルタイム放送
Base ShieldをArduino UNOに接続します。Grove - MP3 v2をBase ShieldのD2ポートに接続します。Grove - Speech RecognizerをBase ShieldのD5ポートに接続します。Grove - RTCをBase ShieldのI2Cポートに接続します。
以下のコードをArduino IDEの新しいスケッチにコピーし、Arduino UNOにプログラムをアップロードします。
「HiCell, What's the time」と言うと、MP3がリアルタイムを放送します。
# include <Wire.h>
# include "DS1307.h"
# include <SoftwareSerial.h>
# include <MP3Player_KT403A.h>
/******* MP3のピンを定義 ******/
SoftwareSerial mp3(2, 3);
/******* Speech Recognizerのピンを定義 ******/
# define SOFTSERIAL_RX_PIN 5
# define SOFTSERIAL_TX_PIN 6
SoftwareSerial speech(SOFTSERIAL_RX_PIN,SOFTSERIAL_TX_PIN);
/******* DS1307クラスのオブジェクトを定義 ******/
DS1307 clock;//DS1307クラスのオブジェクトを定義
void setup ()
{
mp3.begin(9600);
speech.begin(9600);
clock.begin();
Serial.begin(9600);
delay(100);
SelectPlayerDevice(0x02); // SDカードをプレイヤーデバイスとして選択
SetVolume(0x15); // 音量を設定、範囲は0x00から0x1E
}
void loop ()
{
int a=0;
speech.listen(); // Speech Recognizerのソフトウェアポートからデータ受信を開始
if(speech.available())
{
a = speech.read(); // Speech Recognizerからの戻り値を読み取る
if(a==13)
{
clock.getTime(); // Grove - RTCからリアルタイムを取得
int b=1+clock.hour; // 時間データを取得; "0"の音声ファイルが1番目のため、名前の番号に1を加える必要がある
int c=1+clock.minute; // 分データを取得; "0"の音声ファイルが1番目のため、名前の番号に1を加える必要がある
mp3.listen(); // Grove - MP3のソフトウェアポートからデータ受信を開始
SpecifyMusicPlay(61); // "It's"の音声はSDカードフォルダ内の61番目の曲
while(QueryPlayStatus() != 0); // 前の曲が再生終了する前に次の曲を再生
SpecifyMusicPlay(b); // SDカードフォルダ内の"b"番目の曲を再生
while(QueryPlayStatus() != 0);
SpecifyMusicPlay(c); // SDカードフォルダ内の"c"番目の曲を再生
while(QueryPlayStatus() != 0);
}
}
delay(1000);
}
リソース
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品をご利用いただく際にスムーズな体験を提供するため、さまざまなサポートを提供しております。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルをご用意しています。