{"record":{"id":"052d92c54120f4d0","repo":"vercel/ai","slug":"no-speech-audio-generated","errorCode":null,"errorMessage":"No speech audio generated.","messagePattern":"No speech audio generated\\.","errorType":"exception","errorClass":"NoSpeechGeneratedError","httpStatus":null,"severity":"error","filePath":"packages/ai/src/generate-speech/generate-speech.ts","lineNumber":149,"sourceCode":"    abortSignal,\n  });\n\n  const result = await retry(() =>\n    resolvedModel.doGenerate({\n      text,\n      voice,\n      outputFormat,\n      instructions,\n      speed,\n      language,\n      abortSignal,\n      headers: headersWithUserAgent,\n      providerOptions,\n    }),\n  );\n\n  if (!result.audio || result.audio.length === 0) {\n    throw new NoSpeechGeneratedError({ responses: [result.response] });\n  }\n\n  logWarnings({\n    warnings: result.warnings,\n    provider: resolvedModel.provider,\n    model: resolvedModel.modelId,\n  });\n\n  return new DefaultSpeechResult({\n    audio: new DefaultGeneratedAudioFile({\n      data: result.audio,\n      mediaType:\n        detectMediaType({\n          data: result.audio,\n          topLevelType: 'audio',\n        }) ?? 'audio/mp3',\n    }),\n    warnings: result.warnings,","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/vercel/ai/blob/69428b1f8b037e4d118fb4853428d5c4e620493c/packages/ai/src/generate-speech/generate-speech.ts#L131-L167","documentation":"The provider completed the speech request but returned no audio (empty or missing audio data). generateSpeech throws NoSpeechGeneratedError, carrying the provider response(s), since a speech result without audio is considered a failed generation. This surfaces provider-side anomalies instead of returning an empty audio file.","triggerScenarios":"Provider returns an empty audio payload; the response was filtered/blocked (e.g. content policy) so no audio was produced; a provider bug or quota state yields a 200 response with no audio bytes; the model id cannot actually synthesize the requested text.","commonSituations":"Content-moderation blocks on the input text; misconfigured voice/model combos that silently produce empty output; mock/test providers returning no audio; proxy layers stripping response bodies.","solutions":["Inspect the `responses` property of NoSpeechGeneratedError for provider error details/warnings","Try a different voice/model id compatible with the provider","Check input text for content that the provider may block","Retry with a different provider to rule out a transient provider issue","Capture API responses (fixtures) to verify what the provider actually returns"],"exampleFix":"// before\nconst { audio } = await generateSpeech({ model, text });\n// after\ntry {\n  const { audio } = await generateSpeech({ model, text });\n} catch (e) {\n  if (NoSpeechGeneratedError.isInstance(e)) {\n    console.error('provider responses:', e.responses);\n  }\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"function isNoSpeechGeneratedError(e: unknown): e is NoSpeechGeneratedError {\n  return NoSpeechGeneratedError.isInstance(e);\n}","tryCatchPattern":"try {\n  return await generateSpeech({ model, text });\n} catch (e) {\n  if (NoSpeechGeneratedError.isInstance(e)) {\n    console.error('speech failed:', e.responses);\n    return fallbackTts(text);\n  }\n  throw e;\n}","preventionTips":["Check NoSpeechGeneratedError.responses for provider hints","Test input text against provider moderation rules","Have a fallback TTS provider for critical paths"],"tags":["speech","provider-response","empty-result"],"backgroundTag":"empty-provider-response","analyzedSha":"69428b1f8b037e4d118fb4853428d5c4e620493c","analyzedAt":"2026-08-30T12:32:21.016Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}