moeru-ai/airi · warning

[Speech Pipeline] OpenAI Compatible: No voice in provider co

Error message

[Speech Pipeline] OpenAI Compatible: No voice in provider config, using default

What it means

For the openai-compatible-audio-speech provider, Stage.vue builds the voice object from providerConfig.voice. When it is unset, it synthesizes a default 'alloy' voice record (id/name 'alloy') and warns. On non-OpenAI endpoints without an 'alloy' voice the later synthesis call fails at the API level.

Source

Thrown at packages/stage-ui/src/components/scenes/Stage.vue:500

          description: providerConfig.voice as string,
          previewURL: '',
          languages: [{ code: 'en', title: 'English' }],
          provider: activeSpeechProvider.value,
          gender: 'neutral',
        }
      }
      else {
        // Fallback to default if not in provider config
        voice = {
          id: 'alloy',
          name: 'alloy',
          description: 'alloy',
          previewURL: '',
          languages: [{ code: 'en', title: 'English' }],
          provider: activeSpeechProvider.value,
          gender: 'neutral',
        }
        console.warn('[Speech Pipeline] OpenAI Compatible: No voice in provider config, using default', { providerConfig })
      }
    }

    if (!model || !voice)
      return null

    try {
      const speechRequest = speechStore.resolveSpeechInput({
        text: request.text,
        voice,
        providerConfig: {
          ...providerConfig,
          pitch: ssmlEnabled.value ? pitch.value : undefined,
        },
        forceSSML: ssmlEnabled.value,
        supportsSSML: speechStore.supportsSSML,
      })

View on GitHub (pinned to 677329427f)

Solutions

  1. Open Settings > Providers > openai-compatible-audio-speech, set the voice field to a voice your endpoint serves, and save
  2. Fetch the provider's voice list (API key + base URL configured) and select one explicitly
  3. If the default is intended, confirm the endpoint actually supports the 'alloy' voice
Defensive patterns

Strategy: validation

Validate before calling

// Before enabling TTS for openai-compatible-audio-speech
const config = providers.value['openai-compatible-audio-speech']
if (!config?.voice) {
  // mark provider incomplete in settings UI instead of relying on the alloy default
  console.warn('[Speech Pipeline] OpenAI Compatible: No voice in provider config, using default')
}

Type guard

function hasProviderVoice(config: unknown): config is { voice: string } {
  return Boolean(config) && typeof config === 'object' && typeof (config as any).voice === 'string' && (config as any).voice.length > 0
}

Prevention

When it happens

Trigger: The openai-compatible-audio-speech provider was saved without a voice field while TTS is requested.

Common situations: Provider configured with only API key, base URL and model; voice selection skipped during setup; config persisted by an older app version.

Related errors


AI-assisted analysis of moeru-ai/airi@677329427f (2026-08-18). Data as JSON: /api/errors/600bfc3284b25dca. Report an issue: GitHub.