えむにわリソース

ITのスキマ的なあれこれを書きます。

Google Cloud Speech APIを使ったHoloLensアプリ(Unity2017対応など)

先週のできごと

先日、Google Cloud Speech APIを使ったアプリを制作し、リクルートATL様に寄稿させていただきました。

f:id:m2wasabi:20170718072611j:image
HoloLensで言霊を撃ってみよう | ATL SHOWCASE

それにまつわる内容で、 Tokyo HoloLens ミートアップ vol.4でLTの機会を頂きました。

www.slideshare.net

HoloLensでの音声認識は手垢の付いたネタにも関わらず良い反響を頂きました。ありがとうございます。

Unity・アセットをアップデート

アプリ自体の紹介は上記リンクにお任せするとして、 寄稿・紹介後に、Unity2017への対応・Google Cloud Speech RecognitionのV3.0へのアップグレードを行ったので、 それについて書きます。

アプリのソースコードは公開しています。

github.com

Unity2017への更新

元々Unity5.6.1 で作成したアプリですが、寄稿が終わったのでUnity 2017.1.0f3 に更新しました。 本アプリ自体、特に難しいことはしてませんので、各アセットのバージョンアップ対応が主になります。

HoloToolkit for Unity

Unity2017対応は、アーカイブはまだですがmasterブランチでは行われています。 /Assets/HoloToolkit/ディレクトリをプロジェクトから削除し、 ダウンロードしたコードから /Assets/HoloToolkit/ をコピーすることで無事動作しました。 プロジェクト内のprefabやオブジェクトは適宜置き換えましょう。

github.com

Google Cloud Speech Recognition

Google Cloud Speech Recognition

Unity2017リリースの少し前に バージョン3.0に更新されました。

1. ThreadManager.csの更新

バージョン2.3まではUWPアプリケーションでも問題なく動作していたのですが、 3.0はUWPでビルドしようとするとエラーで蹴られます。(Unity Editorでは動く) f:id:m2wasabi:20170718085727j:plain

そこで、以下のファイルを書き換えます。 \Assets\FrostweepGames\GCSpeechRecognition\Scripts\Core\Managers\ThreadManager.cs

gist.github.com

2. 名前空間の変更

また、名前空間やクラス構成がごっそりと変わっているので、対応します。

using FrostweepGames.SpeechRecognition.Utilites;
using FrostweepGames.SpeechRecognition.Google.Cloud;

using FrostweepGames.Plugins.GoogleCloud.SpeechRecognition;
3. メソッドの置き換え

使い方もがらっと変わっているので、これも更新します。

3.1. クラスの変更
private ILowLevelSpeechRecognition _speechRecognition;

private GCSpeechRecognition _speechRecognition;
3.2. 初期化処理

初期化処理も大きく変更が必要です。

_speechRecognition = SpeechRecognitionModule.Instance;
_speechRecognition.SpeechRecognizedSuccessEvent += SpeechRecognizedSuccessEventHandler;
_speechRecognition.SpeechRecognizedFailedEvent += SpeechRecognizedFailedEventHandler;

_speechRecognition = GCSpeechRecognition.Instance;
_speechRecognition.SetLanguage(Enumerators.LanguageCode.JA);
_speechRecognition.RecognitionSuccessEvent += SpeechRecognizedSuccessEventHandler;
_speechRecognition.RecognitionFailedEvent += SpeechRecognizedFailedEventHandler;
3.3. イベントハンドラ

イベントハンドラも引数が増えたので対応します。

失敗時

private void SpeechRecognizedFailedEventHandler(string obj)

private void SpeechRecognizedFailedEventHandler(string obj, long l)

成功時

private void SpeechRecognizedSuccessEventHandler(RecognitionResponse obj)

private void SpeechRecognizedSuccessEventHandler(RecognitionResponse obj, long l)
3.4. Start/Stop

録音開始メソッドは、音声の個人認識をするオプションがつきました。

開始

_speechRecognition.StartRecord();

bool VoiceDetection = false;
_speechRecognition.StartRecord(VoiceDetection);

終了

_speechRecognition.StopRuntimeRecord();

_speechRecognition.StopRecord();
変更のサンプル

https://github.com/m2wasabi/SpeechGoUnity/commit/6d1824a659f05baa8d7e136f65419b9fc096f7d5

以上の変更で無事動くようになります。

おわりに

今回、Unity2017への更新で、C#6対応などビルド環境が一変したので心配しましたが、 思ったより不具合もなく移行できました。

アップデート対応は手間だけどやっておいて損はありません。

AndroidStudio3.0 Canary2 でKotlinをbuildしようとするとこける問題

f:id:m2wasabi:20170601195852j:plainAndroidStudio3.0からKotlinが正式サポートされました。 6月1日現在プレビュー版で以下からダウンロード可能です。 https://developer.android.com/studio/preview/index.html?hl=ja

AndroidStudio2.x空の変更点は、 プロジェクト開始時にJavaから変換を介せずに最初からKotlinでプロジェクトを開始できます。 f:id:m2wasabi:20170601194129j:plain

何も考えずにビルドすると、

Unable to find method ‘com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava/util/List;’

のようなエラーが出てしまいます。 f:id:m2wasabi:20170601194453j:plain

Kotlinのバージョンが合ってないので、

build.gradleの内容を以下のように書き換えます。

ext.kotlin_version = '1.1.2-3'
ext.kotlin_version = '1.1.2-4'

そんなわけでLet’s enjoy Kotlin!

参考

stackoverflow.com

Android Studioの更新でSDK Managerが起動しなくなったら

Android StudioXamarinUnity で共通のAndroid SDKを使っている場合、 SDK ManagerAVD Managerを単体で起動するケースがよくあります。

自分の場合、Android Studioのバージョンを更新したときに、同時にAndroid SDKのバージョンも更新して、AVD Managerが起動しなくなってしまいました。

尚、ggってよくお勧めされる、JavaのPathとバージョンが合ってないのでfind_java.batに固定値ぶち込むみたいな腑抜けた対応は近年は不要です。

自分の場合

結論として、SDK toolsが壊れていた(or バージョンが遅れていた?)ので、コマンドラインツールをダウンロードし、Android SDKtoolsフォルダを置き換えてやることで動作しました。

https://developer.android.com/studio/index.html?hl=ja

f:id:m2wasabi:20170429015117j:plain

f:id:m2wasabi:20170429015806j:plain

一般的対処How to

  1. JDKのバージョンを最新に更新する(ちょっと古いと動かないというのはよくある)
  2. コマンドで java -versionを実行し、インストールしたjavaと同じか確認する
  3. SDK toolsAndroid SDK以下のtoolsディレクトリに展開する

RPGツクールMVの Milkcocoaプラグインを更新しました

RPGツクールMVのプラグイン更新しました。

フラグ関係のみ、データ保存の永続化に対応しました。

github.com

使い方は、GitHub参照のこと。 https://github.com/m2wasabi/milkcocoa-rpgmv-plugin#43-永続スイッチ変数の操作new

デバッグ足りなそうなので不具合あったら教えてください。

Xamarin入門者の集い #2でLT発表しました

4月17日に行われた『初心者歓迎XamarinのLT会!Xamarin入門者の集い #2』で、 初心者LT枠として発表してきました。

jxug.connpass.com

タイトルは 『Xamarin.Formsのための基礎体力づくり(圧縮版)』です。 丁寧に説明していると到底5分で収まりきらない内容ですが、 読み物としてお楽しみください。

懇親会の時に聞かれた内容

Q. 勉強の期間はどのぐらいか
A. 勉強のみしていた期間は約1か月。あとは作りながら覚えた。まだ完璧ではない。
Q. プロジェクトを受注する前から勉強したのか、受注してから勉強したのか
A. C#基礎は受注前から勉強していた。でも具体的な使い方を学んだのは受注が決まってから
Q. Xamarinの案件なんて見つからない
A. ふわっとしたモバイルアプリの案件をXamarinでやるんだよ。自分色に染めろ!

これで、仕事や趣味でXamarin(.Forms)を使ってアプリを出す人が増えれば幸いです。

Xamarin.Forms の ListView内で可変数個の画像オブジェクトを表示する

はじめに

TwitterなどのSNSのタイムラインをXamarin.Formsを使って表示したいとき、
ListViewの中で可変数個の画像ファイルを表示する必要があります。
方法は色々ありそうですが、
今回は画像表示用のカスタムビューを定義することによりシンプルに実装しました。

本記事の価値はCustomViewのソースに集約されているので、
「説明不要、ソースくれ!」という方は以下のリンクからお持ち帰りください。

ImageListView for Xamarin.Forms · GitHub

目次

  • はじめに
  • 目次
  • 実装
    • モデルの定義
  • カスタムビューの実装
  • ビューの実装
    • ビューモデルの実装
    • 完成図(API周りの実装は省略するけど)
  • まとめ
  • 参考記事
続きを読む

EditorConfigに対応したVisualStudio2017でコーディングルールを共有する

VisualStudio2017で新たに、EditorConfigファイルへ対応したらしいので、さっそく試してみました。

使い方は、ソリューションのルートディレクトリに .editorconfig ファイルを置くだけです。

.editorconfigファイルの記法の詳細は、EditorConfigのWebサイトにて確認できます。

http://editorconfig.org/

また、このファイルをGitで共有すると、他の人がソースを編集する場合にも、特に意識せずに、 改行、タブ、インデント等のコーディング規約を共有できます。

VisualStudioでプロジェクト単位の改行コードの制御ができるようになったのが大きな進歩です!

私がXamarin.Formsのプロジェクトで使っている設定はシンプルですが以下のようなものです。

[*]
end_of_line = lf
insert_final_newline = true

[*.xaml]
indent_style = space
indent_size = 2

健全な理性を持つエンジニア諸氏は、これからはインデントガーって騒ぐ前にInitialCommitに .editorconfig仕込むようにしましょう。

ネタ元

昨日Visual Studio 2017 リリース記念勉強会に行ってきました。 csugjp.connpass.com

その中で、かずきさん id:okazuki のセッションにて、VisualStudio2017の新機能についてピックアップで紹介されました。

blog.okazuki.jp