Zackriya-Solutions/meetily · warning · Error

No transcript text available. Please add some text first.

Error message

No transcript text available. Please add some text first.

What it means

Thrown by the summary-generation hook as a deliberate precondition check: generateSummary refuses to run when transcriptText.trim() is empty, before any LLM call or Analytics.trackSummaryGenerationStarted fires. Note the hook has already set summaryStatus to 'processing'/'regenerating' by the time this throws, so the catch path must reset that status. In practice the transcript is empty because Whisper/VAD produced no segments (or segments have not loaded), not because of a bug in this guard.

Source

Thrown at frontend/src/hooks/meeting-details/useSummaryGeneration.ts:116

  // Unified summary processing logic
  const processSummary = useCallback(async ({
    transcriptText,
    transcriptTexts,
    customPrompt = '',
    isRegeneration = false,
  }: {
    transcriptText: string;
    transcriptTexts?: string[];
    customPrompt?: string;
    isRegeneration?: boolean;
  }) => {
    setSummaryStatus(isRegeneration ? 'regenerating' : 'processing');
    setSummaryError(null);

    try {
      if (!transcriptText.trim()) {
        throw new Error('No transcript text available. Please add some text first.');
      }

      console.log('Processing transcript with template:', selectedTemplate);

      // Calculate time since recording
      const timeSinceRecording = (Date.now() - new Date(meeting.created_at).getTime()) / 60000; // minutes

      // Track summary generation started
      await Analytics.trackSummaryGenerationStarted(
        modelConfig.provider,
        modelConfig.model,
        transcriptText.length,
        timeSinceRecording
      );

      // Track custom prompt usage if present
      if (customPrompt.trim().length > 0) {
        await Analytics.trackCustomPromptUsed(customPrompt.trim().length);

View on GitHub (pinned to 0281737d87)

Solutions

  1. Check that transcript segments actually exist before enabling the Generate/Regenerate button (e.g. transcripts.some(t => t.text.trim().length > 0)).
  2. When regenerating from transcriptTexts, join segments with newlines and trim the result before passing it as transcriptText.
  3. If transcripts stay empty during live recording, debug the audio pipeline: run with RUST_LOG=app_lib::audio=debug and verify transcript-update events and the VAD detection rate.
  4. As a workaround, paste manual transcript text into the meeting and retry.

Example fix

// before
await generateSummary({ transcriptText, isRegeneration: true });

// after
if (!transcriptText.trim()) {
  setSummaryError('Transcript is empty — record or add text before generating a summary.');
  setSummaryStatus('idle'); // reset the 'processing' state the hook already set
  return;
}
await generateSummary({ transcriptText, isRegeneration: true });
Defensive patterns

Strategy: validation

Validate before calling

const hasText = transcriptTexts?.length
  ? transcriptTexts.some(t => t.trim().length > 0)
  : !!transcriptText?.trim();
if (!hasText) {
  toast.info('Nothing to summarize yet — the transcript is empty.');
  return;
}

Type guard

function hasTranscriptText(text: string | null | undefined): text is string {
  return typeof text === 'string' && text.trim().length > 0;
}

Try / catch

try {
  await generateSummary({ transcriptText });
} catch (e) {
  if (e instanceof Error && e.message.includes('No transcript text')) {
    setSummaryStatus('idle'); // reset the 'processing' state the hook set before throwing
    return;
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling generateSummary (or the Regenerate action) when: (1) the meeting was stopped seconds after starting and no speech was detected; (2) transcriptTexts was used elsewhere but the joined transcriptText passed here is empty/whitespace; (3) an old meeting's transcripts failed to load from the database and the UI still enabled the button; (4) VAD filtered out all audio so the transcript-update events never carried text.

Common situations: Very short or silent recordings, mic permission denied so Whisper receives nothing, opening a meeting whose transcript rows were not persisted, or a race where the user clicks Generate before the first transcript segment arrives.

Related errors


AI-assisted analysis of Zackriya-Solutions/meetily@0281737d87 (2026-08-16). Data as JSON: /api/errors/0410f525c880c4e5. Report an issue: GitHub.