てんちょーの技術日誌

自分がつまづいたこととかメモ

【Unity/UE4】Hi 5 Glove を使ってみた

はじめに

Hi 5 Glove 出ました。

Home | Hi5 VR Glove

ちょっと値が張りますが、ビタッと決まる環境だと結構いい感じになる…気がします。

ほかのグローブものをあまり試してないのでなんとも言えないところがありますが…。

さて、これ一応サンプルプロジェクトもろもろ公開されてるので、試してみたのを書いておきます。

ちなみに去年一足先にUE4でバリバリ遊んでました。

shop-0761.hatenablog.com

忘れそうなのでメモっておきます。

Unity 編

検証バージョンは以下のとおりです。

  • Unity 2017.4.0f1
  • Hi5 Unity SDK 1.0.0.655

こちらからDLできます。

Unity | Hi5 VR Glove

ドキュメントは英語で同梱されてますが、ざっくり日本語で流れを紹介すると、

  1. Vive の基本的なセットアップは済ませておく
  2. Hi 5 GloveにTrackerをつけてペアリング
  3. Hi 5 用ドングルをPCに挿す
  4. 同梱してるキャリブレーションアプリを実行して、やる(ありがとありがと~ みたいなBポーズ と おけまる的なPポーズ)
  5. Unity Project に Steam VR Plugin を入れる
  6. Hi 5 の Unity Packageを入れてEditorを再起動
  7. [CameraRig]_HI5 を置く

動く!! らしい。

まず手元の環境のせいか、キャリブレーションアプリで手が出ないケースがあるので不安になる。 最初でなくてエラー出ないから分からないし、出ない仕様なのかと思った()

でるっちゃ出るんですが、途中で消えたりしました。謎い。Trackerはいきてる。 アプリを再起動したりすると出ました。うーん。

f:id:shop_0761:20180521165403p:plain

f:id:shop_0761:20180521165021p:plain

f:id:shop_0761:20180521165859p:plain

f:id:shop_0761:20180521165952p:plain

ちなみに去年試したときとキャリブレーションのポーズが一つ減ったので、お手軽になりました。 バッテリー残量と磁気状況を取得できるようです。まだちゃんと見れてないですが、APIがありそう。

---------------- 追記 2018/05/22 ---------------------

ありました。 GetMagneticState() と GetPowerLevel() がありますね。

f:id:shop_0761:20180522162753p:plain

f:id:shop_0761:20180522162805p:plain

これも便利そう

f:id:shop_0761:20180522162822p:plain

振動はこれ 振動箇所は1Trackerをマウントしてる下部分が振動します。 これは完全におまけ機能っぽい(振動の強さや振動パターンはない)(Touchのがいっぱいある)

f:id:shop_0761:20180522163037p:plain

両手同時に発火できるっぽい

f:id:shop_0761:20180522163128p:plain

とりあえず動いたので貼っとく ちゃんと読んでないのであれですが、 ものによってはGloveStatus()が必要そうです(ぱっと出てこなくてあせった)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HI5;

public class Hi5Test : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        print("Magnetic State: " + HI5_Manager.GetGloveStatus().GetMagneticState(Hand.LEFT).ToString());
        print("Power level: " + HI5_Manager.GetGloveStatus().GetPowerLevel(Hand.RIGHT).ToString());

        if (Input.GetKeyDown(KeyCode.V))
        {
            print("vibration");
            HI5_Manager.EnableBothGlovesVibration(1000, 20000);
        }

        if (Input.GetKeyDown(KeyCode.L))
        {
            print("vibration L");
            HI5_Manager.EnableLeftVibration(1000);
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            print("vibration R");
            HI5_Manager.EnableRightVibration(10000);
        }

    }
}

---------------- 追記 2018/05/22 おわり ---------------------

これで準備が終わったはず。ちなみにサンプルシーンの中にこのキャリブレーションのシーンも同梱されていたので、 同一アプリ内でキャリブレーションからVTuberへみたいなことができそうです。

f:id:shop_0761:20180521170702p:plain

先程の手順どおりにPluginなりをいれると動きます。

ハマりポイント

手が出ない

おそらくですが、手が出ない状態でキャリブレーションを済ませるとUnity側でキャリブレーション終わってないよエラーが出る…かも。 うーん、わからん状態であれこれ試してみました。

状況的には

  1. キャリブレーションをアプリからやった
  2. 試しに見つけたUnity側の Calibration Scene でもキャリブレーションしてみた
  3. やっぱり出ないのでExample_Inertia Scene を見てみる
  4. 地に張り付いた手がもにょもにょ動いてた → きてることはきてる
  5. キャリブレーションアプリに戻ると手が映るように
  6. そのままキャリブレーション たまに再起動
  7. 手が見えた状態でキャリブレーション終了 Unityに戻ると普通に動く

といった感じでした。単に環境が悪いせいで一人でハマっていた可能性があります…

UE4

DLはこちら。

Unreal | Hi5 VR Glove

キャリブレーションアプリもUE4製になっていました。Hi5_Mix ってやつ。

f:id:shop_0761:20180521172629p:plain

中身は同じっぽいので省略。

サンプルプロジェクトを開く前にバージョンを見てみると… 4.14.…

これ去年のときと変わってないのでは!?!? つらみ…

しかしPlugin単体の方はこれだけ対応してるので使えることには使えますね セーフ よかった。

f:id:shop_0761:20180521180248p:plain

とりあえずドキュメントを参考にセットアップしていきます。 UE4.19で試しました。

ドキュメントに長々と書いてますが、読むのが面倒でほぼ画像だけみて設定できます。ざっと流れだけ。

  1. Plugins に該当VersionのMotion Capture Pluginを追加 & Editorで有効後 再起動
  2. GameInstance を作って、初期化と終了処理を書く(Projectに設定も忘れずに)
  3. 同階層にある Hand Model をimport このとき Z Rotationを -90 に
  4. 両手分のAnim BP を作成 (以下は両手分行う)
  5. NewPose Calc ノードをFinal Animation Pose につなぐ
  6. NewPose Calc ノードの設定をする
  7. Pawnを作成、Motion Capture Avatar Component を追加 その下に手のSkeltal Mesh を追加
  8. Motion Capture Avatar Component の設定をする
  9. VR Preview で見る

すると動きます。やったー!

f:id:shop_0761:20180521182955p:plain

これをつないで、

f:id:shop_0761:20180521183054p:plain

こんな感じでせっせと設定します。Index 4 に該当するボーンがないので、今回はInvalidのままにします。

f:id:shop_0761:20180521183622p:plain

f:id:shop_0761:20180521183216p:plain

Motion Capture Avatar Component はこんなかんじ。 Avatar Name は右と左で同じであればなんでもいいっぽい。

でサクッと試してみると動きました。

f:id:shop_0761:20180521182334p:plain

サンプルプロジェクトは一応4.14でVSからビルドして開けたんですが、

f:id:shop_0761:20180521192014p:plain

文字化けしててファイル読めてないやんけ!!!!(やめた

まとめ

手汗のことを考えると使い捨てのビニール手袋を使うのがいい気がします。

ちなみにHi 5 + Vive コン を使うときはVive Tracker のドングルが必要です。

逆に言うと HMD + Hi 5のときはドングルがいりません。

コメントより指摘がありましたので修正します
これはHi 5 のドングル側でTrackerをペアリングできるっぽいです。
HMD側にコントローラー用のドングル相当のものが内蔵されているので不要です

【Unity】VR ReadyでないPCでVive Trackerを使う

はじめに

来週 Laval Virtualで展示してくる予定なのですが、 荷物多いから軽めのPCで行きたいなーと思って 手元にあった2012年発売のノートPCで試してみたところ 意外とあっさり動いてしまったので、メモ程度に書いておきます。

動作環境 Unity2017.1.2f1 (作り始めた時がこれだった 2.0からxRSettingsになりつらみ Windows 10 メモリ: 4GB CPU: i5-3210M GPU: Intel HD Graphics 4000

やり方

Vive Trackerの設定はこちらの記事を参考にしてください。

shop-0761.hatenablog.com

VR Ready PCでなくてもSteam VRを入れることはできるので、 Steamから順番にインストールすればよいかと思います。

ポイントはおそらく2点

  • Steam VR はβじゃないと動かない…かも?
  • Init_HmdNotFoundPresenceFailedエラー

1点目はそのままbetaにすればいい話なんですが、 2点目はHMDをPCに挿すことでインストールされるものが必要なのかも。 適当に手当たり次第、HMD側のUSBをPCに挿してドライバ的なやつを いっぱいいれてみたけどダメだったのでググってみたらみつけました。

d.hatena.ne.jp

ありがてぇ…ありがてぇ…

このとおりに2箇所編集するとヘリポートみたいなマークがでるようになりました。

このコンポジターを起動するとHeadset Windowが起動して、利用可能に変わるんですが 処理負荷になるので使わないことにします。それでもうごくのでまあいっかと思って。

このヘリポートっぽいマークが見えてればルームセットアップもできるようで、 とりあえず立位の方は実行できました。

まとめ

今週 ちょうどえむにわさんが試していたようで、後発になってしまいました

PCを機内持ち込みにしたほうがいいよと言われたので、今日試したといったところです。 できてよかった。

実際、これが出来ると雑にいらない安いPCで海外展示が出来たり、 VTuberやりたいけどPCまでは買えない 先にViveだけ買う みたいなことができるかも。

【UE4】円形ゲージのはじまりの位置を変えてみた

はじめに

円形ゲージのような簡単なやつならサクッとUE4のマテリアルで作っちゃうんですが、 今回は円形ゲージの始点?をずらしたいなぁと思って作りました

こんなやつです

f:id:shop_0761:20180223160752g:plain

f:id:shop_0761:20180223160813g:plain

とりあえず90度刻みで時計、反時計できるのは確認できたのでまとめておきます

まあ手を加えればこんな感じのもTextureなしで作れたりします

円形ゲージ

円形ゲージの作り方はこの辺が参考になるかと

pafuhana1213.hatenablog.com

limesode.hatenablog.com

で、今回の肝になるのは VectorToRadialValueの Vector or UVs(V2) Inputです

あんまりいい方法がパッと思いつかなかったので、Material Functionにえいと放り込んでますが、 適宜必要なとこだけ使うほうがパフォーマンス的にはよさそうです

1-x すると逆回転のも作れるのでとりあえず8通りですね

f:id:shop_0761:20180223161421p:plain

中身

RightはDefaultなのでなくてもいいですが、参考までに一緒に並べました。

f:id:shop_0761:20180223161447p:plain

f:id:shop_0761:20180223161504p:plain

ポイントはTexCoordのUVタイリングのとこです 2.0 にしましょう

f:id:shop_0761:20180223161623p:plain

まとめ

Textureの回転なら Custom Rotator なりを使えばいいんですが、TexCoordだとうまくいかなかったので試してみた といったところです

そんなに難しくないのでお試しあれ

【Unity】ViveのHMDなしにTrackerを使う

はじめに

お高いPerception Neuronとか買わなくても今流行のVirtual Youtuberになれる!!(かも)(Final IKは買おう)

ところで、こんなのを作っています

Trackerしか使わない子供向けおもちゃの #Inst_Paper です。HMDいらないなーと思ってて、

つい最近

これきっかけで調べたらまずこれを発見しました。

www.roadtovr.com

ここは Python使って取得するやつで、

その通りやったらできました。サンプルにUDPで送る方法もあったのでそれでやろうかなーと思っていたら、

と言われたので調べてみよ と思っていたら、

と、次々情報が集まってきたのでやったら上手く行った という話です。

やること

VRSettingsを変える

ここらへんに設定ファイルの default.vrsettings があります。

<steamインストールフォルダ>\steamapps\common\SteamVR\resources\settings

これを開いて、 requiredHmd を falseにします。

--- 追記 2019/11/28 ---
default.vr.settingsについて

とのことです


合わせて上記の設定のままだとHMDを1度PCに繋がなければいけないので、こちらも合わせてご確認ください。

shop-0761.hatenablog.com

--- 追記おわり 2019/11/28 ---

f:id:shop_0761:20180108032049p:plain

Steam VRを起動してたら再起動しておきましょう。 利用不可になりますが、通常HMDを繋がないとベースステーションやTrackerが見えるようになります。

Unity側の設定

とりあえずSteam VR Pluginを入れて、Virtual Reality Supportを切ります()

f:id:shop_0761:20180108032253p:plain

一応 Edit → Preferences からAutomatically Enable VR も切っておきます

f:id:shop_0761:20180108032439p:plain

これで準備完了 のはず

スクリプトを書く

のは、めんどくさいので用意しました。

gist.github.com

これを適当にアタッチして使ってください。

こんな感じで使います。

f:id:shop_0761:20180108033556p:plain

すると

といった具合に使えます。ただ、途中でTrackerを追加したりした時に勝手には対応してくれない(監視するのが面倒い)ので、 Resetボタンを用意しました。デフォだとTabキーを押すといけます。(意味的にRefreshのがよかったかも

トラブルシューティング

Steam VR はβじゃないと動かない…かも?

Init_HmdNotFoundPresenceFailedエラー

ビルドした時に動かない

openvr_api.dll がない可能性があります。win64の場合はこのdllをUnityのAssets/Plugins 以下などに適当に放り込んであげれば 動くはず。

64bit

github.com

32bit

github.com

ポゴピン

TrackerのRoleを設定しないと入力が取れないようです

けのじ (@kenoooooji) | Twitter さんが検証してくれました ありがとうございます!

kenoji.hatenablog.jp

まとめ

自分でOpenVRを初期化すればいろいろできそう

このHMDなしバージョンで #Inst_Paper を銀VR 2日目に展示する予定ですのでよければー

http://jvr-fest.com/2017/11/2958/

全く関係ないですが、Udemyの講座 よかったら買って欲しい(割引きクーポンつきURL貼っとくので

https://www.udemy.com/unrealengine-4-archviz-vr/?couponCode=TENCHO_435970www.udemy.com

2017年 作ったものとかをまとめてみた

はじめに

個人的に完成した(と思っている)ものに関してはすぐ忘れてしまうので、 「作ったもの見せて」と言われた時にこの記事にまとめておくと便利かなぁと思いまとめておきます。

意外と時間がかかりそうなので、ざっくりまとめた後、おいおい追記するかもです

1月

お引っ越し(下見)と卒論があったので、後半はわたわたしてるけど、前半はこんな感じ

2016年に作り始めたVRキーボードの別案を年始から作っていたらしい

GASがお気に入りだったので、この頃はslackと連携してアレコレ作ってたっぽい

2月

Mogura VRでちょろっと紹介されたり

卒論 おわらせたのがこのくらい

これのお手伝いをしたり

引っ越し先のおうち Blenderで作ったりした

UE4 Meetup Sapporo で登壇したり

うっかりSVVR(アメリカ)に行くことを決めてしまうなどした

会社から課題を出されていたので、そのためにUnityの勉強をしたりもしてたなぁ

3月

Unity Chan Live -UE4 ver-

4月

Unity Chan Live をモバイルに持っていったり

SVVR 報告会でLTした

atnd.org

https://speakerdeck.com/shop_0761/svvr-en

5月

意外とお気に入りの引き出し

6月

凹みさんの uDD でYoutubeの360度動画を再生するやつ

7月

音声認識でメモを残すやつ

これはこの前LTしました

speakerdeck.com

8月

VALU向けchrome拡張を作った

shop-0761.hatenablog.com

夏コミ 技術書を書いたりしました

shop-0761.hatenablog.com

水彩風マテリアルをまた調整しはじめたり

Unreal Engine Meetup Sapporo にて ライブノーディングのサポートをしたり VR ModeのSequencerの紹介をしたり

ミクさんお迎えしたけど、全然遊べてない…

9月

ぷちコンで UE4 + Network + VRなコンテンツをやっつけでなんとか作った

10月

Inst_Paper 上海で展示してきました

技術書典3にだしたり

Udemyの講師になった

11月

Windows MR で無限に歩けるので公園で歩いた

Inst_Paper 初国内展示

STYLYハッカソンにて、未実装のシーン遷移をハックしてつくるなど

f:id:shop_0761:20171223012943p:plain

12月

イベント用名札メーカー

shop-0761.hatenablog.com

その他

全く関係ないですが3月から東京に引っ越してきて、どうやら大分痩せたようです(体重計がないので分からない

一人暮らししたら、とりあえず食費から削るなぁと思ってて実際そうなった模様。実家にいる間にいっぱい食べとこと思ってたらかなり太ったんですが、それも無かったことになるくらいに…

夏ごろ?に家族に会った時に後ろ姿が変わった(細くなった)とか言われたのを思い出したりしました

なんでこの話を書いたかというと、さっき久々に履こうとしたズボン(春先とか履いてたやつ)がダボダボになってて!?!?ってなったからです はい

UE4のお仕事はいつでも募集中なのでお気軽にTwitter等に連絡くださいね!

twitter.com

【UE4】スマホアプリによくあるスワイプ、ピンチインアウト

はじめに

久々にちゃんと誰かの役に立ちそうな記事を書かねばと思った次第です()

というのもありますが、検証ついでに作ってみたので忘れないようにメモをば。

実装

Playerのカメラ回転 よく忘れるので、どうするのがいいのか迷ったあげく とりあえずPlayerPawnのカメラを直で回しています。ダメっぽい気がするのでいい方法があったら教えてください。

あと、なぜか意図せずRoll方向にも回っていたので、PlayerPawn側で回らないようにしました(ダメそう

Player Pawn


2017/12/13 01:52 修正

Control Rotationに変えたので、Player Pawnのチェックを入れとかないと動かない

f:id:shop_0761:20171213015045p:plain


f:id:shop_0761:20171213010151p:plain

Player Controller


2017/12/13 01:52 修正

Get Component by Class はキャッシュしたほうがよさそう

f:id:shop_0761:20171213015143p:plain


f:id:shop_0761:20171213010227p:plain

CalcPinchRate マクロ f:id:shop_0761:20171213010535p:plain

f:id:shop_0761:20171213010552p:plain

CalcSwipeCameraRot マクロ

f:id:shop_0761:20171213010648p:plain

f:id:shop_0761:20171213010703p:plain

別で入力が欲しい時

f:id:shop_0761:20171213010730p:plain

簡単な説明

indexに合わせてPress時のVector2Dを取っておいて、Movedで差分を計算する感じです。 とりあえず見栄え重視でマクロに突っ込んだので色々アレです。まあサッと試しただけなのでご勘弁を…

まとめ

デバッグにはじめてまともにLauncher使ったけどべんりっぽい!細かい実装はUnityのコードとか参考になります おわり。

GoogleHome で遊んでみたことメモ

はじめに

スマートスピーカー Advent Calendar 2017 の 3日目です。

qiita.com

昨年末はPCのキーボードを封印して音声認識でどこまでいけるか試したりしていました。

コルタナさんがあまりにもEdge頼りなので、気合でPowerShellスクリプトを書くなどしてTwitterをしてました。

shop-0761.hatenablog.com

今回は勢いで購入したGoogleHome miniが思ってた以上に認識精度が高いので、 あれこれ勢いで作って便利になったメモを残しておこうかと。

nodejsは手探りで書いたのであまりよくない書き方かも…。

ついでにAmazon echo dotも安かったので、最後に感想とかも。

やったこと

基本的に RaspberriPi Google Apps Script(GAS) IFTTT の3つでやりくりしてます。

Raspberri Pi zero W を買う

事前にちょろっと調べるとGoogle Home notifier を使えば発話させられるらしく、 これはラズパイ買っとこ と思って秋葉原で買いました。 キットみたいなやつを買ってすぐ使えるやつだったのに、何を思ったかSDカードをフォーマットしてしまい 結局入れ直しました…地味にひっかかったりした…

Hue連携

Hueがあれば、すぐ終わります。なんか覚えてないくらいに一瞬でした。 "部屋"って名前の部屋をGoogleHomeのアプリで作っておくと、「OK Google, 部屋の電気をつけて」みたいに使えて便利です。

wemo連携

家に転がってたwemo mini smart plugをつかうことにしました。 こいつはコンセントのオン/オフができます。

www.belkin.com

IFTTTで連携できるので、とりあえずそのまま使っています。 運用でカバーってやつですね()

IFTTTでコマンドの上書き

どうやらGoogle Homeにある既存のコマンド「おはよう」などはIFTTT連携で上書きできるようです。 はたして需要があるのかコレ。

特に難しい設定もせずにこうすると、上書き?になるっぽい

f:id:shop_0761:20171116094813p:plain

Google Home notifier

セットアップ

qiita.com

記事をそのままやりました。注意すべきはnodejsは7系でないと動かないかもです。 これで喋らせる時に「とぅるん」ってこれから喋るよみたいな音がなるやつ消せないのかな…?

ngrokのURLをslackにPOST

Google Home Notifier では ngrok というのを使ってローカル環境を外部に公開しています。

qiita.com

example.js を実行するたびにアドレスが生成され、これを使えばGAS等からアクセスできます。 サブドメインを割り当てることができるらしいのですが、2.0だと有料、1.0だと無料だそうです。

google home notifierがどっちなのか調べるのも面倒だったので、 urlが生成されるたびにslackへPOSTして、それをOutgoing webhooksで拾い、GASでSpread Sheetに記録してました。 まあ、メリットとしてラズパイが落ちてしまった時にこれらのスクリプトの準備できたらslackに通知がくるって感じですかね。

こんな感じで

f:id:shop_0761:20171116010213p:plain

outgoing webhooks は legacy になってしまったので代わりになるものを探しましたが、いまいちしっくりくるものが無かったので そのまま使っています。ただtokenの生成が前と変わって、権限を付与する形のものになりました。 今はこの3つを許可したtokenを使っています。

f:id:shop_0761:20171116011350p:plain

api.slack.com

qiita.com

example.jsに追記する感じで書いています。

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('POST "text=Hello Google Home" to:');
    console.log('    http://localhost:' + serverPort + '/google-home-notifier');
    console.log('    ' +url + '/google-home-notifier');
    console.log('example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');

   //ここから
        var request = require('request');
        const HOST = 'https:\/\/slack.com/api/chat.postMessage';
        var options = {
                url: "https://slack.com/api/chat.postMessage",
                form: {
                        "token": "とーくんをいれる",
                        "channel": "#googlehome",
                        "text": "ngrokのアドレスが変わったよ " + url + "/google-home-notifier",
                        "username": "GoogleHome_Assistant"
                }
        };

        request.post(options, function(error, response, body){
                if(!error){
                        console.log("BODY: " + body);
                }

                else{
                        console.log("error: " + error.message);
                }
        });
  //ここまで
  });
})

trello にメモを残す

Google Home 標準で買い物メモを残せますが、消すのはアプリ経由らしくて面倒いのでtrelloで管理出来るようにしました。 カードの追加/削除 がボイスコマンドで出来ます。全てのカードの読み上げもできるようにしようかな。

GAS側のコードはこの辺にまとめておきました。

gist.github.com

IFTTTはこんな感じで。

f:id:shop_0761:20171116013755p:plain

こうして「メモに牛乳を追加して」というと、「牛乳を追加」とSpread Sheetに書き込まれるので、 追加の文字列が入ってたらtrelloにカード追加、無かったら削除 みたいにしてます。

実行済みのチェック

Spread Sheet に書き込まれたタイミングでGASを実行するため、適当に編集してると 何度も関数が呼ばれてアワアワすることになるので、こんな感じでチェックするようにするといいでしょう。

f:id:shop_0761:20171116014152p:plain

function checkCmdDone(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //sheet が複数あるので名前で指定
  var sheet = spreadsheet.getSheetByName('CommandLog'); 
  var value = sheet.getRange(sheet.getLastRow(), 1, 1, 2).getValues();

  if(value[1] != "Done"){
    sheet.getRange(sheet.getLastRow(), 2).setValue("Done");
    return true;
  }
  
  else{
   return false; 
  }
}

勝手にしゃべる

細かく時間を指定して実行できるらしいです。(知らなかった)

qiita.com

これらを使って勝手にしゃべるようにしました。

ゴミ捨ての通知

ゴミ捨て表をSpread Sheetで作って、そこを参照しつつ通知してくれます。 前日の夜とかに知りたいので少しindexを調整してます。

f:id:shop_0761:20171116015341p:plain

  for(var i in cels){
   // todayは12/3(日)10:00表記になるものを作っておいて、indexOfでさがしてる
    var index = readableDate.indexOf(cels[(parseInt(i)+1) % (cels.length)][0]);
    var state = cels[(parseInt(i)+2) % (cels.length)][1];

    if(index > -1 && state != ""){
      //読み上げ
      textToSpeech("てんちょーさん、今日は" + state + "だよ");
    }
  }

ストレッチの通知

ストレッチし忘れるので、さっきの時間指定できるTriggerで設定しています。

降水確率の読み上げ

天気はスクレイピングしてきて使っています。 現在の時刻に合わせて、それ以降の降水確率を読み上げてくれます。 スクレイピングしてきたときに、過去の降水確率は"-"みたいになってたりするので、 その時は読まない、みたいにして書いてます。大したことないので省略。

ミクさんに喋ってもらう

という気持ちで作りました。 多分 OpenJTalk + MMD Agentの初音ミクの音響モデル が1番ラクな気がしますが、 あまり好みではなかったのでゴリ押しで作りました。

流れとしては

  1. Google Home で音声認識 + IFTTT でSpreadSheetに書き込み
  2. GASで検知して、Raspberri Pi にテキストを送信
  3. MeCabでカナ読み取得
  4. 一文字ずつに分割
  5. 対応する.wavファイルを探す
  6. sox コマンドで一つの.wavファイルに
  7. google home notifier で音声ファイル読み上げ

って感じですね。面倒いので全部は書きませんが、ポイントだけ。

  • MeCab で品詞分解に失敗して読みが取れない時がある
  • 数字は漢字に変換してMeCab
  • 促音・撥音・拗音・長音あたりを考慮して分割

これ作ってる途中で気づきましたが、GASってzip作れるんですね…やばみ…

gist.github.com

Amazon echo dotとの比較

Amazon echo dot は Google カレンダーに予定を追加できます。Google Home mini では出来ません。 ????どういうこと????

あとAmazonで買い物できますが、やり取りが長いので喋るくらいならポチポチしたほうが早いという印象です。 Hey mikuも使えます。ただ1回遊んだら終わりですかね…

それと体感的な話ですが、echo dotは自分で再生しはじめた音楽のせいでマイクの感度が落ちる…?自爆…? その点Google home miniのが優秀な気がします。布団からごにょごにょ喋っても反応したり、 モニターを正面に座り、真後ろに置いてあるGoogle home mini に話しかけても反応したりします。すごい。

まとめ

ここまでやるともはやGoogleHomeである意味とは…?という気持ちになります。 ただ、GoogleHomeの認識精度は魅力的ですね。