hisaitamiのブログ

とあるプログラマーの日常

HoloLensアプリ開発(25日目)BlenderでPMXとVMDを読み込んでFBXに出力する

UnityとかUWPとか、HoloToolkitとかMRDesignLabとか、とにかく覚えることが沢山あるのですが、今日はBlenderにPMXとVMDを取り込んでFBXに出力する方法を見つけたので試してみました。

www.youtube.com

  • model: @aichan_nel
  • motion : @Somubu_Cho

やり方

次の記事を参考にさせていただきました。

以下、ハマりどころをピックアップ

PMXを読み込んだ直後の状態

灰色のモデルがポツンと表示された状態になる

f:id:hisaitami:20170718222238p:plain

  • テンキーの「1」を押してフロントビューに切り替える
  • テンキーの「5」を押して平行投影に切り替える
  • マウスホイールでモデルを拡大する
  • 「CTR+8」と「CTR+2」でモデルを画面中央に表示されるように調節する
  • MMD Toolsパネル > View > Shadelessボタンをクリックしてテクスチャーをレンダリングさせる

f:id:hisaitami:20170718224255p:plain

VMDを読み込む

f:id:hisaitami:20170718230712p:plain

  • 足の間にある三角錐みたいなオブジェクト(アーマチュア)を右クリックして選択状態にする
  • MMD Toolsパネル > Import > Motionボタンを押してVMDファイルをインポートする
  • もう一度アーマチュアを選択状態にする
  • キーボードで「M」を押して移動先のレイヤーをマウスで選択してアーマチュアを別レイヤーに移動する

f:id:hisaitami:20170718231215p:plain

これで、画面下部のPlay Animationボタンを押せばモーションが再生されるようになる。

FBXにエクスポートする

  • 「Shift+CTRL+↓」を押してモーションを先頭に戻しておく
  • File > Export > FBX

まとめ

  • Blendermmd_toolsアドオンを追加することでPMXとVMDを扱うことが可能になる
  • Blenderの操作はキーボード主体なのでやりながら覚える
  • VMDをインポートする前にアーマチュアを選択しておく必要がある
  • アーマチュアは別レイヤーに移動させることで非表示にできる
  • FBXにエクスポートする前に、モーションを先頭に戻しておくこと

HoloLensアプリ開発(24日目)SCI-FIなチャットを作る

HoloLensで動かすには課題が残ったままだけど、音声を文字列に変換する方法が分かってきたので、音声入力を自動翻訳してくれるチャットアプリを作ることにした。

進捗状況はこちらです。

www.youtube.com

アセットの用意

最初はフルスクラッチでやろうとしたけど、早々に行き詰ったのでアセットストアの力を頼ることにした。購入したのは次のアセット。

「UNET Multi-Channel Chat System」はUnity5のUNET APIを使ったマルチチャンネルのチャットシステムを実現するためのアセット。画面がシンプルで手を加えやすそうだし、値段も$1ドルだったので迷わず購入した。

「Customizable SciFi Holo Interface」はHoloLensにデプロイして実行すると例外が発生して落ちる。ただし、Holographic Remoting Playerを使えばHoloLensで動かすことも可能だった。デモシーンを動かすだけでも面白い。

画面のデザインは「Customizable SciFi Holo Interface」で解決だと思ったけど、「そのままだとつまらない」とか余計なことを考え始めてしまい時間を使ってしまった。最終的はUIは別の問題として触れないことに決めて、とにかくワチャワチャ賑やかにすればよしとした。

また、CanvasなどUnityの基本的なUIコンポーネントについて分かってなかったので、「UNET Multi-Channel Chat System」のUIとマージするのに苦労した。

なんとか2つのアセットを組み合わせることができたので、いよいよこれに音声入力と自動翻訳を組み合わせて行きたいと思いまーす。

まとめ

プロトタイピングなのでフルスクラッチのこだわりは捨てアセットストアを活用する方が時間を短縮できる。

ただし、購入したアセットがHoloLensで動くかは買って試さないと分からないし、アセットをカスタマイズする方法が分かるまでには結構時間が掛かった。

また、VR環境でのチャット機能を実装する方法については『UnityによるVRアプリケーション開発』に記載されていて参考になった。

HoloLensアプリ開発(23日目)Speech-to-Textアセットを試した

前回までに調べたこと

  • HoloToolkit-TestのTextSpeechManagerを使うとTTS(Text To Speech)とキーワードベースのSTT(Speech To Text)が実現できる

  • Intel RealSense SDK for WindowsでSTTが実現できるがHoloLens(UWP)にビルドできなかった。

  • クラウドベースのWatson Speech to Textがよさそう。連続してマイク入力を受け付ける方法が知りたい。

ということで、次の記事を参考にSpeech-to-Textというアセットを試してみた。

magicbullet.hatenablog.jp

やってみたこと

Speech-to-Textアセットをプロジェクトに追加するとC#スクリプトエラーが発生する。参考記事に書かれているようにWatson Developer Cloud Unity SDKをインストールする必要がある。今回は最新版の0.13.0をインストールした。最新のSDKではSpeechResultList→SpeechRecognitionEventを使うように仕様が変更されてるので次の記事を参考に修正する。

developer.ibm.com

Speech-to-Textは複数の音声認識エンジンに対応している。UnityEngine.Windows.Speech、Google Cloud Speech API、Watson、Wit.aiの4つが使える。アカウントを作るのが面倒くさいので今回はWindows.SpeechとWatsonだけを試すことにした。参考記事ではGoogleやWit.aiのサービスをアクティベートする方法が詳しく解説してあるので時間があれば後で試してみたい。

Speech-toTextアセットに含まれるspeechTextComparison.unityというシーンを開くと、複数のエンジンで同時に音声認識を試すことができる。使わないエンジンのモジュールは Hierarchy > Canvas > SpeechToTextServiceWidget の下から削除した後、SpeechToTextComparisonWidgetを選択し Inspector > Speech To Text Comparison Widget (Script) > Speech To Text Service Widget から参照を削除する。

マイクに向かって「What time is it?」と発音したところこんな感じになって笑ってしまった。

f:id:hisaitami:20170705085340p:plain

Game画面の右側に認識結果が表示されている。上からWindows.Speech、Watson(Streaming)、Watson(Non Streaming)となっている。Windows.Speechは入力言語が日本語になっているようで日本語で話しかけるといい感じに認識してくれた。

まとめ

Speech-to-Textのサンプルシーンを使って、連続してマイクから入力された音声をテキストに変換できることが確かめられた。

しかし残念ながらHoloLens(UWP)としてビルドすることができなかった。WatsonのUnity SDKに頼らず自力でなんとかする必要がありそう。

HoloLensアプリ開発(22日目)WatsonのText to Speechサービスを試す

音声をテキストに変換する方法の続き、

IBMのWatsonをUnityから使う方法を見つけたので試してみました。

noshipu.hateblo.jp

この記事に従って、IBM Bluemixにアカウントを作り、GitHubからUnity SDKをダウンロードします。SDKのバージョンは0.13.0に上がっていたのでそちらを使いました。「Speech to Textのコードを書く」を参考にC#スクリプトをコピペして動かそうとすると「SpeechResultListが見つからない」というエラーになります。

次の記事を参考にコードを修正しました。最新のSDKではSpeechResultList→SpeechRecognitionEventを使うように仕様が変更されたようです。

developer.ibm.com

これで、マイクで英語を話すとコンソールにテキストが出力されることを確認できました。

ただ日本語音声をテキストに変換する方法が分かってません。試しに「こんにちは」と入力すると「on each of our」と変換されました。

また、一回だけでなく連続してマイクから音声を拾ってテキストに変換したいところです。

そこで、Unity公式のSpeech-toTextアセットについて調べてみることに。。。

HoloLensアプリ開発(21日目)音声を文字列にしたいのですが...

昨日はHoloToolkit-TestのTextSpeechManagerに手を加えることで「What time is it?」というフレーズに反応して時刻を音声で返す方法が分かったけど、予めキーワードとして登録された言葉以外も認識させるにはどうすればいいのか調べているところ。

一旦、HoloLensにこだわらずWindowsとUnityで音声を文字列に変換する方法を調べることにした。以前にも試したことがあるけど次の記事がヒットしたのでおさらいしてみた。

qiita.com

Intel RealSense SDK for Windowsの最新バージョンはこの記事に書かれているものと同じだったので問題なく動かすことができた。マイクに向かって本を読み上げてみたところ思ったより正確に日本語の文字列に変換してくれることが確かめられた。

HoloLensで動くかなと、ちょっと期待してビルドしてみたけど「私がなんで怒っているか分かる?」と言われてしまい、やれやれ、どうやら別の方法を探さないといけないようだ。

HoloLensアプリ開発(20日目)TextToSpeechManager

テキストを音声に変換したり、音声をテキストに変換する方法を探していたら、HoloToolkit-Testsの中にTextToSpeechManagerというシーンが含まれていることに気がついた。

まず、テキストを音声に変換する方法は、TextToSpeechManagerクラスのSpeakText()メソッドに文字列を渡すだけのようだ。具体的にはTextToSpeechManagerTest.csの41行目からに書かれているとおり。

// If we have a text to speech manager on the target object, say something.
// This voice will appear to emanate from the object.
if (tts != null && !tts.IsSpeaking())
{
    // Get the name
    var voiceName = Enum.GetName(typeof(TextToSpeechVoice), tts.Voice);

    // Create message
    var msg = string.Format("This is the {0} voice. It should sound like it's coming from the object you clicked. Feel free to walk around and listen from different angles.", voiceName);

    // Speak message
    tts.SpeakText(msg);
}

また、このTextToSpeechManagerシーンでは「What time is it?」と話しかけると時刻を音声で読み上げてくれるとあったが、うまく反応してくれなかった。最初は発音が悪いのかなと何度も繰り返し挑戦してみたが心が折れそうになったので下のように調整した。

f:id:hisaitami:20170701100914p:plain

Hierarchyウィンドウから Managers > Speech を選択し、Inspectorの「Keyword Manager (Script)」のプロパティを変更する。Keywordに「What time is it」と入力して、ResponseにTextToSpeechManagerTest.SpeakTimeをセットした。

これで、テキストを音声に変換する方法と、登録したキーワードにアクションを紐付ける方法は分かったけど、音声をテキストに変換するのはどうやろうのだろう。

引き続き調べてみることにする。

HoloLensアプリ開発(19日目)シェーダー

Unity公式ドキュメントのSurfaceShaderサンプルは色々あって面白いです。

兵士の代わりにユニティちゃんをモデルにしていくつか試してみました。

docs.unity3d.com

UnityChan/Clothingシェーダー

まずユニティちゃん標準のシェーダーです。

f:id:hisaitami:20170425184831p:plain

Normal mappingシェーダー

Bumpmapテクスチャに布っぽいものを適用してみます。Tilingの値を変更すると目地の粗さが変わることを確認できます。

f:id:hisaitami:20170425185253p:plain

ちなみにテクスチャ画像はPixarのやつをお借りしました。

community.renderman.pixar.com

Detail Textureシェーダー

Detailのテクスチャにユニティちゃんアセットの床のやつをセットしてTilingの値を100、50、10に変えると下のように変化します。

f:id:hisaitami:20170425184157p:plain f:id:hisaitami:20170425184204p:plain f:id:hisaitami:20170425184200p:plain

Rim Lightingシェーダー

Rimの色や強さを変えることができます。

f:id:hisaitami:20170425190007p:plain

まとめ

  • Unity公式ドキュメントには面白いシェーダーがたくさん紹介されている
  • シェーダーによって見え方がどう変化するか調べてみた
  • コピペしてカスタムシェーダーを作る方法を覚えた
  • テクスチャ素材はPixar One Twenty Eightが便利

おわり

このコンテンツはユニティちゃんライセンスで公開しています。

f:id:hisaitami:20170421150454p:plain