karashiiro / karashiiro/TextToTalk

Fish Audio: "Failed to get voice preset for backend" on every text emit, with all preset slots populated (Test button works)

Open
#292 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
75
Forks
36
Avg merge
3d 10h
Merged PRs (30d)
3

Description

**Summary**

Using the Fish Audio backend, every dialogue line throws an unhandled `InvalidOperationException` and no audio plays in game. The backend itself is fully functional: authorization succeeds, and the **Test** button synthesizes correctly and bills against my Fish Audio credit. Only the speaker → preset resolution fails.

Critically, this occurs with **every gender preset slot populated with the same valid preset**. There does not appear to be a configuration state that satisfies this code path.

The failure is silent in game — no in-game error, no UI warning. The config window displays a valid preset the whole time. It's only visible in the Dalamud console.

Running the latest stable TextToTalk on the latest stable Dalamud.

**Stack trace**

```
[TextToTalk] GameObject is null; cannot check gender
[TextToTalk] Failed to handle text emit event
System.InvalidOperationException: Failed to get voice preset for backend.
at TextToTalk.TextToTalk.GetVoiceForSpeaker(String name, Gender gender) in K:/arashiiro/TextToTalk.cs:line 560
at TextToTalk.TextToTalk.GetVoicePreset(IGameObject speaker, String speakerName) in K:/arashiiro/TextToTalk.cs:line 533
at TextToTalk.TextToTalk.Say(IGameObject speaker, SeString speakerName, Nullable`1 chatType, String textValue, String rawText, ...)
at TextToTalk.TextToTalk.<>c__DisplayClass42_0.b__4() in K:/arashiiro/TextToTalk.cs:line 260
at TextToTalk.Utils.FunctionalUtils.RunSafely(Action fn, Action`1 onFail) in K:/arashiiro/Utils/FunctionalUtils.cs:line 12
```

**The backend is healthy — this is not a connectivity or credentials problem**

```
[TextToTalk] Testing Fish Audio authorization status
[TextToTalk] Fish Audio authorization successful
```

My Fish Audio API credit decrements when I press **Test** (observed 29.9973 → 29.99649 over the course of testing), confirming that synthesis requests reach Fish Audio and return audio successfully. The preset object is valid and reachable from the config UI.

**Current configuration**

Synthesizer Settings:
- Voice backend: Fish Audio
- Preset: `yoro`
- Voice: one of my own Fish Audio voice models
- Model: `s2.1-pro-free`
- Latency: normal
- Use gendered voices: **checked**
- Ungendered preset(s): `yoro`
- Male preset(s): `yoro`
- Female preset(s): `yoro`

Player Voices: "Use player voice presets" unchecked, table empty.
NPC Voices: "Use NPC voice presets" unchecked, table empty.

**Steps to reproduce**

1. Select Fish Audio as the voice backend and authorize (succeeds)
2. Create a preset, assign a voice model and model
3. Confirm the **Test** button plays audio (it does)
4. Trigger any NPC dialogue in game
5. No audio plays; the above exception appears in the Dalamud console

**What I've ruled out**

- Creating a fresh preset from scratch — no change
- Gendered voices **off**, single default preset — no change
- Gendered voices **on**, with Ungendered, Male, and Female slots ALL set to the same valid preset — no change. This is the key result: the exception fires with every slot populated, so it isn't an empty-slot fallback problem.
- Disabling player voice presets and NPC voice presets (both unchecked, both tables empty) — no change
- Switching backend to System, saving, reopening, switching back to Fish Audio — no change
- Renaming `TextToTalk.db` to force a rebuild — no change
- OneDrive / redirected folder interference — not applicable, standard install on the main drive

**Possibly relevant: config and DB state**

`TextToTalk.json` contains preset fields that are all empty or zero, while presets appear to live in `TextToTalk.db`:

```
VoicePresets : (empty)
CurrentVoicePresetId : 0
UngenderedVoicePresetId : 0
MaleVoicePresetId : 0
FemaleVoicePresetId : 0
PlayerVoicePresets : (empty)
NpcVoicePresets : (empty)
CurrentPresetId : 0
UseGenderedVoicePresets : False
UsePlayerVoicePresets : True
UseNpcVoicePresets : True
Backend : 10
```

(This dump was taken earlier in testing, before I changed the gendered/player/NPC toggles — the boolean values above are stale, the preset collections and IDs are not.)

Additionally, the original `TextToTalk.db` was exactly 65,536 bytes and a raw byte scan found `LiteDB` and `_id` but **zero** occurrences of `Preset` or my preset name — i.e. no preset collection existed in it at all, despite the UI showing a configured preset. I don't know whether these legacy JSON fields are still read anywhere, but flagging in case the lookup falls back to `UngenderedVoicePresetId = 0` against an empty legacy collection while the UI reads from the DB.

**Two issues that may be separable**

1. The preset lookup failure itself.
2. Regardless of the cause of (1): the exception is unhandled and produces no user-facing signal. The config window shows a valid preset, the Test button works, and dialogue silently does nothing. A warning in the UI would have made this diagnosable without opening the console.

Happy to provide additional logs, dump any config state, or test a build.

Contributor guide

Open the contributing guide

Research direction

Start in TextToTalk.cs at GetVoicePreset, GetVoiceForSpeaker, and HandleTextEmit, then compare the dialogue path with the Fish Audio authorization and Test-button path. Check how preset IDs and gender settings are loaded and resolved, including the database-backed configuration. Done means NPC dialogue synthesizes successfully with the reported configuration and lookup failures no longer disappear without a user-facing signal.

Written by the indexing model from the issue text.

Assessment

Tech stack
csharp
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.