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.<HandleTextEmit>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
- Select Fish Audio as the voice backend and authorize (succeeds)
- Create a preset, assign a voice model and model
- Confirm the Test button plays audio (it does)
- Trigger any NPC dialogue in game
- 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
- The preset lookup failure itself.
- 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.
Summary
Using the Fish Audio backend, every dialogue line throws an unhandled
InvalidOperationExceptionand 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
The backend is healthy — this is not a connectivity or credentials problem
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:
yoros2.1-pro-freeyoroyoroyoroPlayer Voices: "Use player voice presets" unchecked, table empty.
NPC Voices: "Use NPC voice presets" unchecked, table empty.
Steps to reproduce
What I've ruled out
TextToTalk.dbto force a rebuild — no changePossibly relevant: config and DB state
TextToTalk.jsoncontains preset fields that are all empty or zero, while presets appear to live inTextToTalk.db:(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.dbwas exactly 65,536 bytes and a raw byte scan foundLiteDBand_idbut zero occurrences ofPresetor 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 toUngenderedVoicePresetId = 0against an empty legacy collection while the UI reads from the DB.Two issues that may be separable
Happy to provide additional logs, dump any config state, or test a build.