Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.

SALSA Lipsync Suite - lip-sync, emote, head, eye, and eyelid control system.

Discussion in 'Assets and Asset Store' started by Crazy-Minnow-Studio, Apr 23, 2014.

  1. Roamer79

    Roamer79

    Joined:
    Oct 25, 2016
    Posts:
    45
    So let me get this straight. Salsa is UNABLE to work with the Unity animator because it constantly fights it in the LateUpdate loop. Is this correct? The documentation on this is sketchy to say the least.
     
  2. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    SALSA Suite is ABLE to work with the Unity animator as long as the two systems are not trying to animate the same thing during the same game loop. As you read in the documentation, SALSA Suite runs in the LateUpdate cycle to try to be the last one to update a component (blendshape, bone, etc.). If another system is animating the same component during the Update loop, SALSA Suite should successfully override the animation effects of the process external to SALSA Suite. However, if an external influence is operating during a loop on a different timing (i.e. the physics loop or a custom process), there will likely be visual conflicts because they are not operating on the same timing. There is no way around this. If there are conflicting animations, one system will win or they will fight. The solution is for the designer to eliminate the conflict.There can be only one. This is no different from any other Unity process, if two (or more) things are trying to affect some state, that state will have ambiguous results.

    D.

    (Edit 2022-09-19)
    Links to our documentation on how SALSA Suite works with conflicts on animated properties.
    https://crazyminnowstudio.com/docs/...ading/working-with-mecanim-other-influencers/
    https://crazyminnowstudio.com/docs/...-reading/queue-processor/#conflict-resolution
     
    Last edited: Sep 19, 2022
  3. kilik128

    kilik128

    Joined:
    Jul 15, 2013
    Posts:
    907
    someone got readyplayerme autosetup ? thank's
     
  4. Posey1

    Posey1

    Joined:
    Nov 18, 2018
    Posts:
    3
    Hello, I am using Salsa with a CC4 character and the one click setup was quick and easy, but when they talk the mouth isnt opening all the way and it looks pinched in the middle.Is there a way to fix this??
     
  5. wetcircuit

    wetcircuit

    Joined:
    Jul 17, 2012
    Posts:
    1,398
    Hi, i made a tutorial for CC4 showing how to bake the jaw and eye bones into the blend shapes. This will make your figures use just blend shapes, instead of blendshape+bones.

     
    Crazy-Minnow-Studio likes this.
  6. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello,
    It is possible that not all shapes were applied from the OneClick. Please send us an email with your pertinent info (invoice number, version numbers, os, etc.) and screenshots or video of your model hierarchy and your SALSA configuration. We are happy to help.

    D.
     
  7. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Thank you @wetcircuit for posting your video. Very informative and I'm sure will help budding CC users navigate the new system.

    I want to clarify some things about the video for SALSA Suite users. First, in her video, @wetcircuit is not using SALSA Suite to perform the animations. Her video is purely demonstrating CC4 usage examples. Second, when using her technique to bake bones to blendshapes, this will not be used for the CC4 OneClick. CC4 OneClick still uses bones for eyes and jaw. But you are free to modify the OneClick to use these new bakes if you like.

    Thanks again @wetcircuit !
    D.
     
    wetcircuit likes this.
  8. wetcircuit

    wetcircuit

    Joined:
    Jul 17, 2012
    Posts:
    1,398
    :eek: Sorry! definitely did not intend to confuse things… :confused:
    now, I realize what bad advice that was when the 1-click works differently….:(
     
    Crazy-Minnow-Studio likes this.
  9. bebou2000

    bebou2000

    Joined:
    Nov 12, 2017
    Posts:
    1
  10. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Absolutely no worries. We greatly appreciate your contributions to the forum and your video is very helpful to anyone using CC.
     
    wetcircuit likes this.
  11. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello,
    We recommend controlling the AudioSource directly or by using the SALSA reference to it:
    Code (CSharp):
    1. Salsa salsaRef;
    2. salsaRef.audioSrc.Play(); // Pause(), Stop(), etc.
    BTW, the code you referenced was for the legacy version of SALSA, which is why it did not work. Documentation for the current version is here: https://crazyminnowstudio.com/docs/salsa-lip-sync/modules/salsa/api/#references

    Hope that helps,
    D.
     
  12. hopkin_unity

    hopkin_unity

    Joined:
    Oct 12, 2017
    Posts:
    2
    Sorry for the noob question - I was hoping to fob this off on someone else but here I am. Let's assume I know very little about Unity, C# and CC4.
    I am trying to configure Salsa runtime on a CC4 model I created using the Headshot function. I can get a model working with OneClick but have been stuck configuring a new model using Salsa runtime from the BoxheadSalsaRuntime example code. It stops because my CC4 model lacks a SkinnedMeshRenderer. If I could get to a Salsa runtime "hello world" with my CC4 model I think I can work out the rest - is there some example code that could help me?
     
  13. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hi @hopkin_unity! If you haven't already, there is a lot of additional documentation with sample code in the Further Reading section of the documentation. https://crazyminnowstudio.com/docs/salsa-lip-sync/modules/further-reading/runtime-setup/

    If that doesn't get you where you need to be, start an email thread with us (assetsupport@crazyminnow.com) and include reference to this thread, your invoice number, and any other pertinent information. Probably some screenshots or video to show us what's going on. We will prob ask to see your runtime code, etc.

    Hope that helps, if not send us an email.
    Darrin
     
  14. altepTest

    altepTest

    Joined:
    Jul 5, 2012
    Posts:
    863
    that looks strange, it has to have that component, are you sure is not inside a prefab or something?
     
  15. Z0rank

    Z0rank

    Joined:
    May 1, 2020
    Posts:
    3
    Hello! I just recently purchased suite 2.5.4.125 and I am watching various video tutorials, and they are all showing the "wait for audioSource" option in the inspector. Yet, I don't see it anywhere. How do I get that option in my inspector?
     
  16. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    If you want it to wait for an AudioSource, remove any AudioSource linked in the inspector and if an AudioSource is on the GameObject, remove it as well and the option appears. But if you have an AudioSource linked, you don't need to wait. See: https://crazyminnowstudio.com/docs/salsa-lip-sync/modules/salsa/using/#references-section

    D.
     
    Z0rank likes this.
  17. Spikebor

    Spikebor

    Joined:
    May 30, 2019
    Posts:
    140
    Hi dev, I now want to use Salsa to make a talking Tom kind game, where it will listen to the mic and playback.
    So far so good. One problem is after playing the user talk, it continues to loop the animation.
    What I want to do for the flow is:
    - If mic catch some input -> start record
    - When input has less noise -> stop record -> start playback (but not loop after playing done)
    To achieve this function, which methods in your API should I look into?
    Thank you.
     
  18. Spikebor

    Spikebor

    Joined:
    May 30, 2019
    Posts:
    140
    Also I got a full list of visemes
    I don't know how to setup the values for them, because in your example it's easier to interpret them: say small < say medium < say large. But for those kind of unique visemes, can't apply same logic.
    Any tip to setup these ?

    upload_2022-10-31_15-19-31.png
     
  19. Spikebor

    Spikebor

    Joined:
    May 30, 2019
    Posts:
    140
    I use this code,
    It can ResetMic in a cooldown of 1 second and if clip donePlaying.

    When ResetMic() run (which will stop and start the mic, the mic should be started again), the Salsa system won't record new audio again. It will continuously play the last clip.
    How to fix this?

    Code (CSharp):
    1.     private void Update()
    2.     {
    3.      if (source.clip && tResetCooldown.isTicking == false) {
    4.             bool donePlaying = source.time >= source.clip.length - 0.1f;
    5.  
    6.             //check for clip playing done & not in cooldown, to reset mic
    7.             if ( donePlaying )
    8.             {
    9.                 Debug.LogFormat("reset mic because clip time {0} reach clip length {1}",
    10.                     source.time,source.clip.length);
    11.                 ResetMic();
    12.             }
    13.         }      
    14.     }
    15.  
    16.     void ResetMic() {
    17.         micInput.StopMicrophone(micInput.selectedMic); // stop the current microphone to reset SalsaMicInput.
    18.         micInput.StartMicrophone(micInput.selectedMic); // re-starts the current microphone..
    19.         Debug.LogFormat("Mic {0} reset.".ColorMe(kColor.purple), micInput.selectedMic);
    20.         tResetCooldown.Run();
    21.     }
     
  20. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Check out the online documentation for our configuration recommendations: https://crazyminnowstudio.com/docs/salsa-lip-sync/modules/recommendations/

    This is entirely subjective and you will want to choose viseme progression based on what looks good to your design tastes.

    D.
     
  21. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    MicInput does not have an API function to detect talking. It does leverage the Unity Microphone class API, so you can roll your own to your specifications. Microphone does create an AudioSource.AudioClip, but it is different from a normal clip -- it is a circular buffer of n seconds and does not stop until you call Microphone.Stop or use our SalsaMicInput.StopMicrophone. The problem with this is, if you stop the microphone, you cannot detect whether someone is speaking or not. So, you'll need to leave the microphone running to do that and just disconnect it from SALSA (or disable SALSA) when you don't think anyone is talking.

    Keep in mind, since the microphone AudioClip is a circular buffer, if anything gets out of whack with your microphone or the Unity Microphone implementation (i.e. application focus is not properly handled and mic recording is interrupted, but the buffer pointer keeps moving) you might get misaligned with the Microphone recording pointer and that can cause some weird issues where SALSA is animating movement where there is no sound -- because the clip is revolving and new sound is not being recorded but previous sound is repeating in the buffer.

    Since the buffer is circular, your example code looks to be simply resetting the microphone after each revolution-ish. You will need to analyze the data in the buffer and see if it is below a certain threshold for your situation and if it is, stop SALSA (or use whatever method you prefer to disconnect SALSA from the clip). And start it back up when you detect sound. I personally don't think this is will work all that well since there is an inherent lag in starting the microphone and waiting for sufficient samples to begin playing the AudioSource.

    Consider the focus issue and see if that is what is causing your lips-moving-with-no-voice issue. Also remember a microphone may pick up ambient sounds and SALSA doesn't know those sounds are not the voice.

    Hope that helps, good luck with your project,
    D.
     
    Spikebor likes this.
  22. Spikebor

    Spikebor

    Joined:
    May 30, 2019
    Posts:
    140
    Thank you very much!
    So we don't stop microphone ever (to detect talking).
    My current problem is recording and playback is in the same loop.
    This mean while user talking, it records and also play, and while doing that it record user talking AND it's own playback, result in echo.
    My intent loop will be using these events:
    -Salsa.StartedSalsaing meaning user is Talking : will start recording.
    -Salsa.StoppedSalsaing meaning user done Talking : will start playback.

    After laying out the idea, my problem only is these two:
    1) which method to Start Recording?
    2) which method to Start Playback?
    Hope you can point out those two, with that I think I can solve this problem, thank you again!
     
  23. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    As far as I can think, the only way this can happen is if you are playing the clip (through speakers) as you are recording it. You'd want to mute playback to avoid this. Or playback through headphones that the microphone cannot pick up. Another way would be to add the recording sample data to the clip data instead of overwriting it, which would also create an echo.

    If you want to record, then playback separately, you don't need SalsaMicInput. You can write your own microphone script that records the input to a file or buffer and then funnel that to SALSA separately. SalsaMicInput starts playback after it starts the microphone and appropriately waits for a minimal amount of samples to accumulate. You cannot do what you are asking, start recording, then separately start playback with SalsaMicInput. You could modify it to do that. But you might as well create a new script to do it. Just remember if you don't create your own buffer to hold the data, you will overwrite your microphone buffer as it circles around.

    D.
     
    Spikebor likes this.
  24. Spikebor

    Spikebor

    Joined:
    May 30, 2019
    Posts:
    140
    Thank you again, you rocks!
     
  25. Georgi022

    Georgi022

    Joined:
    Jul 22, 2022
    Posts:
    8
    Dear Crazy-Minnow-Studio,

    I've recently purchased the SALSA tool and I have an issue where the I'm trying to go through a OneClick setup for my character, which was exported with CC3 plus, but I keep getting errors, regardless of the configuration I try. More specifically, the error I get is:

    This object does not have the required components. Could not find the referenced SMRs. Ensure the appropriate one-click was used for your model type and generation. ^CC_(base|game)_Body$ ^genesis([238])?(fe)?(male)?\.shape.*$ ^genesis[238](fe)?maleeyelashes\.shape.*$ ^emotiguy.*\.shape.*$
    UnityEngine.Debug:LogError (object)
    CrazyMinnow.SALSA.OneClicks.OneClickBase:FindSkinnedMeshRenderers (CrazyMinnow.SALSA.OneClicks.OneClickConfiguration) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Plugins/OneClickRuntimes/OneClickBase.cs:282)
    CrazyMinnow.SALSA.OneClicks.OneClickBase:DoOneClickiness (UnityEngine.GameObject,UnityEngine.AudioClip) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Plugins/OneClickRuntimes/OneClickBase.cs:230)
    CrazyMinnow.SALSA.OneClicks.OneClickCC3:Setup (UnityEngine.GameObject,UnityEngine.AudioClip) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Plugins/OneClickRuntimes/OneClickCC3.cs:254)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor:ApplyOneClick (UnityEngine.GameObject) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:119)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor:OneClickSetup () (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:110)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor:OneClickSetup_CC3 () (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:83)

    ... and also this:

    NullReferenceException: Object reference not set to an instance of an object
    CrazyMinnow.SALSA.OneClicks.OneClickCC3.Setup (UnityEngine.GameObject gameObject, UnityEngine.AudioClip clip) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Plugins/OneClickRuntimes/OneClickCC3.cs:265)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor.ApplyOneClick (UnityEngine.GameObject go) (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:119)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor.OneClickSetup () (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:110)
    CrazyMinnow.SALSA.OneClicks.OneClickCCEditor.OneClickSetup_CC3 () (at Assets/Plugins/Crazy Minnow Studio/SALSA LipSync/Editor/OneClicks/OneClickCCEditor.cs:83)

    My Unity version is 2021.3.10f1, my SALSA version is 2.5.4 and I have imported one click base 2.5.0.2 and OneClick Reallusion CC v2.6.0 (beta).
    I have tried adding the OneClick to either of the marked with red parts of my character model, but to no avail (see character_hierarchy_view.png).
    Please let me know what I'm doing wrong or if you need any more information on the issue.
    Thanks in advance and sorry if this is not the right place to ask this question!
     

    Attached Files:

  26. MichaelPickering

    MichaelPickering

    Joined:
    Oct 11, 2017
    Posts:
    13
    Greetings! I've been using SALSA with CC characters for some time, and just got back to setting up a character that I imported from some CC3+ release a while ago. It mostly worked, after I switched the bone setup to use the "CC_Base_JawRoot" bone instead of the "CC_Base_Teeth02" bone for opening the mouth. Now I just have one problem left, which is that the mouth hangs half open whenever the character isn't speaking (including during pauses in speech).
    FWIW, there's been a lot of change in CC lately, and I did use a very recent Unity AutoSetup tool as part of my import, although the export from CC3+ was done some time ago -- and I don't remember exactly which version of CC it was exported from, although it definitely wasn't CC4. I did use your CC3 SALSA setup script.
    I do have some other animations running on the character, but I already removed all the components that affect any of the head/jaw/neck/eye movements.
    I guess most likely the initial model rig is somehow setup with the character's mouth half open, but how can I fix that without messing up the SALSA mouth/jaw setup for all the visemes that use the bone animation for mouth opening (which is all of them, I believe)?
     
  27. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello @MichaelPickering, in the past, every time we have seen an issue with the jaw hanging open it has to do with the jaw mapping in the model's avatar configuration. We recommend setting the jaw slot to 'none'. Have you already done this?
    upload_2022-11-28_10-34-42.png

    D.
     
  28. unity_D41F8FA4BABDF4DD75FE

    unity_D41F8FA4BABDF4DD75FE

    Joined:
    Jul 26, 2022
    Posts:
    1
    Hi, how can i resolve this console error?

    Error: Could not load signature of CrazyMinnow.SALSA.UguiController:.ctor due to: Could not load file or assembly 'UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. assembly:UnityEngine.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null type:<unknown type> member:(null) signature:<none>
     
  29. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, this isn't a SALSA Suite error. SALSA Suite uses the UnityEngine.UI and it cannot find it in your project. Usually this happens when the project has had a Unity upgrade or similar event. You could try closing Unity and reopening it or restoring your project from backup and trying the upgrade again.

    D.
     
  30. jorgeolothar

    jorgeolothar

    Joined:
    Mar 27, 2016
    Posts:
    23
    Is it possible to reset an individual `ExpressionComponent`s contribution to zero while the emotion is running?

    I have a 'fear' emotion with an open mouth, but it doesn't look well while the character is talking (in fear/surprised). I've been able to disable the individual mouth components before calling the expression; the talking goes well, but the jaw-dropping is lost. So ideally: fear w/open mouth -> wait with open mouth -> talk with regular mouth -> complete. Any feedback would be appreciated!
     
  31. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, you can manually turn on/off any emote you wish. Please reference the online docs here:
    https://crazyminnowstudio.com/docs/salsa-lip-sync/modules/emoter/api/#manually-triggering-an-emote

    Example from docs:
    line 3: Turn on
    line 5: Turn off

    Code (CSharp):
    1. Emoter emoter;
    2. // turn emote "your emote name" ON
    3. emoter.ManualEmote("your emote name", ExpressionComponent.ExpressionHandler.OneWay);
    4. // turn emote "your emote name" OFF, the 0f time is arbitrary and does not matter.
    5. emoter.ManualEmote("your emote name", ExpressionComponent.ExpressionHandler.OneWay, 0f, false);
    D.
     
  32. jorgeolothar

    jorgeolothar

    Joined:
    Mar 27, 2016
    Posts:
    23
    Yes, I have been doing this. I was hoping I didn't have to make two very similar emotes "surprised" and "surprised without mouth open" to make lipsync work better. It seems that's the way to go.

    Thanks!
     
  33. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Ah, sorry, I completely missed the mouth-open part of that scenario. Yes, that's not possible, basically because your surprise with mouth open will be the fall-back after SALSA quits and in-between (silence) sections and will blend with normal visemes. You don't need to make a surprise with mouth open blendshape tho, you can combine a regular surprise with a mouth open shape to achieve the same/similar thing. Although, you still wouldn't want to have a mouth-open emote active while lipsyncing unless it was cancelled out by SALSA. Which you could possibly do by creating your surprise emote with mouth closed and adding a mouth open to it in EmoteR. Then in all of your SALSA visemes, you could have that same mouth open as a closed component of each viseme. The mouth open should come back when SALSA is finished or during silence in that instance. Just make sure your SALSA configuration is not set for persistent operation. I think that should work.

    D.
     
  34. AdrianGTR

    AdrianGTR

    Joined:
    Jan 6, 2021
    Posts:
    3
    Hi! I'm using Salsa 2.5.4 and I tried "One-Click", which worked really fine with a DAZ model.

    I put an Audio Source with one MP3 Audio (and then did it also with WAV) and when I try the scene in the "Play mode", everything works perfectly, but when I build it in WebGL, I got that error in Chrome Console:

    "CompilationName.framework.js:2 Cannot get data on compressed samples for audio clip "NameOfTheWav". Changing the load type to DecompressOnLoad on the audio clip will fix this."

    NB: The audio sounds, but the character is not moving the lips.

    I tried all the types on the audio clip (even default was in DecompressOnLoad).

    When I deactivate all the Salsa Components and I build it again (WebGL), the audio sounds and I got no error message in the console.

    Any idea on how to solve that problem, please?

    Unity 2020.3.10f1

    Thanks!
     
  35. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, you didn't mention what are you using to feed data to SALSA in WebGL. Amplitude?

    D.
     
  36. AdrianGTR

    AdrianGTR

    Joined:
    Jan 6, 2021
    Posts:
    3
    Thanks for your answer... I don't really know what is Amplitude, sorry.

    I just pressed "One Click", which I suppose did all the work, put an "Audio Source" (standard from Unity) with the MP3/WAV and saw that everything went well in play mode (NOT in WebGL). And I'm sure it has to do somehow with SALSA, because when I use the "Audio Source" with no Salsa, there is sound and no error message appears in the console.

    May I use Amplitude? What is it for (will look for it).

    Thanks,

    A.
     
  37. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Ahh, OK, that makes more sense. As mentioned on the Asset Store page, SALSA does not work natively with WebGL. Unity does not support audio data analysis nor provide access to the audio data in WebGL and SALSA requires access to be able to analyze the data. SALSA can also consume analysis data from other sources. We have a separate product called Amplitude for WebGL that provides a way for SALSA to get audio analysis. Or you may use another if you wish, but we do not provide support other products. Before you purchase Amplitude, please read the store page and the online documentation to make sure it will be useful in your scenario. There are currently some known issues with Amplitude and some newer versions of Unity (see the Amplitude forum thread) where the development of Unity breaks Amplitude and fixes and breaks again as they develop.

    Hope that helps,
    D.
     
    AdrianGTR likes this.
  38. Fangh

    Fangh

    Joined:
    Apr 19, 2013
    Posts:
    194
    Hello. My character has this list of phonem :
    upload_2022-12-19_15-47-19.png
    upload_2022-12-19_15-47-31.png

    And there is no sign of "small_say", "medium say" and "large say".

    How can I plug Salsa to AA / E / I / O / U / MM / PP / CH / SS / DD / kk phonems ?

    EDIT : uLipSync is a phonem mapper : https://github.com/hecomi/uLipSync
     
    Last edited: Dec 20, 2022
  39. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, we have a whole series of video tutorials and written documentation detailing how to use SALSA Suite. You can check them out here:
    https://crazyminnowstudio.com/docs/salsa-lip-sync/
    https://www.youtube.com/@CrazyMinnowStudioVideos/playlists

    Good luck on your project!
    D
     
  40. Fangh

    Fangh

    Joined:
    Apr 19, 2013
    Posts:
    194
    I already watched the tutorials but it seems that the audio only use a curve or linear between all viseme. So it's like "from low opening mouth" to "large opening mouth".
    It seems that there is no way to plug "O" sounds to the viseme_O or "A" sounds to the viseme_A.

    Am I correct ?
     
  41. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    That is correct. SALSA is not a phoneme mapper.

    D
     
    Fangh likes this.
  42. GawebStudio

    GawebStudio

    Joined:
    Aug 14, 2017
    Posts:
    11
    Hi, I've purchased your asset some time ago and finally got to give it a shot in a project of mine but for some reason, I get the following error after spawning an NPC with the script attached to it:
    Code (CSharp):
    1. NullReferenceException: Object reference not set to an instance of an object
    2. CrazyMinnow.SALSA.Eyes.EnableEye (System.Boolean status) (at <5ec39241835448e59f9889e1a8f3b76b>:0)
    My characters are loaded from a prefab with Salsa already preconfigured on them so I'm not sure what null value triggers the error. I thought it might come from the look at target which is null so I added a condition to skip the EnableEye function if the look at target is null but then, I get this error instead:
    Code (CSharp):
    1. NullReferenceException: Object reference not set to an instance of an object
    2. CrazyMinnow.SALSA.QueueProcessor.Register (CrazyMinnow.SALSA.ExpressionComponent expressionComponent, System.Boolean isActivating, System.Single frac) (at <5ec39241835448e59f9889e1a8f3b76b>:0)
    3. CrazyMinnow.SALSA.Eyes.EnableEyelidBlink (System.Boolean status) (at <5ec39241835448e59f9889e1a8f3b76b>:0)
    This time on the blinking function? I fail to see what is not initialized properly. Is there a specific loading script order for Salsa to work properly?
    And this bug only occurs when I try to load an NPC after the player click on a specific UI icon. Initially, I also load NPCs right after the player enters a room and those NPCs work fine with Salsa, no error and I can switch their look at target. But when the player click an icon which spawns more NPCs, I get this error. So I'm pretty sure my NPC prefab should be OK but maybe there's some mix up in the initialization process somewhere?
    Any ideas how to fix this problem?
    Best regards
     
  43. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, please send us an email with your invoice number and version numbers of SALSA, Unity, OS, etc. If you can also please reference this post to ensure we have the correct person. We will do our best to help you sort this out.

    Thanks!
    D
     
  44. Michal_Stangel

    Michal_Stangel

    Joined:
    Apr 17, 2017
    Posts:
    123
    Hello,
    I use DAZ 8 and in OnClick script there are comments for some Visimes that it's "Gen 3".
    But i have these blendshapes in mesh renderer so they are added too into Visimes. Is it correct for proper functioning or should I avoid those by uncommenting them in OneClick or removing from mesh renderer?
    Example is in enclosure.
     

    Attached Files:

  45. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello and great question. The answer is yes, they are fine in your configuration. To be honest, I'm not sure why I commented those with 'gen3'. I think that is holdover from an earlier version. I know I did a lot of cleanup and updating of the DAZ OneClick when I added gen8.1 support -- and possibly left some old commenting in place. The 'emotiguy' comments are correct and *should* only apply to the emotiguy character if used on him. I checked against the gen8 and gen3 and it all looks good.

    Two key things to remember:
    1) These OneClicks are meant as a generic starting point. Feel free to modify them if you want a different look/feel for your character models.
    2) The 'phoneme' designator for the viseme component is purely a name and doesn't mean anything else. SALSA isn't a phoneme mapper as everyone knows, so the name doesn't mean anything except a rudimentary designation to refer to. The real key thing is the progressive dynamics of the viseme layout.

    Hope that helps!
    D.
     
  46. Michal_Stangel

    Michal_Stangel

    Joined:
    Apr 17, 2017
    Posts:
    123
    Thanks!
    I've copied most of the stuff from Onclick to my script and will adapt it to my scenario. My DAZ characters are heavily modified by Blender script (like separated meshes) and I also instantiate some character parts runtime, like eyelashes or beards. But I guess it will work :)
     
  47. Michal_Stangel

    Michal_Stangel

    Joined:
    Apr 17, 2017
    Posts:
    123
    Hi, I ran into similar problem somebody mentioned here.
    When I call eyes.Initialize(); runtime (or in editor), it generates this error:

    NullReferenceException
    CrazyMinnow.SALSA.Eyes.DestroyProcTransOffsetGizmos (System.Collections.Generic.List`1[CrazyMinnow.SALSA.ProcTransOffset]& list) (at <5ec39241835448e59f9889e1a8f3b76b>:0)
    CrazyMinnow.SALSA.Eyes.Initialize () (at <5ec39241835448e59f9889e1a8f3b76b>:0)

    Because I have eyelashes as a separate prefab which is instantiated runtime I skip configuring them on character prefab and let these parts orange in inspector. And once eyelashes are instantiated I call this script to reference them in Salsa's Eyes part:

    Code (CSharp):
    1.       Eyes eyes = salsaFolder.GetComponent<Eyes>();
    2.  
    3.             // Take blink max value form eyes
    4.             float blinkMax = eyes.blinklids[0].expData.controllerVars[0].maxShape;
    5.  
    6.             List<SkinnedMeshRenderer> expressionsMeshRenderers;
    7.             if (objectType == ACore_DazManager.ObjectType.GameModel)
    8.                 expressionsMeshRenderers = characterInfo.expressionsMeshRenderers;
    9.             else
    10.                 expressionsMeshRenderers = characterInfo.uniqueCharacter.UImodel_expressionsMeshRenderers;
    11.  
    12.             SkinnedMeshRenderer SMR = FindSkinnedMeshRendererOnCharacter(expressionsMeshRenderers, "DAZmesh_Figure_Eyelashes");
    13.             if (SMR == null)
    14.             {
    15.                 Log.L("SkinnedMeshRenderer is null for eyelashes, we cannot set Salsa properly: " + characterInfo.unityName, Log.Type.Error);
    16.                 return;
    17.             }
    18.  
    19.             // Left upper eyelash          
    20.             eyes.blinklids[2].expData.controllerVars[0].smr = SMR;
    21.             eyes.blinklids[2].expData.controllerVars[0].blendIndex = ACore_Blendshapes.GetBlendshapeIndexOnCharacter(characterInfo, SMR, blendshapeName: "Left Eye Closed"); // eyelidtopL
    22.             eyes.blinklids[2].expData.controllerVars[0].maxShape = blinkMax;
    23.             eyes.blinklids[2].expData.name = "eyelashL";
    24.            
    25.             // Right upper eyelash
    26.             eyes.blinklids[3].expData.controllerVars[0].smr = SMR;
    27.             eyes.blinklids[3].expData.controllerVars[0].blendIndex = ACore_Blendshapes.GetBlendshapeIndexOnCharacter(characterInfo, SMR, blendshapeName: "Right Eye Closed"); // eyelidtopR
    28.             eyes.blinklids[3].expData.controllerVars[0].maxShape = blinkMax;
    29.             eyes.blinklids[3].expData.name = "eyelashR";
    30.  
    31.             // Tracklids
    32.             eyes.CopyBlinkToTrack();
    33.             eyes.tracklids[0].referenceIdx = 0; // left eye
    34.             eyes.tracklids[1].referenceIdx = 1; // right eye
    35.             eyes.tracklids[2].referenceIdx = 0; // left eye
    36.             eyes.tracklids[3].referenceIdx = 1; // right eye
    37.  
    38.  
    39.             // Initialize the Eyes module
    40.  
    41.             // Controller initialization, update any runtime controllers we plan to use
    42.             eyes.UpdateRuntimeExpressionControllers(ref eyes.heads);
    43.             eyes.UpdateRuntimeExpressionControllers(ref eyes.eyes);
    44.             eyes.UpdateRuntimeExpressionControllers(ref eyes.blinklids);
    45.             // Initialize the Eyes module last. This builds the reference gizmos, captures offsets, sets timers, etc.
    46.             eyes.Initialize();
    It seems to be configured fine, everything in inspector is blue, when I click on Generate it blinks (sreenshot is in enclosure). But it fails in DestroyProcTransOffsetGizmos method.

    I also tried to complete setup in editor by referencing eyes mesh in eyelashes spots, so everything is blue. But eyes.Initialize() at the end of editor script still fails.
    Maybe it is non-standard character structure, different from default DAZ?

    Using Unity 2022.1.2
     

    Attached Files:

  48. Crazy-Minnow-Studio

    Crazy-Minnow-Studio

    Joined:
    Mar 22, 2014
    Posts:
    1,304
    Hello, I don't think it's the DAZ model -- you would get errors when applying the OneClick if that were the case (the OneClick would tell you if it couldn't find the appropriate parts. But what does stick out is the orange headings which are not configured, when you start/run the scene, Eyes will throw errors because it's not completely configured. You would need to minimally configure the model and then add the eyelashes after startup.

    For example, to add another component to the Blink configuration, you would:
    Code (CSharp):
    1. // add a new component to the 0 index (first 'blink eye") config
    2. eyes.AddComponent(ref eyes.blinklids, 0, ExpressionComponent.ExpressionType.Blink, ExpressionComponent.ControlType.Shape, true, false, false);
    3. comIdx = eyes.blinklids[0].expData.components.Count - 1; //cache the index of the new component
    4. eyes.blinklids[0].expData.components[comIdx].directionType = ExpressionComponent.DirectionType.None;
    5. eyes.blinklids[0].expData.controllerVars[comIdx].smr = SMR;
    6. eyes.blinklids[0].expData.controllerVars[comIdx].blendIndex = Eyes.FindBlendIndex(SMR, "Left Eye Closed");
    7. eyes.blinklids[0].expData.controllerVars[comIdx].maxShape = 0.10f; //set the max value
    8. eyes.blinklids[0].expData.components[comIdx].durationOn = .15f; //specify a duration
    Does that make sense? Depending on how many 'eye' configurations you have for blinking, you add appropriate components for appropriate 'eyes'. For a second 'eye', you'd use:
    Code (CSharp):
    1. eyes.AddComponent(ref eyes.blinklids, 1, ExpressionComponent.ExpressionType.Blink, ExpressionComponent.ControlType.Shape, true, false, false);
    2. comIdx = eyes.blinklids[1].expData.components.Count - 1; //cache the index of the new component
    3. eyes.blinklids[1].expData.controllerVars[comIdx].smr = SMR;
    4. // etc...
    You can add as many components as you wish to each 'eye' configuration.

    Tracklids are similar:
    Code (CSharp):
    1. eyes.AddComponent(ref eyes.tracklids, 0, ExpressionComponent.ExpressionType.Eyelid, ExpressionComponent.ControlType.Shape, true, false, false);
    2. // etc...
    Hope that helps!

    D.
     
  49. CommunityUS

    CommunityUS

    Joined:
    Sep 2, 2011
    Posts:
    239
    Code (CSharp):
    1. Array index (-1) is out of bounds (size=46)
    2. UnityEngine.StackTraceUtility:ExtractStackTrace ()
    3. CrazyMinnow.SALSA.ShapeController:SetLerp (single,bool)
    4. CrazyMinnow.SALSA.QueueProcessor:ProcessQueue (System.Collections.Generic.List`1<CrazyMinnow.SALSA.QueueData>,int)
    5. CrazyMinnow.SALSA.QueueProcessor:LateUpdate ()
    I have a custom model working but the console is spammed with this error. Promo voice working with one click setup aside from error above.

    Same issue here: SALSA Lipsync Suite - lip-sync, emote, head, eye, and eyelid control system. | Page 45 - Unity Forum
    And here: SALSA Lipsync Suite - lip-sync, emote, head, eye, and eyelid control system. | Page 42 - Unity Forum

    What would be nice is information about how I would troubleshoot this. What sections of the components cause this?
     
    Last edited: Jan 9, 2023
  50. CommunityUS

    CommunityUS

    Joined:
    Sep 2, 2011
    Posts:
    239
    Update: Checking the box under:
    TimeScale:
    Ignore Scaled Time (experimental)
    Fixed my issue for now.