Search Unity

  1. Good news ✨ We have more Unite Now videos available for you to watch on-demand! Come check them out and ask our experts any questions!
    Dismiss Notice
  2. Ever participated in one our Game Jams? Want pointers on your project? Our Evangelists will be available on Friday to give feedback. Come share your games with us!
    Dismiss Notice

RT-Voice - Run-time text-to-speech solution

Discussion in 'Assets and Asset Store' started by Stefan-Laubenberger, Jul 10, 2015.

  1. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    I just checked and our web demo works:
    https://www.crosstales.com/media/data/assets/rtvoice/webgl/

    Have you built our demo as WebGL? Because you have to have your own MaryTTS server or apply for an account on our test server (just send an email with the invoice).


    But anyway, RT-Voice has at least 4 built-in solutions:
    1. MaryTTS (default in the demo)
    2. WebGL Speech Synthesis
    3. Google Cloud TTS
    4. Klattersynth
    We provide integration for all the assets above, so our users can use RT-Voice as unified access point.
    You can also implement your own provider if you like; there are plenty of examples in the asset.

    I hope this helps you further.


    Cheers
    Stefan
     
  2. Pixel2015

    Pixel2015

    Joined:
    Mar 10, 2016
    Posts:
    20
    Hi just a question when I am using Audio Filters they should actually increase the length of the audio being played for example echo is the obvious but not the only one. The problem with that RTVoice seems to stop before it actually should, like the echo of the last spoken character is not there, or when you use distinct reverb filter it gets cut out to silence when it shoudln't etc.

    Is there something I am missing in the API that would address this, like requesting for the Audio Source to be longer?

    Thank you.
     
  3. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Can you please provide more details, like the Unity and RTVoice version?
    Which is the used voice?


    Cheers
    Stefan
     
  4. Pixel2015

    Pixel2015

    Joined:
    Mar 10, 2016
    Posts:
    20
    Unity Version 2019.2.10f1 and latest RT Voice PRO, I am using it in combination with Google TTS and their Wavenet voices. But I don't think the voice actually matters as to me it seems that the onSpeakcomplete will fire when the Audio Source finishes playing which doesn't take into account how the Audio Filters that are added on top of it are modulating it and extending its length outside of the scope of the source itself.

    The "simple" workaround for us at the moment is using <break> at the end of the SSML file to artificially add a pause for the reverb/echo effects to actually finish.
     
  5. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    RTVoice can't do much about it; it has to determine the end of the speech, which is technically exactly when the AudioClip is finished. It's outside of the scope what users may do with the audio (filters etc.).
    So, your solution with the <break>-tag is a good workaround.

    We will probably add a configurable parameter to delay the callbacks, but I'm not sure if it's a good idea.
     
  6. chgeorgiadis

    chgeorgiadis

    Joined:
    Jan 30, 2018
    Posts:
    21
    Hi! I want to make an android app. I have two different scenes with a male and female avatar each and i am using a text to speech component combined with Salsa lip sync. I see the limitation "Only one native voice at the time (can be solved by generating audio)" so i have only female voice in my app. What exactly is the workaround of this solution (with bullets. Audio file generator?) ? Can it be used in my case?
    Also, i would like to have emotions and if it's possible when there is question mark to have a "question mark" feeling. What would you suggest? Is any of that working offline? thank you and congrats for the great work!
     
    Last edited: Oct 29, 2019
  7. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Thank you for your interest in RT-Voice!

    If you use the normal "Speak"-method, you can have multiple voices at the same time under Android. The limitation in the description only applies to the "SpeakNative"-method.

    Android supports no SSML in the built-in TTS (= offline), so you can't add some "extra emotions".
    If you decide to use online services like MaryTTS, AWS etc., you could use SSML for additional control.

    All in all, RT-Voice works seamless with SALSA, so it's usable for your app.

    I hope this helps you further. In case you've got additional questions, don't hesitate to ask.

    Cheers
    Stefan
     
  8. chgeorgiadis

    chgeorgiadis

    Joined:
    Jan 30, 2018
    Posts:
    21
    Thanks for your reply. I had already Speak method. Actually i have three scenes: one with menu, one with male character and one with female. Both are SALSA Enabled. In each scene i have RTVoice component. When i run on windows everything is fine. Except when i move from one scene to another i have this message:
    Only one active instance of 'RTVoice' allowed in all scenes!
    This object will now be destroyed.
    For example : menu -> male -> menu -> (message) female -> menu
    And it works. But when i run on Android only female voice speaks. Is that a limitation or i have to.. Singleton it? :)
     
  9. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    RT-Voice is already a singleton. Just add it only to the first scene (e.g. "Splash").

    I don't know why that's the case on your Android device; there are probably only female voices available.
    Please try it with our demo scene "01-Speeches" on your device.
    What do you see?
     
  10. chgeorgiadis

    chgeorgiadis

    Joined:
    Jan 30, 2018
    Posts:
    21
    At first i used
    Speaker.Speak(speakText.text, audioSrc, Speaker.VoicesForCulture("en")[0]); (and "en"[1])
    and then i used
    Speaker.Speak(speakText.text, audioSrc, Speaker.VoiceForName(Voicename));

    with Voicename : Microsoft Zira Desktop and Microsoft David Desktop. On Android there was a different female voice.

    Well i tested the demo scene now and.. wow. It seems that it has all these voices in the photo (Xiaomi Mi9 device).

    I tried to change something like that:
    public string Voicename = "en-us-x-sfg#male_2-local"

    but still i have the same voice as previous. Both scenes. How can i take advantage of these android voices? Thank you and i am sorry too many posts for the same "issue" i have.
     

    Attached Files:

  11. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Yeah, you've got some voices ;)
    The problem is, every Android version and device has slightly different names for the voices, so selecting them by name is not the best approach.

    I would use it with "VoiceForGender", like this:
    Code (CSharp):
    1. Speaker.Speak(speakText.text, audioSrc, Speaker.VoiceForGender(Model.Enum.Gender.MALE, "en", 0));
    You can change the the gender and the third parameter is the voice index.
    To have different female and male voices, just change the index to 1, 2 and so forth.

    Does that help you further?
     
  12. OscarCybernetic

    OscarCybernetic

    Joined:
    Sep 12, 2018
    Posts:
    20
    EDIT: I talked with one of our other programmers and he said he coded the Marks file section of the code himself, so please disregard this question; We have to fix it on our end. Sorry for the trouble.

    Hi there, I had a question about using RT-Voice with AWS Polly. We need to generate a marks file to use alongside the voice, but the marks file generated seems to mess up if it has any SSML tags in it which leads to inaccurate timing for the words and visemes. I included a marks file here where you can the various SSML tags mess up the timing

    {"time":6,"type":"word","start":0,"end":2,"value":"Hi"}
    {"time":6,"type":"viseme","value":"k"}
    {"time":63,"type":"viseme","value":"a"}
    {"time":190,"type":"word","start":3,"end":8,"value":"there"}
    {"time":190,"type":"viseme","value":"T"}
    {"time":260,"type":"viseme","value":"E"}
    {"time":399,"type":"viseme","value":"r"}
    {"time":640,"type":"viseme","value":"sil"}
    {"time":834,"type":"word","start":10,"end":12,"value":"my"}
    {"time":834,"type":"viseme","value":"p"}
    {"time":888,"type":"viseme","value":"a"}
    {"time":954,"type":"word","start":13,"end":17,"value":"name"}
    {"time":954,"type":"viseme","value":"t"}
    {"time":1024,"type":"viseme","value":"e"}
    {"time":1098,"type":"viseme","value":"p"}
    {"time":1166,"type":"word","start":18,"end":20,"value":"is"}
    {"time":1166,"type":"viseme","value":"i"}
    {"time":1212,"type":"viseme","value":"s"}
    {"time":1320,"type":"word","start":21,"end":29,"value":"RT-Voice"}
    {"time":1320,"type":"viseme","value":"a"}
    {"time":1429,"type":"viseme","value":"r"}
    {"time":1492,"type":"viseme","value":"t"}
    {"time":1615,"type":"viseme","value":"i"}
    {"time":1723,"type":"viseme","value":"f"}
    {"time":1793,"type":"viseme","value":"O"}
    {"time":2020,"type":"viseme","value":"s"}
    {"time":2205,"type":"viseme","value":"sil"}
    {"time":2399,"type":"word","start":31,"end":35,"value":"your"}
    {"time":2399,"type":"viseme","value":"i"}
    {"time":2449,"type":"viseme","value":"E"}
    {"time":2495,"type":"word","start":36,"end":43,"value":"runtime"}
    {"time":2495,"type":"viseme","value":"r"}
    {"time":2624,"type":"viseme","value":"E"}
    {"time":2657,"type":"viseme","value":"t"}
    {"time":2701,"type":"viseme","value":"t"}
    {"time":2779,"type":"viseme","value":"a"}
    {"time":2887,"type":"viseme","value":"p"}
    {"time":2951,"type":"word","start":44,"end":51,"value":"speaker"}
    {"time":2951,"type":"viseme","value":"s"}
    {"time":3066,"type":"viseme","value":"p"}
    {"time":3129,"type":"viseme","value":"i"}
    {"time":3221,"type":"viseme","value":"k"}
    {"time":3295,"type":"viseme","value":"E"}
    {"time":3548,"type":"viseme","value":"sil"}
    {"time":3942,"type":"word","start":53,"end":54,"value":"I"}
    {"time":3942,"type":"viseme","value":"a"}
    {"time":4023,"type":"word","start":55,"end":58,"value":"can"}
    {"time":4023,"type":"viseme","value":"k"}
    {"time":4088,"type":"viseme","value":"a"}
    {"time":4130,"type":"viseme","value":"t"}
    {"time":4158,"type":"word","start":59,"end":62,"value":"now"}
    {"time":4158,"type":"viseme","value":"t"}
    {"time":4242,"type":"viseme","value":"a"}
    {"time":4399,"type":"word","start":63,"end":68,"value":"speak"}
    {"time":4399,"type":"viseme","value":"s"}
    {"time":4524,"type":"viseme","value":"p"}
    {"time":4582,"type":"viseme","value":"i"}
    {"time":4675,"type":"viseme","value":"k"}
    {"time":4747,"type":"word","start":69,"end":73,"value":"with"}
    {"time":4747,"type":"viseme","value":"u"}
    {"time":4791,"type":"viseme","value":"i"}
    {"time":4827,"type":"viseme","value":"T"}
    {"time":4862,"type":"word","start":74,"end":77,"value":"the"}
    {"time":4862,"type":"viseme","value":"T"}
    {"time":4902,"type":"viseme","value":"@"}
    {"time":4937,"type":"word","start":78,"end":86,"value":"complete"}
    {"time":4937,"type":"viseme","value":"k"}
    {"time":5008,"type":"viseme","value":"@"}
    {"time":5060,"type":"viseme","value":"p"}
    {"time":5112,"type":"viseme","value":"p"}
    {"time":5221,"type":"viseme","value":"t"}
    {"time":5257,"type":"viseme","value":"i"}
    {"time":5339,"type":"viseme","value":"t"}
    {"time":5407,"type":"word","start":87,"end":91,"value":"SSML"}
    {"time":5407,"type":"viseme","value":"E"}
    {"time":5559,"type":"viseme","value":"s"}
    {"time":5653,"type":"viseme","value":"E"}
    {"time":5723,"type":"viseme","value":"s"}
    {"time":5827,"type":"viseme","value":"E"}
    {"time":5902,"type":"viseme","value":"p"}
    {"time":5992,"type":"viseme","value":"E"}
    {"time":6042,"type":"viseme","value":"t"}
    {"time":6140,"type":"word","start":92,"end":105,"value":"specification"}
    {"time":6140,"type":"viseme","value":"s"}
    {"time":6251,"type":"viseme","value":"p"}
    {"time":6302,"type":"viseme","value":"E"}
    {"time":6361,"type":"viseme","value":"s"}
    {"time":6465,"type":"viseme","value":"@"}
    {"time":6492,"type":"viseme","value":"f"}
    {"time":6573,"type":"viseme","value":"@"}
    {"time":6623,"type":"viseme","value":"k"}
    {"time":6742,"type":"viseme","value":"e"}
    {"time":6839,"type":"viseme","value":"S"}
    {"time":6954,"type":"viseme","value":"t"}
    {"time":7038,"type":"word","start":107,"end":114,"value":"prosody"}
    {"time":7038,"type":"viseme","value":"p"}
    {"time":7145,"type":"viseme","value":"r"}
    {"time":7215,"type":"viseme","value":"a"}
    {"time":7295,"type":"viseme","value":"s"}
    {"time":7403,"type":"viseme","value":"@"}
    {"time":7446,"type":"viseme","value":"t"}
    {"time":7482,"type":"viseme","value":"i"}
    {"time":7544,"type":"word","start":115,"end":120,"value":"rate="}
    {"time":7544,"type":"viseme","value":"r"}
    {"time":7634,"type":"viseme","value":"e"}
    {"time":7732,"type":"viseme","value":"t"}
    {"time":7806,"type":"viseme","value":"i"}
    {"time":7939,"type":"viseme","value":"k"}
    {"time":8007,"type":"viseme","value":"u"}
    {"time":8045,"type":"viseme","value":"@"}
    {"time":8073,"type":"viseme","value":"t"}
    {"time":8123,"type":"viseme","value":"s"}
    {"time":8201,"type":"word","start":121,"end":125,"value":"-50%"}
    {"time":8201,"type":"viseme","value":"p"}
    {"time":8294,"type":"viseme","value":"a"}
    {"time":8393,"type":"viseme","value":"t"}
    {"time":8454,"type":"viseme","value":"@"}
    {"time":8506,"type":"viseme","value":"s"}
    {"time":8615,"type":"viseme","value":"f"}
    {"time":8681,"type":"viseme","value":"i"}
    {"time":8746,"type":"viseme","value":"f"}
    {"time":8804,"type":"viseme","value":"t"}
    {"time":8859,"type":"viseme","value":"i"}
    {"time":8930,"type":"viseme","value":"p"}
    {"time":9007,"type":"viseme","value":"E"}
    {"time":9087,"type":"viseme","value":"s"}
    {"time":9187,"type":"viseme","value":"E"}
    {"time":9259,"type":"viseme","value":"t"}
    {"time":9309,"type":"viseme","value":"t"}
    {"time":9362,"type":"word","start":126,"end":127,"value":">"}
    {"time":9362,"type":"viseme","value":"k"}
    {"time":9434,"type":"viseme","value":"r"}
    {"time":9502,"type":"viseme","value":"e"}
    {"time":9574,"type":"viseme","value":"t"}
    {"time":9611,"type":"viseme","value":"E"}
    {"time":9672,"type":"viseme","value":"T"}
    {"time":9739,"type":"viseme","value":"a"}
    {"time":9784,"type":"viseme","value":"t"}
    {"time":9838,"type":"word","start":127,"end":129,"value":"at"}
    {"time":9838,"type":"viseme","value":"a"}
    {"time":9879,"type":"viseme","value":"t"}
    {"time":9910,"type":"word","start":130,"end":134,"value":"half"}
    {"time":9910,"type":"viseme","value":"k"}
    {"time":10009,"type":"viseme","value":"a"}
    {"time":10118,"type":"viseme","value":"f"}
    {"time":10183,"type":"word","start":135,"end":149,"value":"speed<\/prosody"}
    {"time":10183,"type":"viseme","value":"s"}
    {"time":10301,"type":"viseme","value":"p"}
    {"time":10371,"type":"viseme","value":"i"}
    {"time":10470,"type":"viseme","value":"t"}
    {"time":10510,"type":"viseme","value":"s"}
    {"time":10622,"type":"viseme","value":"t"}
    {"time":10695,"type":"viseme","value":"a"}
    {"time":10801,"type":"viseme","value":"S"}
    {"time":10911,"type":"viseme","value":"p"}
    {"time":10990,"type":"viseme","value":"r"}
    {"time":11059,"type":"viseme","value":"a"}
    {"time":11133,"type":"viseme","value":"s"}
    {"time":11252,"type":"viseme","value":"@"}
    {"time":11298,"type":"viseme","value":"t"}
    {"time":11344,"type":"viseme","value":"i"}
    {"time":11433,"type":"word","start":151,"end":153,"value":"or"}
    {"time":11433,"type":"viseme","value":"O"}
    {"time":11536,"type":"viseme","value":"r"}
    {"time":11571,"type":"word","start":155,"end":162,"value":"prosody"}
    {"time":11571,"type":"viseme","value":"p"}
    {"time":11681,"type":"viseme","value":"r"}
    {"time":11741,"type":"viseme","value":"a"}
    {"time":11819,"type":"viseme","value":"s"}
    {"time":11929,"type":"viseme","value":"@"}
    {"time":12004,"type":"viseme","value":"t"}
    {"time":12053,"type":"viseme","value":"i"}
    {"time":12113,"type":"word","start":163,"end":169,"value":"pitch="}
    {"time":12113,"type":"viseme","value":"p"}
    {"time":12223,"type":"viseme","value":"i"}
    {"time":12282,"type":"viseme","value":"S"}
    {"time":12396,"type":"viseme","value":"i"}
    {"time":12518,"type":"viseme","value":"k"}
    {"time":12590,"type":"viseme","value":"u"}
    {"time":12628,"type":"viseme","value":"@"}
    {"time":12656,"type":"viseme","value":"t"}
    {"time":12716,"type":"viseme","value":"s"}
    {"time":12802,"type":"word","start":170,"end":174,"value":"-50%"}
    {"time":12802,"type":"viseme","value":"p"}
    {"time":12890,"type":"viseme","value":"a"}
    {"time":12990,"type":"viseme","value":"t"}
    {"time":13051,"type":"viseme","value":"@"}
    {"time":13102,"type":"viseme","value":"s"}
    {"time":13212,"type":"viseme","value":"f"}
    {"time":13282,"type":"viseme","value":"i"}
    {"time":13351,"type":"viseme","value":"f"}
    {"time":13404,"type":"viseme","value":"t"}
    {"time":13452,"type":"viseme","value":"i"}
    {"time":13510,"type":"viseme","value":"p"}
    {"time":13582,"type":"viseme","value":"E"}
    {"time":13675,"type":"viseme","value":"s"}
    {"time":13768,"type":"viseme","value":"E"}
    {"time":13840,"type":"viseme","value":"t"}
    {"time":13889,"type":"viseme","value":"t"}
    {"time":13942,"type":"word","start":175,"end":176,"value":">"}
    {"time":13942,"type":"viseme","value":"k"}
    {"time":14015,"type":"viseme","value":"r"}
    {"time":14082,"type":"viseme","value":"e"}
    {"time":14154,"type":"viseme","value":"t"}
    {"time":14192,"type":"viseme","value":"E"}
    {"time":14252,"type":"viseme","value":"T"}
    {"time":14319,"type":"viseme","value":"a"}
    {"time":14364,"type":"viseme","value":"t"}
    {"time":14419,"type":"word","start":176,"end":179,"value":"50%"}
    {"time":14419,"type":"viseme","value":"f"}
    {"time":14513,"type":"viseme","value":"i"}
    {"time":14570,"type":"viseme","value":"f"}
    {"time":14639,"type":"viseme","value":"t"}
    {"time":14688,"type":"viseme","value":"i"}
    {"time":14746,"type":"viseme","value":"p"}
    {"time":14817,"type":"viseme","value":"E"}
    {"time":14887,"type":"viseme","value":"s"}
    {"time":14972,"type":"viseme","value":"E"}
    {"time":15044,"type":"viseme","value":"t"}
    {"time":15094,"type":"viseme","value":"t"}
    {"time":15137,"type":"word","start":180,"end":185,"value":"lower"}
    {"time":15137,"type":"viseme","value":"t"}
    {"time":15238,"type":"viseme","value":"o"}
    {"time":15308,"type":"viseme","value":"E"}
    {"time":15405,"type":"word","start":186,"end":193,"value":"pitched"}
    {"time":15405,"type":"viseme","value":"p"}
    {"time":15538,"type":"viseme","value":"i"}
    {"time":15654,"type":"viseme","value":"S"}
    {"time":15878,"type":"viseme","value":"t"}
    {"time":16012,"type":"viseme","value":"sil"}
    {"time":16405,"type":"word","start":194,"end":195,"value":"<"}
    {"time":16405,"type":"viseme","value":"t"}
    {"time":16478,"type":"viseme","value":"E"}
    {"time":16555,"type":"viseme","value":"s"}
    {"time":16634,"type":"viseme","value":"T"}
    {"time":16702,"type":"viseme","value":"a"}
    {"time":16733,"type":"viseme","value":"t"}
    {"time":16784,"type":"word","start":195,"end":203,"value":"\/prosody"}
    {"time":16784,"type":"viseme","value":"s"}
    {"time":16918,"type":"viseme","value":"t"}
    {"time":16982,"type":"viseme","value":"a"}
    {"time":17089,"type":"viseme","value":"S"}
    {"time":17196,"type":"viseme","value":"p"}
    {"time":17276,"type":"viseme","value":"r"}
    {"time":17344,"type":"viseme","value":"a"}
    {"time":17419,"type":"viseme","value":"s"}
    {"time":17537,"type":"viseme","value":"@"}
    {"time":17613,"type":"viseme","value":"t"}
    {"time":17661,"type":"viseme","value":"i"}
    {"time":17732,"type":"word","start":207,"end":214,"value":"prosody"}
    {"time":17732,"type":"viseme","value":"p"}
    {"time":17856,"type":"viseme","value":"r"}
    {"time":17928,"type":"viseme","value":"a"}
    {"time":18009,"type":"viseme","value":"s"}
    {"time":18111,"type":"viseme","value":"@"}
    {"time":18153,"type":"viseme","value":"t"}
    {"time":18193,"type":"viseme","value":"i"}
    {"time":18251,"type":"word","start":215,"end":223,"value":"contour="}
    {"time":18251,"type":"viseme","value":"k"}
    {"time":18375,"type":"viseme","value":"a"}
    {"time":18476,"type":"viseme","value":"t"}
    {"time":18512,"type":"viseme","value":"t"}
    {"time":18603,"type":"viseme","value":"u"}
    {"time":18658,"type":"viseme","value":"r"}
    {"time":18744,"type":"viseme","value":"i"}
    {"time":18818,"type":"viseme","value":"k"}
    {"time":18908,"type":"viseme","value":"u"}
    {"time":18958,"type":"viseme","value":"@"}
    {"time":19015,"type":"viseme","value":"t"}
    {"time":19141,"type":"viseme","value":"s"}
    {"time":19333,"type":"viseme","value":"sil"}
    {"time":19527,"type":"word","start":225,"end":227,"value":"0%"}
    {"time":19527,"type":"viseme","value":"s"}
    {"time":19650,"type":"viseme","value":"i"}
    {"time":19709,"type":"viseme","value":"r"}
    {"time":19816,"type":"viseme","value":"o"}
    {"time":19865,"type":"viseme","value":"p"}
    {"time":19967,"type":"viseme","value":"E"}
    {"time":20046,"type":"viseme","value":"s"}
    {"time":20158,"type":"viseme","value":"E"}
    {"time":20298,"type":"viseme","value":"t"}
    {"time":20369,"type":"viseme","value":"t"}
    {"time":20482,"type":"viseme","value":"sil"}
    {"time":20676,"type":"word","start":228,"end":229,"value":"+"}
    {"time":20676,"type":"viseme","value":"p"}
    {"time":20730,"type":"viseme","value":"t"}
    {"time":20780,"type":"viseme","value":"E"}
    {"time":20830,"type":"viseme","value":"s"}
    {"time":20923,"type":"word","start":229,"end":232,"value":"20%"}
    {"time":20923,"type":"viseme","value":"t"}
    {"time":20982,"type":"viseme","value":"u"}
    {"time":21083,"type":"viseme","value":"E"}
    {"time":21112,"type":"viseme","value":"t"}
    {"time":21144,"type":"viseme","value":"t"}
    {"time":21184,"type":"viseme","value":"i"}
    {"time":21236,"type":"viseme","value":"p"}
    {"time":21306,"type":"viseme","value":"E"}
    {"time":21377,"type":"viseme","value":"s"}
    {"time":21471,"type":"viseme","value":"E"}
    {"time":21543,"type":"viseme","value":"t"}
    {"time":21586,"type":"viseme","value":"t"}
    {"time":21618,"type":"word","start":235,"end":238,"value":"40%"}
    {"time":21618,"type":"viseme","value":"f"}
    {"time":21709,"type":"viseme","value":"O"}
    {"time":21789,"type":"viseme","value":"r"}
    {"time":21830,"type":"viseme","value":"t"}
    {"time":21870,"type":"viseme","value":"i"}
    {"time":21926,"type":"viseme","value":"p"}
    {"time":22006,"type":"viseme","value":"E"}
    {"time":22086,"type":"viseme","value":"s"}
    {"time":22196,"type":"viseme","value":"E"}
    {"time":22335,"type":"viseme","value":"t"}
    {"time":22407,"type":"viseme","value":"t"}
    {"time":22520,"type":"viseme","value":"sil"}
    {"time":22713,"type":"word","start":239,"end":240,"value":"+"}
    {"time":22713,"type":"viseme","value":"p"}
    {"time":22768,"type":"viseme","value":"t"}
    {"time":22818,"type":"viseme","value":"E"}
    {"time":22868,"type":"viseme","value":"s"}
    {"time":22965,"type":"word","start":240,"end":243,"value":"40%"}
    {"time":22965,"type":"viseme","value":"f"}
    {"time":23066,"type":"viseme","value":"O"}
    {"time":23134,"type":"viseme","value":"r"}
    {"time":23178,"type":"viseme","value":"t"}
    {"time":23220,"type":"viseme","value":"i"}
    {"time":23279,"type":"viseme","value":"p"}
    {"time":23380,"type":"viseme","value":"E"}
    {"time":23460,"type":"viseme","value":"s"}
    {"time":23560,"type":"viseme","value":"E"}
    {"time":23632,"type":"viseme","value":"t"}
    {"time":23682,"type":"viseme","value":"t"}
    {"time":23725,"type":"word","start":246,"end":249,"value":"60%"}
    {"time":23725,"type":"viseme","value":"s"}
    {"time":23845,"type":"viseme","value":"i"}
    {"time":23895,"type":"viseme","value":"k"}
    {"time":23959,"type":"viseme","value":"s"}
    {"time":24003,"type":"viseme","value":"t"}
    {"time":24048,"type":"viseme","value":"i"}
    {"time":24108,"type":"viseme","value":"p"}
    {"time":24172,"type":"viseme","value":"E"}
    {"time":24256,"type":"viseme","value":"s"}
    {"time":24362,"type":"viseme","value":"E"}
    {"time":24501,"type":"viseme","value":"t"}
    {"time":24572,"type":"viseme","value":"t"}
    {"time":24686,"type":"viseme","value":"sil"}
    {"time":24879,"type":"word","start":250,"end":251,"value":"+"}
    {"time":24879,"type":"viseme","value":"p"}
    {"time":24933,"type":"viseme","value":"t"}
    {"time":24983,"type":"viseme","value":"E"}
    {"time":25034,"type":"viseme","value":"s"}
    {"time":25121,"type":"word","start":251,"end":254,"value":"60%"}
    {"time":25121,"type":"viseme","value":"s"}
    {"time":25213,"type":"viseme","value":"i"}
    {"time":25261,"type":"viseme","value":"k"}
    {"time":25319,"type":"viseme","value":"s"}
    {"time":25356,"type":"viseme","value":"t"}
    {"time":25403,"type":"viseme","value":"i"}
    {"time":25473,"type":"viseme","value":"p"}
    {"time":25551,"type":"viseme","value":"E"}
    {"time":25631,"type":"viseme","value":"s"}
    {"time":25731,"type":"viseme","value":"E"}
    {"time":25802,"type":"viseme","value":"t"}
    {"time":25855,"type":"viseme","value":"t"}
    {"time":25915,"type":"word","start":257,"end":260,"value":"80%"}
    {"time":25915,"type":"viseme","value":"e"}
    {"time":26041,"type":"viseme","value":"t"}
    {"time":26081,"type":"viseme","value":"i"}
    {"time":26137,"type":"viseme","value":"p"}
    {"time":26217,"type":"viseme","value":"E"}
    {"time":26297,"type":"viseme","value":"s"}
    {"time":26407,"type":"viseme","value":"E"}
    {"time":26547,"type":"viseme","value":"t"}
    {"time":26618,"type":"viseme","value":"t"}
    {"time":26731,"type":"viseme","value":"sil"}
    {"time":26925,"type":"word","start":261,"end":262,"value":"+"}
    {"time":26925,"type":"viseme","value":"p"}
    {"time":26979,"type":"viseme","value":"t"}
    {"time":27029,"type":"viseme","value":"E"}
    {"time":27079,"type":"viseme","value":"s"}
    {"time":27173,"type":"word","start":262,"end":265,"value":"80%"}
    {"time":27173,"type":"viseme","value":"e"}
    {"time":27308,"type":"viseme","value":"t"}
    {"time":27343,"type":"viseme","value":"i"}
    {"time":27401,"type":"viseme","value":"p"}
    {"time":27476,"type":"viseme","value":"E"}
    {"time":27553,"type":"viseme","value":"s"}
    {"time":27643,"type":"viseme","value":"E"}
    {"time":27711,"type":"viseme","value":"t"}
    {"time":27748,"type":"viseme","value":"t"}
    {"time":27803,"type":"word","start":268,"end":272,"value":"100%"}
    {"time":27803,"type":"viseme","value":"u"}
    {"time":27887,"type":"viseme","value":"E"}
    {"time":27951,"type":"viseme","value":"t"}
    {"time":28004,"type":"viseme","value":"k"}
    {"time":28081,"type":"viseme","value":"E"}
    {"time":28121,"type":"viseme","value":"t"}
    {"time":28153,"type":"viseme","value":"t"}
    {"time":28190,"type":"viseme","value":"r"}
    {"time":28233,"type":"viseme","value":"@"}
    {"time":28271,"type":"viseme","value":"t"}
    {"time":28312,"type":"viseme","value":"p"}
    {"time":28377,"type":"viseme","value":"E"}
    {"time":28450,"type":"viseme","value":"s"}
    {"time":28540,"type":"viseme","value":"E"}
    {"time":28679,"type":"viseme","value":"t"}
    {"time":28750,"type":"viseme","value":"t"}
    {"time":28863,"type":"viseme","value":"sil"}
    {"time":29057,"type":"word","start":273,"end":274,"value":"+"}
    {"time":29057,"type":"viseme","value":"p"}
    {"time":29111,"type":"viseme","value":"t"}
    {"time":29161,"type":"viseme","value":"E"}
    {"time":29211,"type":"viseme","value":"s"}
    {"time":29284,"type":"word","start":274,"end":278,"value":"100%"}
    {"time":29284,"type":"viseme","value":"u"}
    {"time":29379,"type":"viseme","value":"E"}
    {"time":29424,"type":"viseme","value":"t"}
    {"time":29471,"type":"viseme","value":"k"}
    {"time":29551,"type":"viseme","value":"E"}
    {"time":29589,"type":"viseme","value":"t"}
    {"time":29620,"type":"viseme","value":"t"}
    {"time":29662,"type":"viseme","value":"r"}
    {"time":29703,"type":"viseme","value":"@"}
    {"time":29744,"type":"viseme","value":"t"}
    {"time":29799,"type":"viseme","value":"p"}
    {"time":29876,"type":"viseme","value":"E"}
    {"time":29949,"type":"viseme","value":"s"}
    {"time":30038,"type":"viseme","value":"E"}
    {"time":30176,"type":"viseme","value":"t"}
    {"time":30248,"type":"viseme","value":"t"}
    {"time":30360,"type":"viseme","value":"sil"}
    {"time":30547,"type":"word","start":280,"end":281,"value":">"}
    {"time":30547,"type":"viseme","value":"k"}
    {"time":30602,"type":"viseme","value":"r"}
    {"time":30680,"type":"viseme","value":"e"}
    {"time":30749,"type":"viseme","value":"t"}
    {"time":30791,"type":"viseme","value":"E"}
    {"time":30867,"type":"viseme","value":"T"}
    {"time":30927,"type":"viseme","value":"a"}
    {"time":30956,"type":"viseme","value":"t"}
    {"time":31009,"type":"word","start":281,"end":282,"value":"I"}
    {"time":31009,"type":"viseme","value":"a"}
    {"time":31086,"type":"word","start":283,"end":286,"value":"can"}
    {"time":31086,"type":"viseme","value":"k"}
    {"time":31141,"type":"viseme","value":"a"}
    {"time":31179,"type":"viseme","value":"t"}
    {"time":31225,"type":"word","start":287,"end":291,"value":"talk"}
    {"time":31225,"type":"viseme","value":"t"}
    {"time":31321,"type":"viseme","value":"O"}
    {"time":31440,"type":"viseme","value":"k"}
    {"time":31532,"type":"word","start":292,"end":296,"value":"with"}
    {"time":31532,"type":"viseme","value":"u"}
    {"time":31566,"type":"viseme","value":"i"}
    {"time":31608,"type":"viseme","value":"T"}
    {"time":31727,"type":"word","start":297,"end":303,"value":"rising"}
    {"time":31727,"type":"viseme","value":"r"}
    {"time":31800,"type":"viseme","value":"a"}
    {"time":31911,"type":"viseme","value":"s"}
    {"time":31983,"type":"viseme","value":"i"}
    {"time":32022,"type":"viseme","value":"k"}
    {"time":32097,"type":"word","start":304,"end":323,"value":"intonation<\/prosody"}
    {"time":32097,"type":"viseme","value":"i"}
    {"time":32192,"type":"viseme","value":"t"}
    {"time":32238,"type":"viseme","value":"t"}
    {"time":32293,"type":"viseme","value":"@"}
    {"time":32323,"type":"viseme","value":"t"}
    {"time":32376,"type":"viseme","value":"e"}
    {"time":32485,"type":"viseme","value":"S"}
    {"time":32611,"type":"viseme","value":"t"}
    {"time":32721,"type":"viseme","value":"s"}
    {"time":32852,"type":"viseme","value":"t"}
    {"time":32925,"type":"viseme","value":"a"}
    {"time":33031,"type":"viseme","value":"S"}
    {"time":33141,"type":"viseme","value":"p"}
    {"time":33220,"type":"viseme","value":"r"}
    {"time":33289,"type":"viseme","value":"a"}
    {"time":33363,"type":"viseme","value":"s"}
    {"time":33482,"type":"viseme","value":"@"}
    {"time":33528,"type":"viseme","value":"t"}
    {"time":33579,"type":"viseme","value":"i"}
    {"time":33649,"type":"word","start":326,"end":333,"value":"prosody"}
    {"time":33649,"type":"viseme","value":"p"}
    {"time":33773,"type":"viseme","value":"r"}
    {"time":33845,"type":"viseme","value":"a"}
    {"time":33926,"type":"viseme","value":"s"}
    {"time":34028,"type":"viseme","value":"@"}
    {"time":34070,"type":"viseme","value":"t"}
    {"time":34106,"type":"viseme","value":"i"}
    {"time":34189,"type":"word","start":334,"end":342,"value":"contour="}
    {"time":34189,"type":"viseme","value":"k"}
    {"time":34325,"type":"viseme","value":"a"}
    {"time":34439,"type":"viseme","value":"t"}
    {"time":34485,"type":"viseme","value":"t"}
    {"time":34568,"type":"viseme","value":"u"}
    {"time":34623,"type":"viseme","value":"r"}
    {"time":34708,"type":"viseme","value":"i"}
    {"time":34783,"type":"viseme","value":"k"}
    {"time":34873,"type":"viseme","value":"u"}
    {"time":34933,"type":"viseme","value":"@"}
    {"time":34980,"type":"viseme","value":"t"}
    {"time":35084,"type":"viseme","value":"s"}
    {"time":35229,"type":"viseme","value":"sil"}
    {"time":35424,"type":"word","start":344,"end":346,"value":"0%"}
    {"time":35424,"type":"viseme","value":"s"}
    {"time":35547,"type":"viseme","value":"i"}
    {"time":35601,"type":"viseme","value":"r"}
    {"time":35738,"type":"viseme","value":"o"}
    {"time":35787,"type":"viseme","value":"p"}
    {"time":35883,"type":"viseme","value":"E"}
    {"time":35964,"type":"viseme","value":"s"}
    {"time":36066,"type":"viseme","value":"E"}
    {"time":36205,"type":"viseme","value":"t"}
    {"time":36272,"type":"viseme","value":"t"}
    {"time":36395,"type":"viseme","value":"sil"}
    {"time":36590,"type":"word","start":347,"end":351,"value":"-20%"}
    {"time":36590,"type":"viseme","value":"p"}
    {"time":36660,"type":"viseme","value":"a"}
    {"time":36749,"type":"viseme","value":"t"}
    {"time":36808,"type":"viseme","value":"@"}
    {"time":36861,"type":"viseme","value":"s"}
    {"time":36943,"type":"viseme","value":"t"}
    {"time":37010,"type":"viseme","value":"u"}
    {"time":37104,"type":"viseme","value":"E"}
    {"time":37139,"type":"viseme","value":"t"}
    {"time":37168,"type":"viseme","value":"t"}
    {"time":37207,"type":"viseme","value":"i"}
    {"time":37262,"type":"viseme","value":"p"}
    {"time":37357,"type":"viseme","value":"E"}
    {"time":37431,"type":"viseme","value":"s"}
    {"time":37518,"type":"viseme","value":"E"}
    {"time":37593,"type":"viseme","value":"t"}
    {"time":37644,"type":"viseme","value":"t"}
    {"time":37676,"type":"word","start":354,"end":357,"value":"40%"}
    {"time":37676,"type":"viseme","value":"f"}
    {"time":37784,"type":"viseme","value":"O"}
    {"time":37853,"type":"viseme","value":"r"}
    {"time":37895,"type":"viseme","value":"t"}
    {"time":37933,"type":"viseme","value":"i"}
    {"time":37989,"type":"viseme","value":"p"}
    {"time":38069,"type":"viseme","value":"E"}
    {"time":38149,"type":"viseme","value":"s"}
    {"time":38259,"type":"viseme","value":"E"}
    {"time":38398,"type":"viseme","value":"t"}
    {"time":38470,"type":"viseme","value":"t"}
    {"time":38583,"type":"viseme","value":"sil"}
    {"time":38770,"type":"word","start":358,"end":362,"value":"-40%"}
    {"time":38770,"type":"viseme","value":"p"}
    {"time":38839,"type":"viseme","value":"a"}
    {"time":38969,"type":"viseme","value":"t"}
    {"time":39034,"type":"viseme","value":"@"}
    {"time":39084,"type":"viseme","value":"s"}
    {"time":39177,"type":"viseme","value":"f"}
    {"time":39246,"type":"viseme","value":"O"}
    {"time":39326,"type":"viseme","value":"r"}
    {"time":39361,"type":"viseme","value":"t"}
    {"time":39407,"type":"viseme","value":"i"}
    {"time":39467,"type":"viseme","value":"p"}
    {"time":39539,"type":"viseme","value":"E"}
    {"time":39615,"type":"viseme","value":"s"}
    {"time":39717,"type":"viseme","value":"E"}
    {"time":39787,"type":"viseme","value":"t"}
    {"time":39841,"type":"viseme","value":"t"}
    {"time":39883,"type":"word","start":365,"end":368,"value":"60%"}
    {"time":39883,"type":"viseme","value":"s"}
    {"time":39999,"type":"viseme","value":"i"}
    {"time":40049,"type":"viseme","value":"k"}
    {"time":40111,"type":"viseme","value":"s"}
    {"time":40156,"type":"viseme","value":"t"}
    {"time":40202,"type":"viseme","value":"i"}
    {"time":40273,"type":"viseme","value":"p"}
    {"time":40372,"type":"viseme","value":"E"}
    {"time":40453,"type":"viseme","value":"s"}
    {"time":40560,"type":"viseme","value":"E"}
    {"time":40698,"type":"viseme","value":"t"}
    {"time":40770,"type":"viseme","value":"t"}
    {"time":40882,"type":"viseme","value":"sil"}
    {"time":41076,"type":"word","start":369,"end":373,"value":"-60%"}
    {"time":41076,"type":"viseme","value":"p"}
    {"time":41172,"type":"viseme","value":"a"}
    {"time":41292,"type":"viseme","value":"t"}
    {"time":41345,"type":"viseme","value":"@"}
    {"time":41398,"type":"viseme","value":"s"}
    {"time":41481,"type":"viseme","value":"s"}
    {"time":41565,"type":"viseme","value":"i"}
    {"time":41614,"type":"viseme","value":"k"}
    {"time":41675,"type":"viseme","value":"s"}
    {"time":41716,"type":"viseme","value":"t"}
    {"time":41776,"type":"viseme","value":"i"}
    {"time":41826,"type":"viseme","value":"p"}
    {"time":41903,"type":"viseme","value":"E"}
    {"time":41984,"type":"viseme","value":"s"}
    {"time":42081,"type":"viseme","value":"E"}
    {"time":42153,"type":"viseme","value":"t"}
    {"time":42203,"type":"viseme","value":"t"}
    {"time":42261,"type":"word","start":376,"end":379,"value":"80%"}
    {"time":42261,"type":"viseme","value":"e"}
    {"time":42398,"type":"viseme","value":"t"}
    {"time":42427,"type":"viseme","value":"i"}
    {"time":42477,"type":"viseme","value":"p"}
    {"time":42554,"type":"viseme","value":"E"}
    {"time":42635,"type":"viseme","value":"s"}
    {"time":42742,"type":"viseme","value":"E"}
    {"time":42881,"type":"viseme","value":"t"}
    {"time":42952,"type":"viseme","value":"t"}
    {"time":43066,"type":"viseme","value":"sil"}
    {"time":43259,"type":"word","start":380,"end":384,"value":"-80%"}
    {"time":43259,"type":"viseme","value":"p"}
    {"time":43355,"type":"viseme","value":"a"}
    {"time":43475,"type":"viseme","value":"t"}
    {"time":43528,"type":"viseme","value":"@"}
    {"time":43577,"type":"viseme","value":"s"}
    {"time":43694,"type":"viseme","value":"e"}
    {"time":43811,"type":"viseme","value":"t"}
    {"time":43847,"type":"viseme","value":"i"}
    {"time":43921,"type":"viseme","value":"p"}
    {"time":43991,"type":"viseme","value":"E"}
    {"time":44067,"type":"viseme","value":"s"}
    {"time":44157,"type":"viseme","value":"E"}
    {"time":44225,"type":"viseme","value":"t"}
    {"time":44262,"type":"viseme","value":"t"}
    {"time":44317,"type":"word","start":387,"end":391,"value":"100%"}
    {"time":44317,"type":"viseme","value":"u"}
    {"time":44401,"type":"viseme","value":"E"}
    {"time":44465,"type":"viseme","value":"t"}
    {"time":44518,"type":"viseme","value":"k"}
    {"time":44595,"type":"viseme","value":"E"}
    {"time":44634,"type":"viseme","value":"t"}
    {"time":44678,"type":"viseme","value":"t"}
    {"time":44718,"type":"viseme","value":"r"}
    {"time":44751,"type":"viseme","value":"@"}
    {"time":44779,"type":"viseme","value":"t"}
    {"time":44818,"type":"viseme","value":"p"}
    {"time":44897,"type":"viseme","value":"E"}
    {"time":44973,"type":"viseme","value":"s"}
    {"time":45094,"type":"viseme","value":"E"}
    {"time":45229,"type":"viseme","value":"t"}
    {"time":45302,"type":"viseme","value":"t"}
    {"time":45414,"type":"viseme","value":"sil"}
    {"time":45608,"type":"word","start":392,"end":397,"value":"-100%"}
    {"time":45608,"type":"viseme","value":"p"}
    {"time":45704,"type":"viseme","value":"a"}
    {"time":45823,"type":"viseme","value":"t"}
    {"time":45877,"type":"viseme","value":"@"}
    {"time":45930,"type":"viseme","value":"s"}
    {"time":46003,"type":"viseme","value":"u"}
    {"time":46099,"type":"viseme","value":"E"}
    {"time":46144,"type":"viseme","value":"t"}
    {"time":46194,"type":"viseme","value":"k"}
    {"time":46274,"type":"viseme","value":"E"}
    {"time":46323,"type":"viseme","value":"t"}
    {"time":46353,"type":"viseme","value":"t"}
    {"time":46392,"type":"viseme","value":"r"}
    {"time":46441,"type":"viseme","value":"@"}
    {"time":46485,"type":"viseme","value":"t"}
    {"time":46533,"type":"viseme","value":"p"}
    {"time":46585,"type":"viseme","value":"E"}
    {"time":46664,"type":"viseme","value":"s"}
    {"time":46779,"type":"viseme","value":"E"}
    {"time":46918,"type":"viseme","value":"t"}
    {"time":46994,"type":"viseme","value":"t"}
    {"time":47118,"type":"viseme","value":"sil"}
    {"time":47305,"type":"word","start":399,"end":400,"value":">"}
    {"time":47305,"type":"viseme","value":"k"}
    {"time":47359,"type":"viseme","value":"r"}
    {"time":47437,"type":"viseme","value":"e"}
    {"time":47507,"type":"viseme","value":"t"}
    {"time":47553,"type":"viseme","value":"E"}
    {"time":47615,"type":"viseme","value":"T"}
    {"time":47686,"type":"viseme","value":"a"}
    {"time":47736,"type":"viseme","value":"t"}
    {"time":47805,"type":"word","start":400,"end":402,"value":"or"}
    {"time":47805,"type":"viseme","value":"O"}
    {"time":47873,"type":"viseme","value":"r"}
    {"time":47914,"type":"word","start":403,"end":407,"value":"with"}
    {"time":47914,"type":"viseme","value":"u"}
    {"time":47991,"type":"viseme","value":"i"}
    {"time":48031,"type":"viseme","value":"T"}
    {"time":48092,"type":"word","start":408,"end":415,"value":"falling"}
    {"time":48092,"type":"viseme","value":"f"}
    {"time":48190,"type":"viseme","value":"O"}
    {"time":48268,"type":"viseme","value":"t"}
    {"time":48346,"type":"viseme","value":"i"}
    {"time":48402,"type":"viseme","value":"k"}
    {"time":48460,"type":"word","start":416,"end":426,"value":"intonation"}
    {"time":48460,"type":"viseme","value":"i"}
    {"time":48489,"type":"viseme","value":"t"}
    {"time":48539,"type":"viseme","value":"t"}
    {"time":48601,"type":"viseme","value":"@"}
    {"time":48628,"type":"viseme","value":"t"}
    {"time":48681,"type":"viseme","value":"e"}
    {"time":48780,"type":"viseme","value":"S"}
    {"time":48904,"type":"viseme","value":"t"}
    {"time":49137,"type":"viseme","value":"sil"}
    {"time":49530,"type":"word","start":427,"end":428,"value":"<"}
    {"time":49530,"type":"viseme","value":"t"}
    {"time":49605,"type":"viseme","value":"E"}
    {"time":49664,"type":"viseme","value":"s"}
    {"time":49754,"type":"viseme","value":"T"}
    {"time":49822,"type":"viseme","value":"a"}
    {"time":49853,"type":"viseme","value":"t"}
    {"time":49909,"type":"word","start":428,"end":436,"value":"\/prosody"}
    {"time":49909,"type":"viseme","value":"s"}
    {"time":50023,"type":"viseme","value":"t"}
    {"time":50088,"type":"viseme","value":"a"}
    {"time":50197,"type":"viseme","value":"S"}
    {"time":50306,"type":"viseme","value":"p"}
    {"time":50385,"type":"viseme","value":"r"}
    {"time":50454,"type":"viseme","value":"a"}
    {"time":50528,"type":"viseme","value":"s"}
    {"time":50641,"type":"viseme","value":"@"}
    {"time":50685,"type":"viseme","value":"t"}
    {"time":50724,"type":"viseme","value":"i"}
    {"time":50812,"type":"word","start":438,"end":442,"value":"This"}
    {"time":50812,"type":"viseme","value":"T"}
    {"time":50873,"type":"viseme","value":"i"}
    {"time":50921,"type":"viseme","value":"s"}
    {"time":51034,"type":"word","start":443,"end":445,"value":"is"}
    {"time":51034,"type":"viseme","value":"i"}
    {"time":51075,"type":"viseme","value":"s"}
    {"time":51188,"type":"word","start":447,"end":455,"value":"emphasis"}
    {"time":51188,"type":"viseme","value":"E"}
    {"time":51298,"type":"viseme","value":"p"}
    {"time":51361,"type":"viseme","value":"f"}
    {"time":51415,"type":"viseme","value":"@"}
    {"time":51461,"type":"viseme","value":"s"}
    {"time":51556,"type":"viseme","value":"i"}
    {"time":51614,"type":"viseme","value":"s"}
    {"time":51715,"type":"word","start":456,"end":462,"value":"level="}
    {"time":51715,"type":"viseme","value":"t"}
    {"time":51811,"type":"viseme","value":"E"}
    {"time":51858,"type":"viseme","value":"f"}
    {"time":51921,"type":"viseme","value":"t"}
    {"time":52010,"type":"viseme","value":"i"}
    {"time":52126,"type":"viseme","value":"k"}
    {"time":52194,"type":"viseme","value":"u"}
    {"time":52227,"type":"viseme","value":"@"}
    {"time":52260,"type":"viseme","value":"t"}
    {"time":52325,"type":"viseme","value":"s"}
    {"time":52380,"type":"word","start":463,"end":469,"value":"strong"}
    {"time":52380,"type":"viseme","value":"s"}
    {"time":52459,"type":"viseme","value":"t"}
    {"time":52510,"type":"viseme","value":"r"}
    {"time":52595,"type":"viseme","value":"a"}
    {"time":52645,"type":"viseme","value":"k"}
    {"time":52713,"type":"word","start":470,"end":471,"value":">"}
    {"time":52713,"type":"viseme","value":"k"}
    {"time":52792,"type":"viseme","value":"r"}
    {"time":52870,"type":"viseme","value":"e"}
    {"time":52934,"type":"viseme","value":"t"}
    {"time":52970,"type":"viseme","value":"E"}
    {"time":53060,"type":"viseme","value":"T"}
    {"time":53130,"type":"viseme","value":"a"}
    {"time":53166,"type":"viseme","value":"t"}
    {"time":53233,"type":"word","start":471,"end":488,"value":"awesome<\/emphasis"}
    {"time":53233,"type":"viseme","value":"O"}
    {"time":53421,"type":"viseme","value":"s"}
    {"time":53537,"type":"viseme","value":"p"}
    {"time":53647,"type":"viseme","value":"s"}
    {"time":53778,"type":"viseme","value":"t"}
    {"time":53845,"type":"viseme","value":"a"}
    {"time":53952,"type":"viseme","value":"S"}
    {"time":54093,"type":"viseme","value":"E"}
    {"time":54185,"type":"viseme","value":"p"}
    {"time":54264,"type":"viseme","value":"f"}
    {"time":54312,"type":"viseme","value":"@"}
    {"time":54364,"type":"viseme","value":"s"}
    {"time":54483,"type":"viseme","value":"i"}
    {"time":54591,"type":"viseme","value":"s"}
    {"time":54799,"type":"viseme","value":"sil"}

    It seems that for ssml to work, it has to be included as a speechMarksType, but any time I include ssml, it returns a 400 Bad Request error whether it's by itself or included with Visemes and Words
     
    Last edited: Nov 11, 2019
  13. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    No problem ;)

    If you have a working solution and don't mind sharing it, I expect many user would be very greatful.


    Cheers
    Stefan
     
    Last edited: Nov 12, 2019
  14. OscarCybernetic

    OscarCybernetic

    Joined:
    Sep 12, 2018
    Posts:
    20
    Of course. Once we work out the kinks, we'd be happy to share it with you
     
    Stefan-Laubenberger likes this.
  15. klicktock

    klicktock

    Joined:
    Jun 9, 2011
    Posts:
    7
    Using Unity 2018.4.12f1 and the latest RT-Voice from the Asset Store I'm able to run the Speaker.Speak( stringToSay, audioSource ) just fine in the Simulator, but when I run it on device, I get this:


    (Filename: ./Runtime/Export/Debug.bindings.h Line: 45)
    InvalidOperationException: Sequence contains more than one matching element
    at System.Linq.Enumerable.SingleOrDefault[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`2[T,TResult] predicate) [0x00000] in <00000000000000000000000000000000>:0
    at Crosstales.RTVoice.Speaker.VoiceForName (System.String name, System.Boolean isExact) [0x00000] in <00000000000000000000000000000000>:0
    at Crosstales.RTVoice.Provider.VoiceProviderIOS.getVoiceId (Crosstales.RTVoice.Model.Wrapper wrapper) [0x00000] in <00000000000000000000000000000000>:0
    at Crosstales.RTVoice.Provider.VoiceProviderIOS+<speak>d__43.MoveNext () [0x00000] in <00000000000000000000000000000000>:0
    at UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) [0x00000] in <00000000000000000000000000000000>:0
     
  16. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Please replace line 1371 in Speaker.cs with this code:
    Code (CSharp):
    1. result = isExact ? Voices.FirstOrDefault(voice => voice.Name.CTEquals(name)) : Voices.FirstOrDefault(voice => voice.Name.CTContains(name));
    Does it work?


    So long,
    Stefan
     
  17. klicktock

    klicktock

    Joined:
    Jun 9, 2011
    Posts:
    7
    Fixed :) Thanks Stefan.
     
    Stefan-Laubenberger likes this.
  18. idibil

    idibil

    Joined:
    Oct 10, 2015
    Posts:
    7
    Hello Stefan,

    After updating my RT Voice to the latest version I am getting these errors:

    Assets\Plugins\crosstales\RTVoice\3rd party\AWS Polly\Scripts\VoiceProviderAWS.cs(9,18): error CS0534: 'VoiceProviderAWS' does not implement inherited abstract member 'BaseCustomVoiceProvider.hasVoicesInEditor.get'

    Assets\Plugins\crosstales\RTVoice\Editor\Extension\VoiceInitializerEditor.cs(8,31): error CS0234: The type or namespace name 'VoiceInitializer' does not exist in the namespace 'Crosstales.RTVoice.Tool' (are you missing an assembly reference?)

    Assets\Plugins\crosstales\RTVoice\Editor\Extension\VoiceInitializerEditor.cs(13,22): error CS0234: The type or namespace name 'VoiceInitializer' does not exist in the namespace 'Crosstales.RTVoice.Tool' (are you missing an assembly reference?)

    Let me know if it has some solution. Thank you.
     
  19. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Please make sure you followed the procedure described in chapter 10 of the documentation:
    https://www.crosstales.com/media/data/assets/rtvoice/RTVoice-doc.pdf


    Cheers
    Stefan
     
  20. idibil

    idibil

    Joined:
    Oct 10, 2015
    Posts:
    7
    Stefan-Laubenberger likes this.
  21. cabanel

    cabanel

    Joined:
    Sep 22, 2014
    Posts:
    66
    hi,

    I have integrated your library into my Android app and it works well, after having published it
    But firebase's Crashlytics tells me:


    Non-fatal Exception: java.lang.Exception
    AndroidJavaException : java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.Set.iterator()' on a null object reference
    keyboard_arrow_up

    java.util.Set.iterator (java.util.Set)
    arrow_right
    com.crosstales.RTVoice.RTVoiceAndroidBridge.SpeakNative (com.crosstales.RTVoice.RTVoiceAndroidBridge)
    (com.unity3d.player.UnityPlayer)(com.unity3d.player.UnityPlayer)(com.unity3d.player.UnityPlayer$e$2)

    android.os.MessageQueue.next (android.os.MessageQueue)
    arrow_drop_down
    android.os.Looper.loop (android.os.Looper)
    (com.unity3d.player.UnityPlayer$e)(UnityEngine.AndroidJNISafe)(UnityEngine.AndroidJavaObject)(Crosstales.RTVoice.Provider.VoiceProviderAndroid+<SpeakNative>d__32)(UnityEngine.SetupCoroutine)

    could you help me to solve this error?
    Thanks
     
  22. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    The issue is very strange, I never saw something like this, especially since it contains things like "keyboard_arrow_up"...:confused:

    However, I made an update to the native library, if you like to test it, please send me your invoice via email.


    So long,
    Stefan
     
  23. cabanel

    cabanel

    Joined:
    Sep 22, 2014
    Posts:
    66
    Is difficult for me to test it because no error occurs on my devices and in addition it is a project in production.
    In 1 week there were 1384 error in 277 user
    as in the figure



    this is the Crashlytics txt:


    Non-fatal Exception: java.lang.Exception: AndroidJavaException : java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.speech.tts.Voice.getName()' on a null object reference
    at android.speech.tts.Voice.getName(android.speech.tts.Voice)
    at android.speech.tts.TextToSpeech$13.run(android.speech.tts.TextToSpeech$13)
    at android.speech.tts.TextToSpeech$13.run(android.speech.tts.TextToSpeech$13)
    at android.speech.tts.TextToSpeech$Connection.runAction(android.speech.tts.TextToSpeech$Connection)
    at android.speech.tts.TextToSpeech.runAction(android.speech.tts.TextToSpeech)
    at android.speech.tts.TextToSpeech.runAction(android.speech.tts.TextToSpeech)
    at android.speech.tts.TextToSpeech.setVoice(android.speech.tts.TextToSpeech)
    at com.crosstales.RTVoice.RTVoiceAndroidBridge.SpeakNative(com.crosstales.RTVoice.RTVoiceAndroidBridge)
    at com.unity3d.player.UnityPlayer.nativeRender(com.unity3d.player.UnityPlayer)
    at com.unity3d.player.UnityPlayer.c(com.unity3d.player.UnityPlayer)
    at com.unity3d.player.UnityPlayer$e$2.queueIdle(com.unity3d.player.UnityPlayer$e$2)
    at android.os.MessageQueue.next(android.os.MessageQueue)
    at android.os.Looper.loop(android.os.Looper)
    at com.unity3d.player.UnityPlayer$e.run(com.unity3d.player.UnityPlayer$e)
    at UnityEngine.AndroidJNISafe.CheckException(UnityEngine.AndroidJNISafe)
    at UnityEngine.AndroidJavaObject._CallStatic(UnityEngine.AndroidJavaObject)
    at Crosstales.RTVoice.Provider.VoiceProviderAndroid+<SpeakNative>d__32.MoveNext(Crosstales.RTVoice.Provider.VoiceProviderAndroid+<SpeakNative>d__32)
    at UnityEngine.SetupCoroutine.InvokeMoveNext(UnityEngine.SetupCoroutine)

    thanks
    https://play.google.com/store/apps/details?id=com.app.QuizPatenteGold&hl=it
     
  24. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    That was helpful, thank you!
    I found a potential bug in the native library, which is now fixed; please send me your invoice and I give you access to the latest version.
     
  25. cabanel

    cabanel

    Joined:
    Sep 22, 2014
    Posts:
    66
    Can you give me your email?
    thanks
     
  26. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
  27. Ceromil

    Ceromil

    Joined:
    Apr 22, 2013
    Posts:
    7
    Hi Stefan,
    I can't open the "Tools/RT-Voice Pro/Configuration..." dialog on Unity 2019.3.0b6
    After clicking nothing happens, the window is not displayed and no log trace is displayed.
    The asset works in the demo scenes though.

    Could you help me with this?
     
  28. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    I just did a test with beta 10 of Unity 2019.3 and it works.
    Please update to the latest beta version and try it again, but be aware that only official production releases of Unity are supported by us.


    Cheers
    Stefan
     
  29. Ceromil

    Ceromil

    Joined:
    Apr 22, 2013
    Posts:
    7
    Thanks, seems to work now.
     
    Stefan-Laubenberger likes this.
  30. cel

    cel

    Joined:
    Feb 15, 2011
    Posts:
    43
    hi, i just bought rt-voice and i using playmaker. I'm a bit confused because i'm trying to find out when the speech has ended, also trying to get playmaker to list all available voices and i can't figure it out, Could you guys provide some help and maybe a little tutorial or demo?

    Thanks in advance
     
  31. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi cel

    There is an action called "GetVoices" which will return an array of all available voices for a provider.
    The "Speak"-action awaits the whole speech and sends the finish-event when it's done.

    So, the actions should already provide the things you're looking for; I hope this helps you further.


    Cheers
    Stefan
     
  32. aobjects

    aobjects

    Joined:
    Jan 16, 2016
    Posts:
    10
    Have you had any personal experience creating custom voices for MaryTTS? Or is there something better now?
     
  33. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    To be honest, I never created a voice with HMM for MaryTTS, but here is a tutorial:
    https://github.com/marytts/marytts/wiki/HMMVoiceCreation

    If you don't want to create a unique voice, there are imho much better sounding alternatives, like AWS Polly, Azure (Bing Speech) and Google Cloud Speech.
     
  34. cel

    cel

    Joined:
    Feb 15, 2011
    Posts:
    43
    Maybe a little tutorial or example on how to do the get voices method, I'm having some issues, can't get anything working in playmaker
     
  35. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hello again

    Yeah, your right, the "GetVoices"-action had a bug, which is now fixed.
    Please send us your invoice via email and you will get access to the latest version.


    So long
    Stefan
     
  36. joz_nascimento

    joz_nascimento

    Joined:
    Oct 24, 2017
    Posts:
    21
    Hi, I have several TTS Voices installed on my OS:
    voice_select.jpg
    But RT-Voice lists only 4:
    voice_list.jpg

    How can I get complete voice list?
     
  37. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Windows has two different TTS-systems, SAPI and the other is UWP (WSA).
    The screen you posted from the settings are all WSA voices. To access them, you have to build for WSA.
    The other option is installing more SAPI voices - details can be found in chapter 6 of the documentation:
    https://www.crosstales.com/media/data/assets/rtvoice/RTVoice-doc.pdf


    Cheers
    Stefan
     
  38. joz_nascimento

    joz_nascimento

    Joined:
    Oct 24, 2017
    Posts:
    21
    Thanks for the explanation.
     
    Stefan-Laubenberger likes this.
  39. joz_nascimento

    joz_nascimento

    Joined:
    Oct 24, 2017
    Posts:
    21
    Is possible generate files with filters?
     
  40. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    The audio files contain the settings of the TTS-system. E.g. if you changed the rate, the audio file will reflect it.
    But the audio files won't be affected by the Unity AudioSource, like pitch etc.
    This has to be applied during playback.

    I hope this helps you further.
     
  41. danbg

    danbg

    Joined:
    May 1, 2017
    Posts:
    36
    Hello Stefan, I wonder how to use Speaker.Pause and Speaker.Unpause to affect voice and also SpeakMarkedWordsWithUID.

    I'm using for Speaker.OnSpeakCurrentWord the method speakCurrentWordMethod and checking there for specific words to do some actions, but Speaker.Pause just pause the voice, and the words keep going on in speakCurrentWordMethod.

    Paralanguage could be used for inserting sounds, but I would like something more complex and perform other actions. Any tips? Could I use Stop or Silence and in some way use Play from a certain point and not only the beginning?

    Thanks
     
  42. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    It's not possible to pause the "SpeakMarkedWordsWithUID"-method without getting all the words.
    This is due the technical implementation under Windows. However, I would suggest another approach: instead of "Pause", use "Silence" and remember the last word. Then, call "SpeakMarkedWordsWithUID" with the rest of the text.
    Isn't that a possible way?

    We're currently extending "ParaLanguage" to trigger events (via callbacks). I think this should help you; if you like to get access to the latest version, please send me your invoice via email.


    Cheers
    Stefan
     
  43. danbg

    danbg

    Joined:
    May 1, 2017
    Posts:
    36
    Hi Stefan, right now I can't risk to install a new version of RT-voice. I had many problems in my project with another asset when I updated it. I will try the new version a bit later, because using ParaLanguage would need to change the way everything it's implemented right now.

    The use of Silence seems more feasible, but I wonder how could I remember the last word (an index or the word itself?) so I could call later SpeakMarkedWordsWithUID with just the rest of the text while preserving spoken text. I'm not sure how could I use Speaker.Play not from the beginning of the text, but from any other point. Maybe I could just create a substring and pass that one, but that would change the text shown, wouldn't it? MarkSpokenText seems to allow passing a wordindex, but not SpeakMarkedWordsWithUID.

    I'm checking the code and it seems that the easier way would be to create a substring, pass that to Speaker.Play, pass a new wrapper to SpeakMarkedWordsWithUID and then I have the problem, because MarkSpokenText would change the text and the already spoken text would disappear... Is there another way? I'd rather not change the original code of RT-Voice.

    Right now I'm showing the text while it's being spoken by the TTS using TextMeshPro and DoTween to reveal the text changing MaxVisibleCharacters and tweaking the speed to sync it with the TTS, but it would be great if I could reveal the text as it's being spoken using SpeakMarkedWordsWithUID combined with a fade per character in each word, or even better, using the phoneme and viseme to perform the reveal.

    One last question. MarkSpokenText could in theory apply a new change of material per word in TextMeshPro and that would enable to use UIEffect to create something better than just a fade (for example dissolve) or maybe using this http://digitalnativestudios.com/forum/index.php?topic=1182.msg8986 But could all those string changes cause a lot of garbage and performance issues?

    Thanks
     
  44. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hello again

    I made a script with three methods, "Speak", "Silence" and most importantly "PauseOrUnPause":
    Code (CSharp):
    1. using System.Text;
    2. using Crosstales.RTVoice;
    3. using Crosstales.RTVoice.Model;
    4. using Crosstales.RTVoice.Model.Enum;
    5. using Crosstales.RTVoice.Util;
    6. using UnityEngine;
    7. using UnityEngine.UI;
    8.  
    9. public class MarkWords : MonoBehaviour
    10. {
    11.     #region Variables
    12.  
    13.     public string Text = "This should be a long text that contains a lot of words.";
    14.  
    15.     public Text TextUI;
    16.  
    17.     private string uidSpeaker;
    18.     private Wrapper currentWrapper;
    19.     private string[] speechTextArray;
    20.     private int wordIndex;
    21.     private bool isCopied = false;
    22.     private bool isPaused = false;
    23.  
    24.     #endregion
    25.  
    26.  
    27.     #region MonoBehaviour methods
    28.  
    29.     public void Start()
    30.     {
    31.         TextUI.text = Text;
    32.     }
    33.  
    34.     public void OnEnable()
    35.     {
    36.         Speaker.OnSpeakAudioGenerationComplete += speakAudioGenerationCompleteMethod;
    37.         Speaker.OnSpeakCurrentWord += speakCurrentWordMethod;
    38.     }
    39.  
    40.     public void OnDisable()
    41.     {
    42.         Speaker.OnSpeakAudioGenerationComplete -= speakAudioGenerationCompleteMethod;
    43.         Speaker.OnSpeakCurrentWord -= speakCurrentWordMethod;
    44.     }
    45.  
    46.     #endregion
    47.  
    48.  
    49.     #region Public methods
    50.  
    51.     public void Speak()
    52.     {
    53.         wordIndex = 0;
    54.         isCopied = false;
    55.         isPaused = false;
    56.  
    57.         Silence();
    58.  
    59.         //Don't speak the text immediately
    60.         uidSpeaker = Speaker.Speak(Text, null, Speaker.VoiceForGender(Gender.MALE, "en"), false);
    61.     }
    62.  
    63.     public void Silence()
    64.     {
    65.         Speaker.Silence();
    66.     }
    67.  
    68.     public void PauseOrUnPause()
    69.     {
    70.         if (isPaused)
    71.         {
    72.             isPaused = false;
    73.             uidSpeaker = Speaker.Speak(getRest(), null, Speaker.VoiceForGender(Gender.MALE, "en"), false);
    74.         }
    75.         else
    76.         {
    77.             isPaused = true;
    78.             Speaker.Silence();
    79.         }
    80.     }
    81.  
    82.     #endregion
    83.  
    84.  
    85.     #region Private methods
    86.  
    87.     private string getRest()
    88.     {
    89.         StringBuilder result = new StringBuilder();
    90.  
    91.         for (int ii = wordIndex; ii < speechTextArray.Length; ii++)
    92.         {
    93.             result.Append(speechTextArray[ii]);
    94.             result.Append(" ");
    95.         }
    96.  
    97.         return result.ToString();
    98.     }
    99.  
    100.     private void speakAudio()
    101.     {
    102.         Speaker.SpeakMarkedWordsWithUID(currentWrapper);
    103.     }
    104.  
    105.     #endregion
    106.  
    107.  
    108.     #region Callback methods
    109.  
    110.     private void speakAudioGenerationCompleteMethod(Wrapper wrapper)
    111.     {
    112.         if (wrapper.Uid.Equals(uidSpeaker))
    113.         {
    114.             currentWrapper = wrapper;
    115.  
    116.             Invoke("speakAudio", 0.1f); //needs a small delay
    117.         }
    118.     }
    119.  
    120.     private void speakCurrentWordMethod(Wrapper wrapper, string[] _speechTextArray, int _wordIndex)
    121.     {
    122.         if (wrapper.Uid.Equals(uidSpeaker))
    123.         {
    124.             if (!isCopied)
    125.             {
    126.                 isCopied = true;
    127.                 speechTextArray = _speechTextArray;
    128.             }
    129.  
    130.             TextUI.text = Helper.MarkSpokenText(speechTextArray, wordIndex);
    131.             wordIndex++;
    132.         }
    133.     }
    134.  
    135.     #endregion
    136. }
    137.  
    It's a bit hacky but it works; I hope it is useful for you!

    About TMPro: I'm not an avid user and seldom use it... Therefore, try it out :)


    Cheers
    Stefan
     
  45. SreehariCA

    SreehariCA

    Joined:
    Oct 22, 2019
    Posts:
    3
    Hi Stefan,

    We are working in a project in Unity VR in Windows OS that uses the speech to text service in RT voice.

    It works fine in unity editor. When building and running the project as windows application , we are getting the below error :

    Error1.PNG

    I tried to build the speech scene available with the RT voice unity package, I am getting an error displaying : "No OS Voice found : TTS not possible"(Reference image below).

    Error2.PNG

    Tried with the windows demo provided in your forum, it works fine.
    I am using RT voice PRO 2.9.5 version.

    How can I overcome this?

    Thank you.
     
  46. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    The version 2.9.5 is from February 2018 and therefore no longer supported.
    Please use the latest version from the AssetStore.


    Cheers
    Stefan
     
  47. ReaperxOG

    ReaperxOG

    Joined:
    Nov 20, 2019
    Posts:
    2
    Does this happen to have support for mobile devices? Android and IOS?

    It lists support for them, but I want to make sure before I pull the trigger on it.
     
  48. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi

    Yes, RT-Voice supports iOS and Android.

    I hope this helps you further.


    Cheers
    Stefan
     
  49. higgins_matthew

    higgins_matthew

    Joined:
    Mar 31, 2017
    Posts:
    1
    Had a quick question that my search didn't pull up an answer to. Will this generate mp3s or wavs from the different tts engines for use across multiple platforms? Just wanted to confirm, it sounded like it did from the description.
     
  50. Stefan-Laubenberger

    Stefan-Laubenberger

    Joined:
    May 25, 2014
    Posts:
    1,418
    Hi Matthew

    Yes, RT-Voice can create audio files and you can use them for further processing.

    I hope this helps you further.


    Cheers
    Stefan
     
unityunity