N.Yamazaki's blog

主に音声合成について思ったことを書いてみようと思います。
<< 音声合成LSIで「オリジナルの音声時計」を作ろう!- その3 ソフト編 | main | MCP2210 DLL用のheaderとlibファイル >>
音声合成LSIで「オリジナルの音声時計」を作ろう!- その4 カスタマイズ編
前回、基本スケッチでハードウェアとソフトウェアの動作確認を行いました。あとは、オリジナル音声時計にするためのカスタマイズ・改良を行って完成です。

■スケッチをカスタマイズしよう
ソフト的なカスタマイズは、前の記事で使用した基本スケッチ(YukkuriClock2.ino)をベースに、このファイルを編集して行います。

基本スケッチでのメモリ容量は、チップの容量のROM:19%、RAM:23%でしたので、まだまだカスタマイズ・機能拡張の余地がありますね。ただ、注意すべき点は、メッセージの音声記号列をRAMに配置してしまうとあっという間にRAMが足りなくなりますので、文字列はROMに配置されるようメッセージのPSTR指定は必須です(ヒントは PROGMEM/ハーバードアーキテクチャー)

スケッチをカスタマイズしたら、ATmega328PをArduino Unoに挿して、以下の操作でカスタマイズしたスケッチを書き込めばOKです。
  1.     メニュー:ツール > ボード > Arduino Uno
  2.     メニュー:ファイル > マイコンボードに書き込む

以下に、具体的なスケッチの変更方法を示します。

・記念日と、そのメッセージを変更するには
基本スケッチでは2月11日と3月14日にメッセージを発声するようにしていますので、月日とメッセージを任意に書き換えます。 記念日は、ソースコードを並べればいくつでも増やせます。

なお、dayLast変数に発声日を保存することで、その日の最初に一回だけ発声するようにしています。
// 記念日のメッセージ発声
void MessageKinenbi(const AQ_DATE_TIME &dt)
{
  static uint8_t dayLast = 0;   // 同日の発声は1回のみにするため、発声日を保存
  if (dt.d != dayLast) {
    // 誕生日
    if (dt.m == 2 && dt.d == 11) {      // 2月11日
      TalkP(PSTR("otannjo-'bi,omedetoo'")); //「お誕生日おめでとう」
    }
    // 結婚記念日
    else if (dt.m == 3 && dt.d == 14) { // 3月14日
      TalkP(PSTR("kyo'-wa kekkonnkinenn'bi")); //「今日は、結婚記念日」
    }
    // ... 必要に応じて追加
    dayLast = dt.d;
  }
}
yukkuriclock2.ino:MessageKinenbi()

メッセージは、音声記号列で指定します。ローマ字のようですが、少しでも間違っているとエラーになり発声しませんので、別途、アクエストのサイトのデモページで確認することをおすすめします。このサイトでは漢字テキストから音声記号列を生成できますし・・・。また、「AquesTalk pico LSI」ATP3011XXのデータシートにこの音声記号の仕様があるので、一度目を通しておくとよいでしょう。

・曜日毎のメッセージを変更するには
MessageWeek()関数で、曜日毎のメッセージを記述しています。ここでも、その日に一度だけ発声するようにしています。 先の記念日と違う部分は、発声時間を限定している点です。基本スケッチではゴミ収集のメッセージなので夜は発声させません。 このような条件もメッセージに合わせて自由にカスタマイズできます。
// 曜日ごとのメッセージ発声
// ゴミ収集日のメッセージ発声
#define STR_WEEK_FUTSU  "kyo'-wa moyasu/gominohi."
#define STR_WEEK_PURA   "kyo'-wa purasuchi'kkuto shige'nngominohi."
#define STR_WEEK_PET    "kyo'-wa pettobo'toruno/gominohi."
void MessageWeek(const AQ_DATE_TIME &dt)
{
  static uint8_t dayLastWeek = 0;   // 同日の発声は1回のみにするため、発声日を保存
  if (6 <= dt.hh && dt.hh <= 9) {   // 6時から9時に限り
    if (dayLastWeek != dt.d) {
      if (dt.w == 2 || dt.w == 6) { // TUE/SAT
        TalkP(PSTR(STR_WEEK_FUTSU));
      }
      else if (dt.w == 3) { // WED
        TalkP(PSTR(STR_WEEK_PURA));
      }
      else if (dt.w == 5) { // FRI
        TalkP(PSTR(STR_WEEK_PET));
      }
      dayLastWeek = dt.d;
    }
  }
}
yukkuriclock2.ino:MessageWeek()


・アラームを変更するには
RTCにあらかじめ時刻を設定しておくと、その指定時刻に割り込みが発生し、このMessageAlarm()関数が呼ばれます。 設定時刻は、スケッチ先頭部分にある「アラーム起動時刻」で指定しています。
基本スケッチでは、平日に限り「おはよう 朝です」と発声していますが、これも自由に条件とメッセージを書き換えてください。
// アラームのメッセージ発声
void MessageAlarm(const AQ_DATE_TIME &dt)
{
  if (1 <= dt.w && dt.w <= 5) { // 平日のみ
    TalkP(PSTR("ohayo-' a'sade_su."));  // 「おはよう 朝です」
  }
}
yukkuriclock2.ino:MessageAlarm()

RTCのアラームは一度に1つしか設定できませんが、R8025_AlarmSet()関数で動的にアラーム時刻を設定できますので、アラーム割り込み発生ごとに次のアラーム時刻を設定すれば、曜日ごとにアラーム時刻を変えたり、毎時時報を発声するなんてこともできるでしょう。ちなみに、R8025のアラームは、繰り返えさないので毎回セットする必要があります。

・オリジナルの機能を実装するには
メインループ(loop()関数)内に、オリジナルの関数を追加して、たとえば、毎朝ラッキーカラーランダムに発声するなんてことも面白いと思います。

・発話速度を変えるには
AquesTalk.hのSetSpeed()関数を呼び出せば、発話速度を変更することができます。関数の使い方はArduino用音声合成LSIライブラリを参照ください。

・その他
今回は日時設定に2つのスイッチを使ってますが、1つ、あるいは3つでオリジナルのシーケンスで操作してもいいですね。
カスタマイズは、要は日時情報と振動のトリガでどんなメッセージを出力するかということにつきます。
色々なアイデアで、実際に面白いものをいろいろ試していただければ幸いです。

MySleep()関数は割り込みがあるまでスリープします。ここでATmega328Pや音声合成LSIをSleep状態にして待機時の消費電流を1uA以下にしています。割り込み要因は、振動スイッチ/SETボタン/UPボタンの状態変化(立ち上がり立下りの両方)とRTCのアラーム割り込みです。


■ハードウェアのカスタマイズ

音量の調整は
R4の抵抗を変えて音量を調整できます。音が大きいならR4を4.7KΩなどに変えれば小さくなります。ただし、逆に1KΩ以下にしても大きくはなりません。大音量で使うなら別途アンプ回路を実装します。

拡張用のGPIO
拡張用に3本のGPIO(IO9/IO10/IO11)を用意してますので、これを使ってハードウェアの改良ができます。
「LOTTORP」には3色LEDがついてますので、たとえば、割り込みがあったときにピカッと光らせてもよいですね。
また、今回は振動スイッチ(傾斜スイッチ)を使いましたが、圧力センサーをつなげて握ったときに発声させるなどの応用もできそうです。また、感熱センサーをつけて近くに寄ったら発声するのも良さそうですね。消費電流の課題がありますが・・・。

筐体
今回はIKEAの「LOTTORP」に組み込みましたが・・・
折角、通称「ゆっくりチップ」を使ってるので、やっぱりコレに入れたほうがいいのかな ラッキー


以上で「オリジナルの音声時計」の完成です。

■プレゼント
今回の試作で発注したプリント基板のあまりをプレゼントします。
ただし、実際に製作してそのブログ記事を書いてくれることを条件にしたいと思います。
特に内容や期限はありませんので、お気軽に。
ご希望の方は、こちらからどうぞ。先着順、1人1枚限り(ってほどニーズあるのか!?)


■LINK
AquesTalk デモページ
http://www.a-quest.com/demo/index.html

ATP3011XXのデータシート
http://www.a-quest.com/download/manual/atp3011_datasheet.pdf

Arduino用 音声合成LSIライブラリ
http://blog-yama.a-quest.com/?eid=970151

音声合成LSIで「オリジナルの音声時計」を作ろう!
| 電子工作 | 09:49 | - | - |
PROFILE
Follow
CATEGORIES
LATEST ENTRIES
SEARCH THIS SITE
RECOMMEND
RECOMMEND
RECOMMEND
Arduino Uno
Arduino Uno (JUGEMレビュー »)

AquesTalk pico LSIの評価ボードとして最適
RECOMMEND
Raspberry Pi Model B+ (Plus)
Raspberry Pi Model B+ (Plus) (JUGEMレビュー »)

これと AquesTalk pi で簡単にテキスト音声合成!
RECOMMEND
RECOMMEND
RECOMMEND
SONY MDR-CD900ST
SONY MDR-CD900ST (JUGEMレビュー »)

普段これで開発しています。
RECOMMEND
RECOMMEND
RECOMMEND