Skip to content

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

Description

@Mugenbushi

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

  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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions