てんちょーの技術日誌

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

【UE4】UnityChanLIVE-UE4Ver-を作ってみた & 公開してみた

はじめに

github.com

前々からどこまでいけるか作ってみたかったので、作りました。

面倒事が多かったのでしんどかったですが、とりあえず形になりました。

動画

youtu.be

githubにあげてみましたので、参考にどうぞ

f:id:shop_0761:20170409004354p:plain


2017/05/07 追記

Androidに移植してみました

プロジェクト

github.com

とりあえず実行したい方は、現段階での.apkがあるのでそれも配布してます

AndroidSDKがあれば、端末をPCに繋ぎzip展開後にInstallからはじまる .bat を実行すれば入る…はず

なければ .apkが同梱されてるのでそちらを直接入れるのがいいかと


問題点

  • Sound Visualization Plugin の使い方がいまいち分からないため、音量に応じて変わるやつは全てCSV書き出し&floatCurve
  • 髪がいい感じに揺れない

Unity側で髪の揺れまでAnimに焼き付けたもの(300MBくらい)はあるのですが、FBXにできないため詰んでる

Mayaに持っていくフリーのアセットを見つけてやってみたものの、Rotation周りで死亡しました。Exportしっぱい。


2017/05/07追記

  • メモリ周りがアレなので、一周すると安定するはず…(一周目は最初の2回ほどフックします…

こだわりポイント

最適化するにあたってこだわったところを忘れないうちに書いておきます

  • UnityChan Shader は手を入れない (ほぼそのまま使う
  • UE4内で完結させる (Mayaとかでモデルをいじったりしない
  • Particleはゼロにしない
  • backScreenを一枚絵でごまかさない

まとめ

時間を見つけて、大変だったとことかを書いていこうかなと思います。 なにかあれば、@shop_0761までご連絡くださいまし。


2017/05/07追記

Android版はmasterとbranchを分けてあるので、Androidへの最適化の練習になればと思います


新しいVR内入力方法を考えてみたお話

はじめに

つい最近まで、音声認識オンリーで生活していました。

その時に思いついた新しい入力方法についてそれとなくまとめておきます。

参考はこちら

shop-0761.hatenablog.com

簡単な解説

キーボードという概念にとらわれすぎないようにと、ふと浮かんだ手法です。名前はまだありません。

勝手に意味分からない名前をつけたり、Assetの名前はありますが

使い方

50音表的なやつから、文字を掴んで空中に配置します。

それをOculusTouchのThumbStickに触りながらポイントしていくと青色になり、離すと辿った文字が入力されます。

これだけ。

この入力方法のポイント

ツイートにまとめても良かったんですが、流れちゃうので忘れないようにまとめておこうかなと。

今回のポイントは 自分でキーボード的なものを作れる ところにあります。

これだと従来のキー配列にとらわれることなく自分で生成できます。生成と言っても、大層なものではなく、キー配列を覚える/覚え直す 必要がなくラクです。

ついでに簡単なセーブ/ロード機能を付けてあります。 空間にそのまま文字を保存できるので複数個用意できれば、Twitter用によく使う3パターンを作るなんてこともできるかと。

文字をなぞる順番もなく右から左になぞっても入力できるので、ユーザーのTwitterの直近20000ポストくらいから 本人がよく使うこの入力方法用の文字列を生成する なんて研究もできそうですね。

オススメの文字配列をTwitterで共有したりもできそうです。

深く考えてなかったのですが、ViveやLeapMotionにも対応できる気がするのでコントローラー依存ではない入力方法だと思ってます。

まとめ

とりあえず整理したあとにOculusHomeのPreviewAppに更新をかけてみて、もろもろの反応を見た後にこれを作り続けるか決めようかと思います。

実際手でポイントするのは微妙な気がするので何か考えたいところですが。

興味がある方は@shop_0761等にご連絡いただければPreviewAppのテスターに招待しますー (ReviveでViveでもできるかも

VRキーボードのためにキーボードを封印したお話

はじめに

ちょっと前にGOROmanさんがこんなことを言っていました。

じゃあ実際にやってみよう!!ってことでやりました。 

マウスを封印するお話はいくつか聞いたことがありますが、キーボードを封印するお話は聞いたことがなかったので面白いかなと。

VRキーボードを除いたのはTwitterができない可能性があったので一応保険的な意味です。(結局使わなかった

条件

キーボードと名のつくものを封印します。

例として

  • PC向けの普通のキーボード
  • スマホで使えるキーボード類
  • ATM等の数字を入力する系のキーボード

などを封印しました。基準としては、数字や文字を選択してからEnterで確定するものをキーボードと定義しました。

事前準備

使ってるマイクはこれ

http://www.yodobashi.com/ec/product/100000001001262667/index.html

ATM

Cortana

ピクチャパスワード

kiritsume.com

windows音声認識

特に書いてませんが、Siriのセットアップもしました。

だが

音声認識ツールの使い心地

Cortana

対話式なので、一気にしゃべらないといけない点を除いて多分1番精度がいい。

だができることが少ない。もったいない。後述のwindows音声認識の機能を全てCortanaで出来るようにすればもっといい。

認識精度が良すぎなので、これを作った。なお全て音声認識で記事を書いてます。

スクリプトはさすがにコピペ祭りですが。

shop-0761.hatenablog.com

windows音声認識

windowsの操作が色々できるので便利っちゃ便利。 CortanaだとEnterができないので、その度にこいつでEnterを入力していました。

一応ここまで出来る。

未来感ありますね!!  ただ非常に面倒。(何回も撮り直しをしている

コマンド一覧はこちらに。

https://support.microsoft.com/ja-jp/help/12427/windows-speech-recognition-commands

多分こいつは教育できるので精度は上がる…はずなんですが、

と、ほぼ部屋に一人の状態かつ、BGMもかけられない感じでアレです はい。

Siri

Siri自体も簡単なセットアップがあるのですが、なぜかHeySiriで起動しない…

それもあってあまり使っていない…

けど、副産物的に利用できるようになる音声入力がありました。

weekly.ascii.jp

こいつが意外と使えます。対話式ではないので、多少考えながら発話できます。

ただ、途中で変換予測が変わったりして荒ぶったりすることもありますが。

iPhoneにもAndroidのパターンロックが使えるようになって欲しい…(指紋認証できるけど、ミスると結局キー入力なのでロックを切ってた

使ってみた感想

いいところ

意外と生活できるし、メールも返信できました。

ただ時々思ったように変換してくれなくて、不必要な部分をカットしたり、ペーストしてツギハギしたりしてました。

主婦さん(@Somelu01)さんとも普通にDMしたりできました。

そして、手が疲れない!!大事!!

悪いところ

誤認識時の修正が面倒。 固有名詞が認識できない。(これは辞書がないのでしゃーないけど

打ちたい内容がダダ漏れ。 居間とかでTwitterが出来ないし、話しかけたと思われてしまう。

コードが書けない。

不思議なお話

これ、結構不思議な話で、ある程度意識的に口を閉ざしている場面が幾つかあり、なぜか無口になる時がありました。

多分なんですが、音声認識される環境に居続けると余計な発言までも認識されてしまうと思ってしまい不必要な発言を避けてしまうのかも。

これはこれで卒論が書けてしまいそうですね…

まとめ

音声認識 割りといける。Juliusも使ったことがありますが、未調整のと比べるとかなり精度がよくなってきています。

一度Cortanaを封印しないで使ってみては?

コルタナの音声認識の結果をクリップボードに貼り付けるスクリプトを書いてみた

はじめに

キーボードを封印して音声認識だけで生きています

この記事も音声認識だけで書いています

コルタナの音声認識の結果がかなり良いのでそれを利用したいと思いパワーシェルのスクリプトを書いてみました( なおキーボード封印中

今回書いたもの

スクリプト更新しました( 2017年1月4日 簡単なDebug出来るようにしました

追記 2017/01/04

以下のスクリプトをパワーシェルに貼り付ける分には動くっぽいのですが、.ps1にするとアウトっぽいので取り急ぎdropboxのリンクを貼っておきます

時間がある時に修正します…

www.dropbox.com

while(1)
{
  $psArray=[System.Diagnostics.Process]::GetProcesses()
  $str=""
  foreach ($ps in $psArray){
    if($ps.MainWindowTitle -like "*Microsoft Edge"){
      #[System.Console]::WriteLine("Microsoft Edgeを発見 Handle: " + $ps.Handles + " MainWindowTitle: " + $ps.MainWindowTitle)
      Add-Type -AssemblyName system.Windows.Forms
      $cp=[Windows.Forms.Clipboard]
      $ps.MainWindowTitle.foreach{
        if($_ -match "(.*)\s[-]\sBing"){
          #[System.Console]::WriteLine("Bing検索してるMicrosoft Edgeを発見")
          $str=$matches[1]
          if($str -match "コピー終了"){
            [System.Console]::WriteLine("終了します")
            $ps.CloseMainWindow()
            $ps.Close()
            exit
          }
          $cp::SetText($str)
          [System.Console]::WriteLine("$str")
          $ps.CloseMainWindow()
          $ps.WaitForExit(3000)
          $ps.Close()
          break
        }
      }
    }
  }
}

これをパワーシェルのスクリプトで起動します

コルタナは反応に困ったらマイクロソフトエッジのbing検索を使うので、

マイクロソフトエッジのプロセスを監視してそのメインウィンドウのタイトルから正規表現で認識結果を切り取ります

追記ここから

スクリプトを更新しました

これでコピー終了というとスクリプトを停止できます

ダブルクリックで実行できるファイルを作る

このスクリプトをメモ帳などに貼り付けて、.ps1形式で保存した後に、ショートカットを作成します

そのショートカットのプロパティからリンク先の先頭に以下のように追加します

powershell -NoProfile -ExecutionPolicy Unrestricted "ファイル名"

これで適用するとpowershellの部分が勝手にpowershellがある場所のパスに変わりますがおっけーです

実質、powershell~Unrestricted までコピーして、ファイル名の前に貼っ付ければ終わりです

そうするとダブルクリックで起動できます

後はpowerShellが起動するので、コルタナに話しかけてbing検索する際にMicrosoft Edgeが一瞬起動しますが、 勝手に閉じて、クリップボードにその結果が貼り付けられてます。

ログが一応powerShellの方に表示されます。

追記ここまで

まとめ

パワーシェルのスクリプト初めて書きました

人に読ませる文書にするにはちょっと大変だけど音声認識でとりあえずここまできました

これでとりあえず快適にツイッターができます

【UE4】OculusTouchでHapticEffectが使えないとき

PlayHapticEffectが動かない

Touchのコントローラの振動にはPlayHapticEffectを使えとあります。

developer3.oculus.com

要約すると、ここからHaptic用アセットを作って適用できるよと。

f:id:shop_0761:20161023023737p:plain

  • Haptic feedback Effect Buffer 数値指定
  • Haptic feedback Effect Curve カーブで指定
  • Haptic feedback Effect Sound Wave 音声ファイルから生成

と3つあります。

今回は適当にカーブを作りました。

f:id:shop_0761:20161023023959p:plain

でHapticEffectに入れて終わり。あとは好きなところで。

f:id:shop_0761:20161023024214p:plain

これで使えるようになります。

しかし、手を抜きたいあまり、Riftのセンサーを片手で塞ぎながら空いてる手でデバッグすると反応しませんでした。

どうやらTouchを持った時に生じる揺れ(人の手は完全に静止しないので)をTriggerにしてるようです(勘)。

なので両方持つか、ちゃんと被るか、足にでもつけるかしないと振動しません。

【UE4】簡単な音声認識をしてみた

はじめに

Unreal Engine 4 (UE4) Advent Calendar 2016 10日目です。

qiita.com

本記事の主役とも言えるほげたつさんのアセットのレビューがされている こちらの記事も合わせてお読みください(何ももらってませんよ)

pafuhana1213.hatenablog.com

今回はちょーお手軽に音声認識をしてみようと思います。

というのもmikulusを見てるとUnityは標準で音声認識が出来たり、プラグインを探すと大体英語対応のものばかりで辛い目に遭いました。

なので作りました。

現在作成中のVR内で使えるキーボードに音声認識で入力アシストするのに使っています。

イメージ

こちらテスターを募集しているのでOculusTouchがある方はぜひお願いします。@shop_0761にご連絡ください。(圧倒的テスター不足)

方針

色々遠回りしたお話は、あとに書くとして端的に実装方針を説明します。

http通信を用いて実装します。

しかもこれ、ほげたつさんがすでにプラグインを作成して公開しています!!

hogetatu.hatenablog.com

つよい。

ちなみに

らしいので先日のこちらの記事を参照してゆくゆくは移行しましょう。

hogetatu.hatenablog.com

http通信については適当にググるか、頭を空っぽにしてそういうものがあるんだなくらいでも動きます。

で、音声認識側のツールはC#で適当に作れます。

参考サイトを貼っておくので自作しても構いません。先人は偉大!

参考:

neareal.com

www.misuzilla.org

面倒な方は僕がすでに作成したものでも使ってください。実行するだけです。おわり。

www.dropbox.com

ダウンロードするだけで環境が整ってしまいました。

音声認識の精度について

精度的なお話だと、

コマンドプロンプトで UWP の音声認識APIを利用するサンプル。NuGet で UWPDesktop を追加してください。https://blogs.msdn.microsoft.com/lucian/2015/10/23/how-to-call-uwp-apis-from-a-desktop-vbc-app/ · GitHub

こちらのほうがいいかもしれません。ただなぜか手元の環境だと、

await contSpeechRecognizer.ContinuousRecognitionSession.StartAsync();

のところで The speech privacy policy was not accepted prior to attempting a speech recognition. と言われてしまい実行できず…

音声認識のプライバシーポリシーってどこで設定するんだ…となってしまったので詳しい方がいればぜひお教えいただけると嬉しいです。

このように認識は外部のツール依存なので、自作してチューニングすればよりよいものになるかと思います。

実装する

と言っても、大したことはしません。

先程のほげたつさんのプラグインにはサンプルプロジェクトWebApiDemoがあるので、それを起動します。

その中にあるWebApiDemo/WebApi/Api 内にあるBP_DemoApiBaseを開きましょう。

f:id:shop_0761:20161202234346p:plain

そして、継承元の変数を表示するために赤線のところにチェックを入れます。

すると

f:id:shop_0761:20161202234427p:plain

Domain変数が見えます。

今回はアプリのポートの都合上ここを http://127.0.0.1:50001/ に書き換えます。

f:id:shop_0761:20161202234559p:plain

あとは、さっきの音声認識のツールを実行後にUE4側で実行しましょう。

SimpleGetを押せば終了!!

f:id:shop_0761:20161202235109p:plain

音声認識の結果が得られます。

ちなみにこのStringはBP_01_SimpleGet内のResponsebodyに入ってるので後はご自由に。

f:id:shop_0761:20161202235534p:plain

VRKeyboardの方ではTickで適当にポーリングするBPComponentにしてます。

応用例

普通に音声認識してそのまま使ってもいいのですが、ちょっとあちこち手を加えてこんなことをしてみました。

音声認識した結果を使ってLipSync的なことをしています。これをLipSyncさせても面白いかもですね。

色々できるので遊んでみてください。

辛い目にあったお話

これ以降は今回の記事に至るまでに迷子になった余談なので、気が向いたら読んで下さい。

きっかけはこの辺

こんなのあるんだ と思って調べてみたら Pocketsphinxってのがベースらしく

と、以外にも日本語の音声認識プラグインが無いことを知りました。

しばらく経って、先程のwin10で動く音声認識のサンプルがあるのを知ったので、これUDP通信で実装するできそうと思ってました。

よく聞くJuliusとかでプラグインでも作ったほうがよさそうかなと思いましたが、あれはデフォのままだとかなりアレな感じなのでガツガツやるにはいいのかもしれません…(DNNベースでもHMMベースでもできます)

じゃあさっそくH社のUDPのサンプルを読みつつ進めていくと、デシリアライズの方法で引っかかりました。

UDP Socket Sender Receiver From One UE4 Instance To Another - Epic Wiki

こことか見てたんですが、日本語stringの場合文字コード周りで死にたくなりましたね…。C++から文字コードを日本語にする方法が見当たらなかったので、 お友達に聞くとpythonをかますか、http通信にしたほうがいいよと言われたので、今回の方法に落ち着きました。

UnrealC++を読む機会が出来たので、副産物的に前よりは抵抗感がなくなりまし た。

まとめ

そろそろデフォで音声認識ができてもいいんじゃないかなとは思います。

ただVR_keyboardで日本語の変換周りを扱っていると日本語難しいなと思ったので、当分ないだろうなと思ってしまいました。

明日はprince_ue4さんの「エフェクトネタやります」です。

【UE4】水彩風マテリアルを作ってみた

はじめに

Unreal Engine 4 (UE4) Advent Calendar 2016 8日目です。

qiita.com

我らがおぎまふさんやcom04さんなど、いろいろな方がトゥーン表現に挑戦されています。

最近ではMarketPlaceでもトゥーンなアセットが出てきたりしています。

いろいろ参考サイトをまとめていたのですが、com04さんの記事を見たほうが早いですね…

qiita.com

ですがやっぱり自分好みのものを作りたい…と思って探していたら参考になりそうなところを見つけました。

d.hatena.ne.jp

こちらのサイトではsoftImageですが、なんとかそれっぽくなりました。

マテリアルダメダメなので、練習ついでに作ってみました。

できたもの

つくりかた

ここから先は、先程の参考サイトを見た前提でお話を進めていきますね。(さらっとでおkです)

考え方、手順は参考サイトと同じなので それをどうやって再現したか という感じで進めます。

とりあえず今回は

  • BaseColor
  • Specular
  • Shadow

に当たる部分のマスクを愚直に作って色指定、その境目にNoiseを入れてなじませていきます。コンパイルが重いかも。

ついでに、各色をテクスチャではなく直で色指定しています。モデルによっては細かくマテリアルが分けてる 方が相性がいいです。処理負荷は気にしないことにします。

BaseColorのマスクを作る

f:id:shop_0761:20161202014231p:plain

BaseTextureを指定できますが、結局Desaturationしてしまうのでそのままでもいいかも。

Blurをかけます。

Blurノード

float4 output = 0;
float weightSum = 0;
float currentWeight = 1.0;

for (int i = 0; i < 10; ++i) {
    output += Texture2DSample(Material.Texture2D_0, Material.Texture2D_0Sampler, texCoord + i * stride) * currentWeight;
    weightSum += currentWeight;
}

output /= weightSum;

return output;

参考:

qiita.com

そして、ちょっとNoiseをのせたり。 もちろん、すでにあるNoiseノードでもいいかと思いますが今回はstylized RenderingのT_TexturedPaperを使用しています。

Specularのマスクを作る

f:id:shop_0761:20161202014328p:plain

こちらはおぎまふさんを見習ってLightVectorを擬似的に用意して、Specularの計算をします。

f:id:shop_0761:20161202014445p:plain

こうして出来た2つをDesaturationしてそれぞれマスクとしました。

ここまででとりあえず2色分塗ることが出来ました。

ShadowとEdgeのマスクを作る

f:id:shop_0761:20161202014544p:plain

f:id:shop_0761:20161202014646p:plain

ここで影色も塗らなきゃなりませんが、このままでは塗れないのでゴリ押しで解決します。

影色になる部分を一旦求めて、今の絵に黒で塗り直します。(いい方法が知りたい)

こうすると後からaddして色を乗せられます。

f:id:shop_0761:20161202014834p:plain

こちらはおぎまふさんのRimLightの実装をそのまま使ってますので関数の中身は割愛します。

水彩の参考サイトの完成絵を見るとエッジが2段あるように見える(実際は歪めたり、ノイズかけたり)のでRimLight_Rangeにちょっとaddして作ります。

NoiseありとなしのEdgeがあったほうがよかったので、分けて作ってます。

f:id:shop_0761:20161202015259p:plain

f:id:shop_0761:20161202015632p:plain

ついでにさっきのshadowマスクを使って、明るい方のEdgeと暗い方のEdgeを作り分けてます。

ここで影色も作ってます。

まとめる

f:id:shop_0761:20161202015742p:plain

最後にshadow側とBaseColor側をaddして完成です。 お好みでNormalMapも使えるようにswitchをつけたりしました。

こうすることでGraymanの胸のUnrealロゴが出せます。

余談

最初はこのマテリアルをPostProcessで実装していたのですが、マスクできるようになったけど色指定できない…ってなったのでやめました。

その時、最初に作っていた影色を少し淡くするPostProcessが出来たのでついでに載せておきます。

alweiさんのお手軽Toonのマテリアルにちょっと足すだけです。

全体

f:id:shop_0761:20161202021012p:plain

追加した部分

f:id:shop_0761:20161202021032p:plain

CustomDepthでマスクを作った結果を使ってなんかごにょごにょしました。

でこの結果を最後にaddして出力してます。

余談2

blurのコードを書いてるときに思いついたのですが、blurベースでedgeが取れそうだったのでやってみました。

f:id:shop_0761:20161207225818p:plain

このぐらいいけます。

ノードはこれだけ 面倒なSobelフィルタを作らなくても使えるかも。

f:id:shop_0761:20161207225837p:plain

Blurのコード

float3 output = 0;
float ScreenMult_X = GetPostProcessInputSize(0).zw.x;
float ScreenMult_Y = GetPostProcessInputSize(0).zw.y;

output += 1.0 * SceneTextureLookup(TexCoord + float2(ScreenMult_X * BlurAmount * -1.0, 0.0), SceneTextureID, true);
output += 1.0 * SceneTextureLookup(TexCoord + float2(ScreenMult_X * BlurAmount * 1.0, 0.0), SceneTextureID, true);

output += 1.0 * SceneTextureLookup(TexCoord + float2(ScreenMult_X * BlurAmount, 0.0), SceneTextureID, true);
output += 1.0 * SceneTextureLookup(TexCoord + float2(0.0, ScreenMult_Y * BlurAmount), SceneTextureID, true);

output += 1.0 * SceneTextureLookup(TexCoord + float2(0.0, ScreenMult_Y * BlurAmount * -1.0), SceneTextureID, true);
output += 1.0 * SceneTextureLookup(TexCoord + float2(0.0, ScreenMult_Y * BlurAmount * 1.0), SceneTextureID, true);

output /= 6.0;

return output;

SceneTextureIDを引数にすることで、任意のSceneTextureを指定できます。 outputは加算した分だけ割ります。

f:id:shop_0761:20161207230113p:plain

多分この順番通りでIDが振られてると思います 分からなかったらコードを読めばいいんだよ うん。

まとめ

なんとなくMaterialの演算が分かった気がします。もろもろの計算は試行錯誤の結果なので、「なんでこうなるの?」というより「色々やったらこれがよかった」って感じです。

作りたい絵を目指して、実際に手を動かしてみるとこの意味がわかるかと思います。すごい人になれば頭のなかで完成形をイメージしながらノードを組めるかと思いますが()

まずは作りたい絵を探しましょう!!

わからないこととかあれば、可能な限りお答えするのでTwitter(@shop_0761)等でご連絡ください。

明日は Epic社のおかずさん(@pafuhana1213)の「帰ってきたUE4のマーケットプレイスで購入したアセットを片っ端からレビューするマン」です。

鹿のレビューが懐かしい…