Watson Unity TextToSpeech

標準

元記事>「Watson×Unity!初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ!」

https://www.ibm.com/developerworks/jp/cloud/library/unity/

に対し、Unity-SDKのバージョンが変わったため、SampleTextToSpeech.csの書き換えが必要になった。

(SpeechToTextに関しては、前記事参照)

こんな感じでどうでしょう?

※サービス資格情報は、Unityのほうのインスペクターで入力します

//SampleTextToSpeech.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using IBM.Watson.DeveloperCloud.Services.TextToSpeech.v1;
using IBM.Watson.DeveloperCloud.Connection;
using IBM.Watson.DeveloperCloud.Utilities;

public class SampleTextToSpeech : MonoBehaviour {

#region PLEASE SET THESE VARIABLES IN THE INSPECTOR
 [SerializeField]
 private string _username;
 [SerializeField]
 private string _password;
 [SerializeField]
 private string _url;
 #endregion

TextToSpeech m_textToSpeech;
 string m_TestString = "おはようございます。漢字も読めます。";

private bool m_synthesizeTested = false;
 private bool m_getVoicesTested = false;
 private bool m_getVoiceTested = false;


 // Use this for initialization

void Start()
 {
 // Create credential and instantiate service
 Credentials credentials = new Credentials(_username, _password, _url);

m_textToSpeech = new TextToSpeech(credentials);
 Runnable.Run(Examples());
 }

private IEnumerator Examples()
 {

// Synthesize
 Debug.Log("Attempting synthesize.");
// m_textToSpeech.Voice = VoiceType.en_US_Allison;
 m_textToSpeech.Voice = VoiceType.ja_JP_Emi;

m_textToSpeech.ToSpeech(HandleToSpeechCallback, OnFail, m_TestString, true);
 while (!m_synthesizeTested)
 yield return null;

// Get Voices
 Debug.Log("Attempting to get voices.");
 m_textToSpeech.GetVoices(OnGetVoices, OnFail);
 while (!m_getVoicesTested)
 yield return null;

// Get Voice
 Debug.Log("Attempting to get voice {0}.");
 m_textToSpeech.GetVoice(OnGetVoice, OnFail, VoiceType.ja_JP_Emi);

while (!m_getVoiceTested)
 yield return null;
 
 }

void HandleToSpeechCallback(AudioClip clip, Dictionary<string, object> customData = null)
 {
 PlayClip(clip);
 }

private void PlayClip(AudioClip clip)
 {
 if (Application.isPlaying && clip != null)
 {
 GameObject audioObject = new GameObject("AudioObject");
 AudioSource source = audioObject.AddComponent<AudioSource>();
 source.spatialBlend = 0.0f;
 source.loop = false;
 source.clip = clip;
 source.Play();

GameObject.Destroy(audioObject, clip.length);
 }
 }

private void OnGetVoices(Voices voices, Dictionary<string, object> customData = null)
 {
 Debug.Log("Text to Speech - Get voices response: {0}");
 m_getVoicesTested = true;
 }

private void OnGetVoice(Voice voice, Dictionary<string, object> customData = null)
 {
 Debug.Log("Text to Speech - Get voice response: {0}");
 m_getVoiceTested = true;
 }

private void OnFail(RESTConnector.Error error, Dictionary<string, object> customData)
 {
 Debug.Log("Error received: {0}");
 }

// Update is called once per frame
 void Update () {

}

}
広告

Watson Unity -New Version

標準

元記事>「Watson×Unity!初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ!」

https://www.ibm.com/developerworks/jp/cloud/library/unity/

こちら、WatsonのUnitySDKに対し、Unity 上でWatsonのコンフィギュレーションエディターが出ないという仕様に変わってしまったことへの対処方法をあれこれ検索していましたら、先に解決してくれた方がいますので、リンクさせてもらいます

「developerWorks記事「Watson×Unity!初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ!」を試してみる」

https://qiita.com/yamachan360/items/911204e57957bd4bbef0

1.Unity-SDKのダウンロード

https://github.com/watson-developer-cloud/unity-sdk/releases/

↑のページからリリースされている、Unity-SDKの最新バージョンをダウンロードする(2018/4/21現在で v2.2.2)

sourceファイルをダウンロードし、展開して、フォルダ名をWatsonに変更しておく。

シーンに適当なオブジェクト(Unityちゃんなど)を表示し、オーディオソースコンポーネントを追加。

2.SampleSpeechToText.csの書き換え

上記 yamachan360様のページからSampleSpeechToText.csをコンポーネントとしてオブジェクトに追加。IBM Cloudのサービス資格情報を自分のものに入れ替えて、実行。

SampleSpeechToText.cs
//SampleSpeechToText.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using IBM.Watson.DeveloperCloud.Services.SpeechToText.v1;
using IBM.Watson.DeveloperCloud.Connection;
using IBM.Watson.DeveloperCloud.Utilities;

public class SampleSpeechToText : MonoBehaviour
{
    #region PLEASE SET THESE VARIABLES IN THE INSPECTOR
    [SerializeField]
    private string cre_id;
    [SerializeField]
    private string cre_pw;
    [SerializeField]
    private string cre_url;
    #endregion

    [SerializeField]
    private AudioClip m_AudioClip = new AudioClip();
    //private SpeechToText m_SpeechToText = new SpeechToText();
    private SpeechToText m_SpeechToText;

    // Use this for initialization
    IEnumerator Start()
    {
  //      string cre_id = "4934xxxx-xxxx-xxxx-xxxx-xxxxxxxxxx99";                  // 資格情報より
  //      string cre_pw = "MxxxxxxxxxxE";                                          // 資格情報より
  //      string cre_url = "https://stream.watsonplatform.net/speech-to-text/api"; // 資格情報より
        Credentials credentials = new Credentials(cre_id, cre_pw, cre_url);
        m_SpeechToText = new SpeechToText(credentials);
        m_SpeechToText.Keywords = new string[] { "ibm" };
        m_SpeechToText.KeywordsThreshold = 0.1f;

        // 音声をマイクから 3 秒間取得する
        Debug.Log("Start record"); //集音開始
        var audioSource = GetComponent<AudioSource>();
        audioSource.clip = Microphone.Start(null, true, 10, 44100);
        audioSource.loop = false;
        audioSource.spatialBlend = 0.0f;
        yield return new WaitForSeconds(3f);
        Microphone.End(null); //集音終了
        Debug.Log("Finish record");

        // ためしに録音内容を再生してみる
        audioSource.Play();

        // SpeechToText を日本語指定して、録音音声をテキストに変換
        m_SpeechToText.RecognizeModel = "ja-JP_BroadbandModel";
        //m_SpeechToText.Recognize(HandleOnRecognize, audioSource.clip);
        m_SpeechToText.Recognize(HandleOnRecognize, OnFail, audioSource.clip);
    }

    void HandleOnRecognize(SpeechRecognitionEvent result, Dictionary<string, object> customData)
    {
        if (result != null && result.results.Length > 0)
        {
            foreach (var res in result.results)
            {
                foreach (var alt in res.alternatives)
                {
                    string text = alt.transcript;
                    Debug.Log(string.Format("{0} ({1}, {2:0.00})\n", text, res.final ? "Final" : "Interim", alt.confidence));
                }
            }
        }
    }
    private void OnFail(RESTConnector.Error error, Dictionary<string, object> customData)
    {
        Debug.Log("SampleSpeechToText.OnFail() Error received: " + error.ToString());
    }

    // Update is called once per frame
    void Update()
    {

    }
}

オレンジ色のところは、本家GithubのExampleSpeechToText.cs の29行目~36行目の、

 #region PLEASE SET THESE VARIABLES IN THE INSPECTOR
 [SerializeField]
 private string _username;
 [SerializeField]
 private string _password;
 [SerializeField]
 private string _url;
 #endregion

これを使うと、インスペクターのほうで、サービス資格情報を入力することが出来る。

Low Poly モデルにペイントする方法学習中

標準

Tim Burton風キャラクタ作りを少し中断。

ローポリモデルにペイントでリアリティを追加する方法がYouTubeに出ていたので、それを練習

Mas Bacoさんという方、他にもローポリペイントの作業をいくつかアップしてくれている。

やってみました。モデルは、Paint3DについていたMan3D図形をFBXでBlenderに出して加工。

UV展開は、Blender勉強会で習ったものを参考に、プロジェクションビューから展開。

BPaintのアドオン利用。

MasBaco-rensyu.png

もっと暗く赤く塗っているみたいですね

↓チュートリアルと同じぐらいローポリヘッドに塗ってみたもの

face-paint2

前と横からの印象が違う

Tim Burton風キャラクター作成05

標準

【腕】

1)肘の部分からEで手首手のひらあたりまで伸ばしていく

2)親指にあたる面を2枚横に引き出す

3)親指の曲がる部分は線幅狭く、爪はこのキャラクターでは作りこまない

4)親指全体を少しひねって、向きを変え、

5)手のひらの部分を膨らますため、親指を縦方向に一本ループカットをいれる

6)親指以外の指は3本にして、1本作って、コピーで増やす

7)手の甲側で、指の付け根とその隣の2面をEで拡張、縮小して、こぶしの部分を作る

8)だいたいの形が出来たら、親指全体を下に移動して完成とする

tim05

Tim Burton風キャラクター作成04

標準

歯並びを確認するためにつけたシェイプキーは、ミラーモディファイアがついている間は適用できないので、シェイプキーを一度削除する。

【ボディ】

1)首の下の面を全部選んで下方にEで拡張。一番したの面は中央にするため、さらに下に伸ばしておく。

2)いくつか横にループカットし、ざっとボディの形を作る

3)男性のボディを女性のボディにも転用することを考えて、胸の4面を削除し、8×6の球を追加し、周辺とマージ(Alt-M)してつなげる。

4)男性用ボディにする場合は、胸のふくらみをスムーズなどでなだらかに仕上げる。

5)胸の脇から肩にかけての側面6面を選択し、やや右に拡張。

6)鎖骨ラインを作るために、肩からループカットを一本。

【足】

7)下部8面を選択し、脇に少し拡張。それから下に向けて拡張

8)膝の付近は近接二本でループカット

9)脚下部正面3面を前方に拡張。つま先部でもう一度拡張。

10)底は平らにして(S-Z-0)下に少し拡張

11)甲の部分2本ループカット。横にも一本ループカットし、形を整える

12)足首にもループカット。

13)上体を一時隠し(H)、足の形を整え、やや外側に開く。