windows10 WSL ubuntuにrubyを入れつつgem(tsukuba-gc)を動かす
やりたいこと
つくば市のゴミカレンダー、2018年度データが出た。
GoogleHomeアプリはカレンダーデータを手でデータ入力してる。非常に原始的だ。
しかし調べたところpdfを解析するrubyのgemがあるとのこと。
ruby初挑戦しつつ使ってみることにする。
環境構築
$ sudo gem install tsukuba-gc
- NG
RMagick 2.16.0. Can't find Magick-config or pkg-config 発生
gem tsukuba-gc install
$ sudo gem install tsukuba-gc Fetching: concurrent-ruby-1.0.5.gem (100%) Successfully installed concurrent-ruby-1.0.5 Fetching: i18n-0.9.5.gem (100%) Successfully installed i18n-0.9.5 Fetching: thread_safe-0.3.6.gem (100%) Successfully installed thread_safe-0.3.6 Fetching: tzinfo-1.2.5.gem (100%) Successfully installed tzinfo-1.2.5 Fetching: activesupport-5.0.6.gem (100%) Successfully installed activesupport-5.0.6 Fetching: tsukuba-gc-0.1.0.gem (100%) Successfully installed tsukuba-gc-0.1.0 Parsing documentation for concurrent-ruby-1.0.5 Installing ri documentation for concurrent-ruby-1.0.5 Parsing documentation for i18n-0.9.5 Installing ri documentation for i18n-0.9.5 Parsing documentation for thread_safe-0.3.6 Installing ri documentation for thread_safe-0.3.6 Parsing documentation for tzinfo-1.2.5 Installing ri documentation for tzinfo-1.2.5 Parsing documentation for activesupport-5.0.6 Installing ri documentation for activesupport-5.0.6 Parsing documentation for tsukuba-gc-0.1.0 Installing ri documentation for tsukuba-gc-0.1.0 Done installing documentation for concurrent-ruby, i18n, thread_safe, tzinfo, activesupport, tsukuba-gc after 22 seconds 6 gems installed
- OK
動作チェック
$ tsukuba-gc 30north.pdf 2018 -o 30north.json
🎉目的達成🎉
- しかし出力結果が全然良くない…
- 最近のpdfに対応できなくなってしまったか、ライブラリのどっかでミスってるか。
- ちゃんとやるならforkしてpdf解析部分修正する必要ありそう。
- 時間無いので差し当たりは1月分手入力する…😖
終わりに
rubyの日本語情報の多さは化け物。エラー文言で検索するとほぼ何らかの記事が出るという…。
Qiitaに感謝するwebエンジニア多いのが分かるなあ。
Google Homeを遊びたおす会へ行ってきた(雑記)
田中みそさんが主催したGoogle Homeを遊びたおす会に行ってきた。
個人主催の勉強会で、300人近い規模の奴は初めて。終わってみると暴動等もなく、懇親会もいい感じに熱気があって良かったなー、と思う。
あとはGoogle社の山口さんに個人的な質問ができたのは収穫だった。
詳細
Google Homeでつくるスマートホーム by 田中みそ
- TVの操作で音声操作は煩雑。結局はリモコンが楽。Firebase Hostingでアプリ化したリモコン1個で完結させる。
- 家電操作程度ならIFTTTで作るのは問題ない。簡単に変数取れるので楽。
- GoogleHome怖い話。深夜に家電が勝手に動作。外部侵入を疑ったが、寝言に反応してGoogleHome起動してただけだった…
- 「嫁ブロックどうやってクリアした?」
- 「実用に訴える。実際小さな子供がいて、手が離せないときに家電操作は便利で実用に足る」
- 「沢山GoogleHome買ってたけど使用頻度どう?」*1
- 「いろんな部屋に置いたけど、ほとんどの利用はリビング」
他にも色々質問あったけど、メモが間に合わず。
メモ
- リモコン1個に統合(スマフォのみ) > 音声操作 > リモコンだらけ という使い勝手の図式がありそう。スマフォでできるならそれでいいよね。でも、メーカーごとにリモコンアプリ出されてもうざいだけ。
- バナナパンツでアイスブレイクしていくプレゼンスタイル。技術者には、芸人スキルも必要ということ。大変な時代。
- 勉強会に参加して田中さんのイケメン具合を確認しよう、というキャッチコピーが思い浮かんだ。
AoG会議室予約システムの構築 by MS太田さん
- OAuth認証必要なエンドポイントとの連携はすぐできるよ!
- AoGのoverviewの一番下にAccountLinkingある。認証方式色々ある。細かく説明しないけど、OAuth知ってる人なら悩まないような項目だよ。楽勝。
- シミュレーターでのAccountLinkingテストは会話が即終了するのでハマる。DEBUGタブに認証トークン(?)出てるのでそっちを見よう。
- 会議室予約システムのサンプルコード、GitHubにコード上げてるので見てね。AccountLinkingのサンプルとしても使えるはず。
- AoGの最大の強みは、Android携帯で(iOSでも)動くということ。スマートスピーカー持ってない人でも、スマートスピーカー持ってるようなもん。意識していこう。
質疑無し。
メモ
- AccountLinking使ったことないので参考になる。ソース公開されてるのでありがたい。
- AoGシミュレーター周りはハマりポイントが多い。個人の知見がわりとある気がするナァ。
- Office365とリンクしてたけど、G suiteとも行けるようになるんじゃね?的なtweetがあった。G suite使った良い感じのアプリ作れそう。
Google Home 用のお遊びアプリをMicrosoft Azure使って作ってみた by ちょまど
- GoogleHomeはおばあちゃんのためにこそ使うべき。
- スマートスピーカークイズやろうぜ!…正解率ヤベェ。恐ろしいところに来てしまった。
- 一応Cortana搭載のスマートスピーカーあるよ。日本発売未定。(やらなそうなニュアンス…)
- AoGのFulfillmentとして色んなCloudが選択できるよ。C#使いたいので、MS Azure使ってます。C# でHttpTriggerというコードで楽に作れるよ。
- 音声をマッチョに変える、まっちょまど作った。まっちょまどという名称は却下されたので、アプリ名はしかたなく筋肉ボイスに。(うろ覚え)
- GitHubにコードあるよ。Azure使ってくれや。
メモ
- 設備不具合のため、大変なことに。田中さんもデモできなかったので、GoogleHome周りのプレゼン機器呪われるのかもしれん。
- 技術者は油断すると固いプレゼンになっちゃうことが多いと思うので、クイズ付きのプレゼンできる人はそうはいない。と、おもう。
Actions on Googleでできること by 山口能迪さん
- IFTTTメリデメ。メリットはコードなしで作れる。デメリットは応答結果が無いこと。
- メディア系のアプリ=DirectActionsは法人事業者のみ対応してる
- Explicit invocationで会話変数取れるので、会話が短縮できるよ。
- Implicit invocationでファジーなユーザー呼び出しからアプリが呼び出されるようになる。もっとImplicit入れてくれ。*2
- ユーザー入力のゆらぎに対応するには形態素解析とかやらんといけないので大変。そこらへんはDialogflowで対応できる。コンソールからユーザー入力見てトレーニングしていこう。
- ラズパイあるならAIY Voicekit使おう。田中さん使ってくれ。
- 「Chrome CastのGoogleHomeテレビつけてがサードパーティに取られてるんだけど!」
- 「AoGの内部処理でランキングが変動したせいかも。日々調整してます。まずいので対応したい」
- 「simulatorでImplicit invocation動くのか?」*3
- 「設定でOFFモードになっててONにしました。できるようになってるはず」
- (fishさんの質疑にて)「終了系のIntentとか各ユーザーが作るのは無駄では?共通化してほしいんだが」
- 「公式からsample出します!zipインポートして使えるようにします」
メモ
- 懇親会で山口さんに質問したくて長蛇の列。山口さん休む暇もなし…。
- 懇親会にて:スマフォのGoogleAssistantから表示できる使い方・ヒントページにある楕円で囲まれた文字部分は「押せる」。押そう。
- 懇親会にて:SSMLで文末の「?」部分をうまく疑問形音声にできないか。*4
- 対応に挙げときます!現状でも、疑問文的な文末表現は疑問形で発話している。漢字の読みが変わるなど、日本語固有対応が必要なことが多い。何か気づきあればサポートページから投げてほしい。
- Explicit invocationは2個引数取れるようだ。がおまるさん試してた。色々できそう。
Invocationの設定できた!「BMI 測定を使って170cmで80kg」と言えばBMI値返ってくるようになったよ#dialogflow#GoogleHomeを遊びたおす会
— がおまる@スマートスピーカー・HoloLens研究者 (@gaomar) 2018年3月28日
質問できなかった
- テストアプリはAoGのtestDraft押下しないと1ヵ月で反応しなくなるらしいけど、最近どうなの?
- 面白ワード(↑↑↓↓←→←→BAとか)に反応するけど、一覧とかある?
Dialogflow tips by fishさん
- Dialogflow挫折経験あり。頑張りたい。
- Dialogflowは静的な処理は得意。プログラミング不要でほぼできる。
- Entityってなんだ?辞書みたいなものと考えよう。必須チェックボックス入れないと取りこぼし出ることがあるよ。
- Intentアンチパターン。似たような会話のintent作りまくると、失敗することが多い。Entityを使い1つのintentにするとよい。
- Dialogflowはいろいろなサービスと繋がれる。システム作る場合は、Dialogflowをなるべく処理フローの先頭に持ってくるべき。体験として後ろの方に置くとキツかった。
- 設計Tips。zipエクスポート機能があるので、定期的にエクスポートして差分管理するとよい。
- スクリーン無い状態であれこれ説明するのは無理だ。スクリーン有無状態が取れるので、処理を分けよう。
- プロジェクト上限数は課金して申請すればもりもり上げられる。課金自体は無駄にはならないので申請しよう。
- 遊び倒す。Dialogflowでmp3再生はコード書かなくてもすぐできる。やろう。
スポンサーLT by Smart Hacksさん
- ランキング見るとGoogleHome / Amazon echoでアプリ人気違う。片方でダメでももう片方で使われるかも。
- 企業作成アプリに個人アプリも負けてない。作ろう!
- 開発者個人インタビューやってるよ!あと企業さん広告いかがっすか?*5
納豆ご飯を作る非電源ゲーム
友人2人と久しぶりに非電源ゲーム作りを行った。
納豆ご飯を作るゲーム。
ダミー食材が多いのでうまくそれを避けながら、うまく普通の納豆ご飯を作る、という感じ。
仕様策定とテストで5時間ぐらい。かなり楽しかった。
ルール
その他
チームでブレストでアイディアを出しまくり、収束させるというデザインスプリントテクニックを利用して
ダミー食材を選定した。
Voice UI Designer Meetup Tokyo個人メモ(雑記)
3/14 Google社主催の Voice UI Designer Meetup Tokyo行ってきた。
Google社の内部に入るの初めてだぜ!いろはす無料。というか六本木ヒルズ初めてだ。
公式
まとめ
- 日本語VUIのエッセンスは安藤幸央さんの資料が最強。会話は人でも難しい。誘導尋問的に作るとユーザーにやさしい。
- GoogleHomeはGoogle社の技術の結晶。騒音の中で呼びかけに応答できるようになる壁を越えたので製品化できた。
- IoTべからず集は残酷だが真実味ある…😰
詳細
Actions on Google / Google Home セッション
- 徳生 裕人さん
- スライドどっかにある?(不明)
- Google社的にAIファーストで進めている。あらゆるプロダクトにAIを。
- 騒音の中の音声認識エラー率25%に減ったので製品化できた。
- 音声合成もmsecですごいことやってる。不気味の谷を越えた。
- 社の使命:「(あらゆる)相手のコンテキストを正しく受け付けて、正しいものを返す」を実践。
- ペアレンタルコントロール今年対応
- 多言語対応。日本はかなり早くやった。中国語予定はスライドに無し(去年の実績の話だから乗ってなかった?)
- トランザクション日本対応予定(時期明言無し)
- アプリのサジェスト改善していきます。最初期よりは良くなってる。
質問など
togetterにまとまってる。
- GoogleHome応答早いけど国内なの?firebase us-centralだけど遠くね?*1
- 国内で完結しない。がんばってます。
- SEO的なことどう考えてる?広告とかは?
- 普及期はまず信頼感構築が優先。
- GoogleHomeアプリはアプリ?アクションどっちで呼べばいい?海外だとアプリと呼んでることが多いけど
- アプリでいいんじゃない?アクションだとカバーする範囲が狭い印象。
質問できなかった
- (マイクオープンで)ユーザー入力待ちになると、(開発者目線だと)短く簡潔に言おうとして焦る。なんかテクニックある?
- 日本語のグローバル終了キーワードについて詳細教えて
- こないだfirebase落ちたけど、GoogleHomeアプリのサービス健康状態悪くなった。firebase落ちた時にサービスごと落ちるのを回避する設計方針(ベストプラクティス)教えて。
- ユーザー入力音声からテキスト以外の情報取り出せないか?会話のテンポだとか、声の大小。ユーザー感情の分析にテキスト文面以外のアプローチ無いの?
- ssmlの日本語文末「?」の処理うまい方法ある?
VUIデザインの勘所
- 安藤 幸央さん
- めちゃめちゃ(日本語)VUI研究してる
- 設計の一番最初はマインドマップが良い
- 海外はモックツールが色々ある。ボットモック集めたサイト良すぎるので見て。
- VUIのペルソナをまず作る。その方が会話パターンを作りやすい。
- メラビアンの法則。音声だけでは7%しか伝わらない。難しいことは避ける。
- 秘書の本がVUIの参考になる
- アプリの使い方の説明。もう具体的に説明する方がよい。GoogleHome/echoのパッケージ見て。
- 会話は難しい。VUIは誘導尋問する方が会話しやすい。
- 音声入力は失敗したときのストレスが酷い。人格を意識する裏付けではある。ハッカーの人の記事が参考になるぞ。
- IoTべからず集。IoTを使い続けてくれることはほとんどない事例集。唯一うまくいく例がある。
- 電車しりとりが一番使われる。乗換案内はそれほど…
- VUIはスマフォ苦手な人、子供やお年寄りがむしろターゲットなのでは
- パスワードをユーザー音声で入力させる設計はヤバイ。どうしてそういうことになるか。既存のものをそのままVUIに適用するとハマる。VUIの強みが何かを意識して作らないと。
- Leszek Zawadzki氏の会話の種別がVUI設計に役立つ。アプリ・ペルソナごとにそれぞれの比率を変えて対応する。マインドマップの最初の枝もこれにしている。
- VUIのおもてなし。対応を尽くすこと。
- 会話を導くエージェントは2種類に分類できる。多数ある設定条件から1つのゴールに絞り込むもの(逆ピラミッド)。ゴールが多数ある中の一つを選ばせる探索型のもの(ピラミッド)。
- 隠れ強化。表面に出ないが裏側で強く対応しているなど。秘書感。
事例紹介
疲れてほぼメモなし…。(このメモも内容と合ってるか不明)
- 伊東 春菜さん
- 台本の作り方はコツあり。修正しやすいように作る。
- フローはチームで必要なら作る。
- 色んな回答を用意する。エラーはランダムにする。
- UXを上げる。言葉をよく吟味する。
- 根岸 秀樹さん
- ペルソナを作りこむ。ブランディング。
個人メモ
- VUIで異口同音はかなり避けたい問題。チェックツール無いのか?
- 目指すものは何でもかんでも受け付けるアプリなのか?何でもかんでも受け付けないアプリなのか?(特定の用途のみ)
- 個人開発だと後者を意識したほうがよさそう。前者は大企業に任せる。
- VUIのUX鍛え上げるには、動くものさっさと作ってテストして鍛え上げる方が良さそうなルート。紙面や理論優先だと良くないものができる可能性あり
- ラジオの音声(文言)は素晴らしい。専門の処理は専門家の話し方が参考になりそうだ。
デザインスプリント体験
以前デザインスプリント本買ってざっくり読んだけど、こんな立派なことできねーよと思ってほったらかしてた。
今回は体験できるとのことで、戦々恐々としながら参加。
知らない人で集まっても、短期間でものすごい集中してアウトプットできたのは驚き。良い体験だ。
個人開発への応用には、効果は限定されるけどアイディアの発散と集中が使えそう。
本から入門だと理屈優先になるので、やる気がしなかったけど、
スプリントマスターの指導の下で体験してから理論を補強していくのが正しい気がした。
デザインスプリント ―プロダクトを成功に導く短期集中実践ガイド
- 作者: Richard Banfield,C. Todd Lombardo,Trace Wax,安藤幸央,佐藤伸哉,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/11/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
ピンとこなかった本これ。
実際にやった流れ
- 本日のテーマ・目標物・ざっくりとした作るものを提示
- 付箋にとりあえずテーマに関するものを書き出す(個人作業/発散)
- それぞれが内容を説明しながら付箋をボードに貼る。似たものは固める(チーム作業/収束)
- ある程度の集合が出来たらそれに名前を付けるとわかりやすい
- 付箋全体を見て、個人の持ち点3点を良いアイデアにシールで投票する。この時は黙ってやる
- 特例なし
- 最高点テーマについて実際の使用シーン(情景、タイミング)を書き出す。1コマ漫画を8個描くイメージ(個人作業/発散)
- 画面の説明ではなく、ユーザーがどういうときに使うかを描くこと。棒人間で良い
- とにかく短い時間で8個埋める
- それぞれがシーンについての内容を説明する。また投票を行う。持ち点3点
- 投票結果のシーンを元に、実際の会話フローを書き出していく
- VUIの場合は吹き出しでユーザーとデバイスのやり取りを書いていくと良い
- それぞれが紹介する
- 目標物の具体的イメージが固まる
- この後どうするか不明。モックづくりに入る??
ポイント
- アイディアを出し切る、絞り込む(発散と収束)を繰り返してアイディアを洗練させていく
- ユーザーレビューは必要(何回か回すことも)
- レビュー用のモックは集中して作りこむ
- モックはレビューの肝を抑えたもので、UXに関係ない場合は見た目が酷い状態のものもある(ハードウェアなど)
- ユーザーレビューまで通すと決裁者の同意を得やすい
- デザインスプリントに適さないものもあるので注意。作るものが決まっている・開発速度優先など
- 絞り込みの投票制ルールは色々パターンがある。今回はシンプルに特例なし。(持ち点3点)
- ユーザーの意図と対象取り出すインテントマッチングは中核となる技術。Dialogflow使ってね。
- デザインスプリントでググればGoogle社の資料あるので見て
その他質疑などのメモ
適当メモ。全然違うこと言ってたかもしれない。
- push通知できるようになったら、音声案内をユーザーに適切なタイミングでできるようにするのがよい。一度にわーっと説明しても全然分からんので。
その他
なんかヒルズ前にタカアシ蜘蛛的なオブジェあったけど何なんだろう。
*1:これ自分
Actions on Google(actions SDK)にて Implicit Invocationを設定したけど動作確認ができない(雑記)
(3/14追記)
Google公式で日本国内のImplicit Invocationについての案内が出ています。
developers-jp.googleblog.com
====
actions SDKにて、カスタムインテントを使いたい。
公式のドキュメントを参考に、アクションパッケージ(actions.json)に追加アクション(Implicit Invocation)を定義した。
しかし、これがsimulatorでも実機でも動かず、途方に暮れていた。
公式のサンプルコードやGitHubのサンプルソースを見ても、ものすごく簡単に実現していることなので全然理由が分からず非常に混乱してしまった。
日本語のImplicit Invocationの現状。
VoiceAppLabさんが状況を知っていた。助かりました。
テストできないですよねー。ウチのアプリもリリース後、しばらくしないと反映されなかったです。
— ボイスアップラボ (@voiceapplab) 2018年3月9日
(恐らく)リリース後に反映されるような項目のようだ。
開発段階にてテストできないのは不安でしょうがない。
Implicit Invocationをやる場合はリリース後のupdateで対応する感じが良いかもしれない。
関連の記事
他の方のtwitter
例えば日本語の場合だと「山手線動いてる?」がImplicit Invocationの良い例かと思います。
— Yoichiro Tanaka (@yoichiro) 2018年2月3日
公式資料
- Invocation and Discovery -- Explicit(アプリ名呼び出し) とImplicit(暗黙呼び出し)がある
Overview | Actions on Google | Google Developers
- Implicit Invocation -- 暗黙呼び出しについて
Qiita
- Explicit / Implicitが良くまとまってる良記事。
- SimulatorでImplicit Invocationが動かないという情報あり。
- ちょっと逸れるけど、action invocation phraseについて
- action invocation phrase現在機能している。シミュレーターと実機で確認済み
- アプリ名+でXXして、等で呼びかけると変数としてXXが取れる
- この時のインテントはapp.StandardIntents.MAIN
Stack Overflow
初回呼び出し時のカスタムインテントについての議論ではなく、アプリ起動以降の処理についての話だと思われる。
初回呼び出しカスタムインテントは動いてそうな雰囲気なのでめちゃめちゃ悔しい😫
サンプルソース
GitHubでのactions SDKのサンプル。raw.inputという独自Intentを定義している。
簡単な定義だが…しっかしこれがSimulatorで動かないのだ…。
https://github.com/actions-on-google/actionssdk-eliza-nodejs(GitHub - actions-on-google/actionssdk-eliza-nodejs: Eliza Actions SDK sample for Actions on Google]
Actions SDKのアプリの終了処理について(メモ書き)
action.jsonにアプリ終了処理を書けるという公式の説明がある。
調べた感じ、日本語だとあまり対応していないようだ。
Actions SDKにて日本語での終了処理を書く場合は、素直にapp.StandardIntents.TEXTのコールバック関数内でグローバル終了処理を記述したほうがよさそうだ。
公式
App Exits | Actions on Google | Google Developers
英語モードでは以下の発話が認識されると、アプリは特に終了音声もなく終了する。
- "exit"
- "cancel"
- "stop"
- "nevermind"
- "goodbye"
actions.jsonにinDialogIntentsを追加すれば、actions.intent.CANCELが発生する。
そこに処理を書けば終了時音声を発話できるようになる。
日本語の対応
キャンセルのみ同等の処理が動くことをシミュレーターで確認。
今後の対応で増えそうではあるが…
- "キャンセル"
対応してない単語
- "終了",”イグジッド"
- "ネバーマインド"
- "グッドバイ","さようなら"
その他
Actions on Googleのシミュレーターは発話中でも次の値を入力しても問題ないようだ。
テストをさくさくやりたい場合はどんどん値を入力していけるので、どんどん使っていきたいところだ。
Windows10 WSL(Ubuntu)にMeCubのインストール
使い方
$ echo "バーチャルユーチューバーのじゃロリおじさん。" | mecab -d /usr/local/lib/mecab/dic/mecab-ipaバーチャルユーチューバー 名詞,固有名詞,一般,*,*,*,バーチャルYouTuber,バーチャルユーチューバー,バーチャルユーチューバー の 助詞,連体化,*,*,*,*,の,ノ,ノ じゃ 接続詞,*,*,*,*,*,じゃ,ジャ,ジャ ロリ 名詞,固有名詞,一般,*,*,*,ロリ,ロリ,ロリ おじさん 名詞,一般,*,*,*,*,おじさん,オジサン,オジサン 。 記号,句点,*,*,*,*,。,。,。 EOS
nodeのmecubライブラリ
ライブラリ2つあり。
utf-8対応済みだと、ライブラリで文字化けが発生しないようだ。
neologdを利用したいので前者を採用した。
- neologd利用可能
- 実行時にutf8化オプションあり
- 最初は何も考えずこのモジュールを使ったが、WSL(ubuntu)ではうまく動作せず文字化けしたままだった
その他
neologdのインストール先確認方法
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd" /usr/local/lib/mecab/dic/mecab-ipadic-neologd
振り返り
住所の地名の読み仮名を作成しようと思い、最初は何も考えずGoogle Translate APIに突っ込んでローマ字読みを取り出そうとした。
しかし日本の地名は、漢字を素直に読んだものではなく、変わった読み方などが多くエラー率が高かった。
今回はMeCub+neologd+jpanese(Node module)で対処したが、完全ではないにせよ翻訳APIよりは精度が良かった。
メモ
VUI読み上げ時用のjapanese option(若干イマイチ)
const joption = { "ああ": "aa", "いい": "ii", "うう": "uu", "ええ": "ee", "おお": "oo", "あー": "aa" }; let roma = japanese.romanize(yomi, joption);