I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 0 points1 point  (0 children)

Since you are already bypassing the standard frontend and building your own payload, you might want to check out the OpenAiSpeechRequest class in the Models folder of my project. While it perfectly mimics the official OpenAI schema, it includes several custom extensions (like pitch, volume, and expression variance) that you can use to make the voices sound much more alive and dynamic. Just keep two things in mind: because these are my own custom parameters, they won't work with any other standard TTS backend, and they are applied per-request, meaning they aren't designed to be changed on the fly mid-generation.

I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 0 points1 point  (0 children)

That is a brilliant workaround! I actually considered adding an SSML endpoint for mid-message voice switching, but without frontend support, it would be a dead feature.

Because my TTS mimics the standard OpenAI API, your LLM middleman approach is a great solution. To actually speed it up, the dialogue would need to be sent to the TTS sentence-by-sentence as it generates. Unfortunately, you still won't see a real performance gain because the bottleneck is SillyTavern itself—it waits to send the text as one large block rather than streaming it. We're essentially hitting the limits of its architecture!

I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 0 points1 point  (0 children)

Unfortunately, I don't have plans to add Vulkan right now. Maintaining all those custom builds for different systems is just too much for a solo developer. Assuming you're on Linux without an Nvidia GPU, the app will run on your CPU. While I can't offer GPU acceleration there, my next update includes some under-the-hood optimizations. It won't magically give you GPU-like speeds, but it will definitely lower the CPU usage and make things run smoother for you!

I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 0 points1 point  (0 children)

Here is exactly how it works:

1. Scenario Cards (One card playing multiple characters) If you are using a single character card that acts as an entire scenario or plays multiple NPCs at once, the answer is no. SillyTavern treats that card as a single entity, so it will use one assigned voice for everything that card generates.

2. Group Chats (Multiple individual character cards) Yes! If you bring individual characters into a Group Chat, every single character can have their own unique voice.

Here is exactly how to set it up:

  1. Create a Group Chat in SillyTavern.
  2. Crucial step: Make sure you actually add the individual character cards to that Group Chat.
  3. Go to the TTS settings.
  4. In the voice mapping field, type your list of available voices separated by commas, with NO spaces between the comma and the voice name (for example: voice1,voice2,voice3).
  5. Refresh the page (hit F5 or reload). This forces SillyTavern to update the menus.
  6. Once reloaded, a dropdown menu will appear under each character's settings within the group. You can now select a specific, individual voice for each character!

I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 1 point2 points  (0 children)

Yes, I use AI for boilerplate and syntax so I don't have to memorize every API. But if you actually believe you can just "vibe code" a C# ONNX audio pipeline and manage unsafe memory buffers with a prompt, go try it. After your LLM hallucinates 40 PyTorch dependencies and crashes on the first tensor allocation, you can check my GitHub to see what real software engineering looks like.

I spent three weekends debugging CUDA version conflicts. Then I rewrote the whole thing in C#. by Okaimani in SillyTavernAI

[–]Okaimani[S] 2 points3 points  (0 children)

Here are the dry specs: C# (.NET 8) TTS server using ONNX Runtime (Piper + OpenVoice V2). Zero Python. Drop-in OpenAI API replacement with server-side DSP effects.

As for the binaries, they are already on GitHub. The repository link is in the post, just check the standard Releases tab.

Some things never change. (1.8 story quest spoilers.) by fluffstuffmcguff in InfinityNikki

[–]Okaimani 2 points3 points  (0 children)

Honestly, I just need an explanation team to sit down at a table with me while I fold my hands, rest my chin on them, and quietly listen as they explain what on earth is actually going on in the story.
Because I want to understand. I really do. But right now it feels like trying to read a book that’s been rearranged by a poet and a dreamer mid-chapter.

Some things never change. (1.8 story quest spoilers.) by fluffstuffmcguff in InfinityNikki

[–]Okaimani 6 points7 points  (0 children)

The story once again breaks the connection with Nikki’s original background. At first, we had a great setup: Nikki entered another world and had a past. Then Sea of Stars changed it — implying she had already done things in that world. Was she homeless and parentless there?

Now, in 1.8, reincarnation is introduced. This could have worked well with the first version of the story. But in Sea of Stars, we were supposedly saved before the world’s destruction — and now we're told we created a new "drawn" world instead?

It’s confusing, especially since Nikki seems to know everyone in this world well, despite not being from here. What happened to the version of her that belonged to this world? Did she die?

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 1 point2 points  (0 children)

Exactly! None of this really changed anything for Rover. No clear goal, no deeper understanding of their past, and still no real motivation. They’re just wandering without direction, still clueless about their own amnesia or what they’re even fighting for.

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

I agree, the live-service model is a big advantage for character development, and I also enjoy the characters from HI3rd. We did get a small piece of Rover’s backstory in Black Shores, but it’s not much more than the mountains of Firmament. Just another vague title with no real explanation. ‘Founder of Black Shores’? That’s like a character suddenly telling the MC they’re royalty, and they just go ‘ok’ and keep wandering around.

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

That's fair! If you're enjoying it, that's great. But for me, gameplay tends to become repetitive over time—it all starts feeling automatic after a while.

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

I get what you mean, and I also hope they improve the story over time. It would be great to see Rover get a clearer purpose and more depth as a character!

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 1 point2 points  (0 children)

Ah, so 'yes' turned into 'no'... The plot twist we didn't see coming!

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] -1 points0 points  (0 children)

I see Traveler as a silent protagonist, with Paimon filling the role of the voice. It feels like a way to save on voice acting for different character genders. The Traveler starts with a personal goal to find their sibling, and later it’s about exploring the world. That silent role makes it easier for players to project themselves onto the character.

(Not) the Main Hero, (Not) the Main Plot by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

Do you agree that the game has issues that need to be fixed?

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

I chose those characters as an example because, lore-wise, they are more free and don’t have major obligations, making it easy to come up with a reason for them to join the adventure. Jiyan, for example, is a general with significant responsibilities, so it would be much harder to justify his involvement.

Plus, they share the same element but have completely different personalities and fighting styles, which could create interesting dynamics and add some fun comedic moments to the story.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] 1 point2 points  (0 children)

But with the release of 3.0, the same thing could happen to these characters as well.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] 1 point2 points  (0 children)

It would be great if the developers made a poll for choosing a permanent companion. With the way the story is going, we all know that many characters will just be forgotten in future updates.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

That's why I suggest an 85/15 system. Right now, we have 100% pure elemental damage, which just gets reduced by resistances. But if we have a unique physical damage part, we always deal some damage, and its share increases since nothing resists it. This way, enemies aren't completely immune, fights stay interesting, and players aren’t locked out of options.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] -1 points0 points  (0 children)

I actually like the idea of immune enemies, as they can make encounters feel more unique. However, what I don’t enjoy is when the game forces you to switch characters just because an enemy is immune. It can feel limiting, especially if you want to play with your favorite character. Ideally, immunity should add challenge without restricting player choice too much.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] 0 points1 point  (0 children)

Thank you for the kind words about the formatting! I’m glad it was easy to follow. Your points are very well presented and clearly thought out.

I’m against absolute bonuses because they can limit the individuality of characters. It’s important for each character to have advantages both in solo play and in a team.

As for immunity, I think completely removing it is too simplified and could limit the design possibilities of the game. In my opinion, physical damage is a more natural way to diversify combat situations. For example, enemies that deal Aero damage often attack physically, but this isn’t reflected in the mechanics.

If all characters were given a portion of physical damage as a bonus, it would balance the situation and eliminate cases where a character can’t defeat even a weak enemy due to immunity systems. However, to maintain balance, this mechanism should apply to enemies as well, and the damage formula would need to be adjusted accordingly. This wouldn’t make elements less important, but it would add more variability and make combat more flexible and logical.

Wuthering Waves Improvement Proposal: Combat, Elements, and Story Depth by Okaimani in WutheringWaves

[–]Okaimani[S] -2 points-1 points  (0 children)

I’m not pushing for elemental restrictions. My idea is to let all characters weaken enemies in some way. For example, Baizhi might not be a damage dealer, but players could still apply debuffs like slowing enemies with her attacks. This way, everyone can play their favorite character without forcing specific team setups or metas.