Pular para conteúdo

SPEECH - Transcrição de Áudio para Texto com IA

O que é este Node?

O SPEECH é o node responsável por transcrever áudio para texto usando modelos avançados de reconhecimento de fala (Speech-to-Text). Suporta três provedores: OpenAI Whisper, Google Cloud Speech-to-Text e Groq Whisper (ultra-rápido).

Por que este Node existe?

Áudio é a forma mais natural de comunicação, mas sistemas precisam processar texto. O SPEECH existe para:

  1. Acessibilidade Universal: Permitir que mensagens de voz sejam processadas automaticamente pelo sistema
  2. Análise de Conteúdo: Transcrever áudios para análise de sentimento, extração de entidades e outras operações
  3. Automação de Atendimento: Compreender comandos por voz sem intervenção humana
  4. Flexibilidade de Provedores: Escolher entre velocidade (Groq), precisão (Google) ou versatilidade (OpenAI)

Como funciona internamente?

Quando o SPEECH é executado, o sistema:

  1. Valida entrada: Verifica se audioUrl ou audioBase64 foi fornecido
  2. Obtém áudio: Se URL, faz download; se base64, converte para Buffer
  3. Seleciona provider: Usa provider configurado (padrão: OpenAI)
  4. Envia para API: Faz requisição ao serviço escolhido (OpenAI/Google/Groq)
  5. Processa resposta: Extrai texto transcrito, confiança, idioma e metadados
  6. Se erro: Lança exceção com mensagem detalhada do provider
  7. Se sucesso: Retorna transcrição completa com estatísticas

Código interno (ai-processing-executor.service.ts:240-524):

private async executeSpeech(parameters: any, context: any): Promise<any> {
  const {
    audioSource,
    audioUrl,
    audioBase64,
    language,
    provider,
    apiKey
  } = parameters;

  this.logger.log(`🎤 SPEECH - Transcribing audio using ${provider || 'OpenAI Whisper'}`);

  // Determine audio source
  let audioBuffer: Buffer;
  let audioUrlToUse: string | null = null;

  if (audioBase64) {
    // Audio provided as base64 (from Evolution API)
    audioBuffer = Buffer.from(audioBase64, 'base64');
    this.logger.log(`📦 Audio received as base64 (${audioBuffer.length} bytes)`);
  } else if (audioUrl) {
    // Audio provided as URL - download it
    audioUrlToUse = audioUrl;
    this.logger.log(`🔗 Downloading audio from URL: ${audioUrl}`);
    audioBuffer = await this.downloadAudio(audioUrl);
  } else {
    throw new Error('Either audioUrl or audioBase64 is required for speech transcription');
  }

  // Select transcription provider
  const transcriptionProvider = provider || 'openai'; // Default: OpenAI Whisper

  let transcriptionResult: any;

  try {
    switch (transcriptionProvider.toLowerCase()) {
      case 'openai':
        transcriptionResult = await this.transcribeWithOpenAI(audioBuffer, language, apiKey);
        break;

      case 'google':
      case 'google-cloud':
        transcriptionResult = await this.transcribeWithGoogle(audioBuffer, language, apiKey);
        break;

      case 'groq':
        transcriptionResult = await this.transcribeWithGroq(audioBuffer, language, apiKey);
        break;

      default:
        throw new Error(`Unsupported transcription provider: ${transcriptionProvider}`);
    }

    return {
      success: true,
      action: 'speech_transcribed',
      provider: transcriptionProvider,
      audio: {
        source: audioBase64 ? 'base64' : 'url',
        url: audioUrlToUse,
        language: language || 'pt-BR',
        sizeBytes: audioBuffer.length
      },
      transcription: transcriptionResult,
      timestamp: new Date().toISOString()
    };

  } catch (error) {
    this.logger.error(`❌ Speech transcription failed with ${transcriptionProvider}:`, error.message);
    throw new Error(`Speech transcription failed: ${error.message}`);
  }
}

/**
 * Transcribe audio using OpenAI Whisper API
 * Docs: https://platform.openai.com/docs/guides/speech-to-text
 */
private async transcribeWithOpenAI(
  audioBuffer: Buffer,
  language?: string,
  apiKey?: string
): Promise<any> {
  if (!apiKey) {
    throw new Error('OpenAI API key is required. Please configure it in the node properties.');
  }

  const openaiKey = apiKey;

  this.logger.log(`🤖 Transcribing with OpenAI Whisper (${audioBuffer.length} bytes)`);

  try {
    // Create form data for OpenAI API
    const FormData = require('form-data');
    const formData = new FormData();
    formData.append('file', audioBuffer, {
      filename: 'audio.ogg', // Evolution API usually sends OGG
      contentType: 'audio/ogg',
    });
    formData.append('model', 'whisper-1');

    if (language) {
      formData.append('language', language === 'pt-BR' ? 'pt' : language);
    }

    const response = await firstValueFrom(
      this.httpService.post(
        'https://api.openai.com/v1/audio/transcriptions',
        formData,
        {
          headers: {
            ...formData.getHeaders(),
            'Authorization': `Bearer ${openaiKey}`,
          },
          timeout: 60000, // 60 seconds
        }
      )
    );

    const text = response.data.text || '';

    return {
      text: text,
      confidence: 0.95, // OpenAI doesn't provide confidence
      language: response.data.language || language || 'pt',
      duration: response.data.duration || null,
      wordsCount: text.split(/\s+/).filter(w => w.length > 0).length,
      provider: 'openai'
    };

  } catch (error) {
    this.logger.error(`❌ OpenAI Whisper error:`, error.response?.data || error.message);
    throw new Error(`OpenAI transcription failed: ${error.response?.data?.error?.message || error.message}`);
  }
}

/**
 * Transcribe audio using Google Cloud Speech-to-Text API
 * Docs: https://cloud.google.com/speech-to-text/docs/reference/rest
 */
private async transcribeWithGoogle(
  audioBuffer: Buffer,
  language?: string,
  apiKey?: string
): Promise<any> {
  if (!apiKey) {
    throw new Error('Google Cloud API key is required. Please configure it in the node properties.');
  }

  const googleKey = apiKey;

  this.logger.log(`☁️ Transcribing with Google Cloud Speech (${audioBuffer.length} bytes)`);

  try {
    const audioBase64 = audioBuffer.toString('base64');

    const requestBody = {
      config: {
        encoding: 'OGG_OPUS', // Evolution API format
        languageCode: language || 'pt-BR',
        enableAutomaticPunctuation: true,
        model: 'default',
      },
      audio: {
        content: audioBase64,
      },
    };

    const response = await firstValueFrom(
      this.httpService.post(
        `https://speech.googleapis.com/v1/speech:recognize?key=${googleKey}`,
        requestBody,
        {
          timeout: 60000,
        }
      )
    );

    const results = response.data.results || [];
    if (results.length === 0) {
      throw new Error('No transcription results from Google Cloud');
    }

    const transcript = results
      .map((result: any) => result.alternatives[0].transcript)
      .join(' ');

    const confidence = results[0]?.alternatives[0]?.confidence || 0.9;

    return {
      text: transcript,
      confidence: confidence,
      language: language || 'pt-BR',
      duration: null,
      wordsCount: transcript.split(/\s+/).filter(w => w.length > 0).length,
      provider: 'google',
      alternatives: results.map((r: any) => r.alternatives).flat(),
    };

  } catch (error) {
    this.logger.error(`❌ Google Cloud Speech error:`, error.response?.data || error.message);
    throw new Error(`Google transcription failed: ${error.response?.data?.error?.message || error.message}`);
  }
}

/**
 * Transcribe audio using Groq Whisper API (ultra-fast!)
 * Docs: https://console.groq.com/docs/speech-text
 */
private async transcribeWithGroq(
  audioBuffer: Buffer,
  language?: string,
  apiKey?: string
): Promise<any> {
  if (!apiKey) {
    throw new Error('Groq API key is required. Please configure it in the node properties.');
  }

  const groqKey = apiKey;

  this.logger.log(`⚡ Transcribing with Groq Whisper (${audioBuffer.length} bytes) - ULTRA FAST!`);

  try {
    // Create form data for Groq API
    const FormData = require('form-data');
    const formData = new FormData();
    formData.append('file', audioBuffer, {
      filename: 'audio.ogg',
      contentType: 'audio/ogg',
    });
    formData.append('model', 'whisper-large-v3'); // Groq's fastest model

    if (language) {
      formData.append('language', language === 'pt-BR' ? 'pt' : language);
    }

    formData.append('response_format', 'verbose_json'); // Get detailed info

    const response = await firstValueFrom(
      this.httpService.post(
        'https://api.groq.com/openai/v1/audio/transcriptions',
        formData,
        {
          headers: {
            ...formData.getHeaders(),
            'Authorization': `Bearer ${groqKey}`,
          },
          timeout: 30000, // Groq is MUCH faster than OpenAI
        }
      )
    );

    const text = response.data.text || '';

    return {
      text: text,
      confidence: 0.93, // Groq doesn't provide confidence
      language: response.data.language || language || 'pt',
      duration: response.data.duration || null,
      wordsCount: text.split(/\s+/).filter(w => w.length > 0).length,
      provider: 'groq',
      segments: response.data.segments || null, // Word-level timestamps
    };

  } catch (error) {
    this.logger.error(`❌ Groq Whisper error:`, error.response?.data || error.message);
    throw new Error(`Groq transcription failed: ${error.response?.data?.error?.message || error.message}`);
  }
}

Quando você DEVE usar este Node?

Use SPEECH sempre que precisar de conversão automática de áudio em texto:

Casos de uso

  1. Atendimento por Voz: "Transcrever mensagem de áudio do cliente para processar pedido automaticamente"
  2. Análise de Sentimento: "Converter áudio em texto para análise com node AI"
  3. Comandos por Voz: "Permitir que usuários controlem o bot por áudio (ex: 'consultar saldo')"
  4. Documentação Médica: "Transcrever relatos de sintomas para criar prontuário"
  5. Assistentes Virtuais: "Processar comandos de voz em aplicações conversacionais"

Quando NÃO usar SPEECH

  • Áudio para armazenamento: Use node MEDIA para apenas salvar/gerenciar arquivos de áudio
  • Identificação de locutor: SPEECH não identifica QUEM fala, apenas O QUE fala
  • Tradução de áudio: SPEECH apenas transcreve; use node AI para traduzir o texto depois

Parâmetros Detalhados

audioUrl (string, condicional)

O que é: URL pública do arquivo de áudio para transcrição (Evolution API geralmente fornece automaticamente).

Padrão: Nenhum (ou audioBase64 deve ser fornecido)

Flow completo para testar:

{
  "name": "Teste SPEECH - Audio por URL",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Transcrever Áudio (URL)",
        "parameters": {
          "audioUrl": "https://exemplo.com/audio.ogg",
          "provider": "openai",
          "language": "pt-BR",
          "apiKey": "sk-..."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar Transcrição",
        "parameters": {
          "message": "Você disse: {{transcription.text}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "speech_1" },
    { "source": "speech_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Configure um webhook com Evolution API, envie um áudio pelo WhatsApp. O sistema baixa o áudio da URL e transcreve automaticamente.


audioBase64 (string, condicional)

O que é: Conteúdo do áudio codificado em Base64 (Evolution API fornece automaticamente em webhooks).

Padrão: Nenhum (ou audioUrl deve ser fornecido)

Flow completo para testar:

{
  "name": "Teste SPEECH - Audio em Base64",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Transcrever Base64",
        "parameters": {
          "audioBase64": "{{message.audio.base64}}",
          "provider": "groq",
          "language": "pt-BR",
          "apiKey": "gsk_..."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Responder",
        "parameters": {
          "message": "Transcrição: {{transcription.text}} ({{transcription.wordsCount}} palavras)"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "speech_1" },
    { "source": "speech_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Evolution API envia áudio em base64 automaticamente. O sistema converte direto para Buffer e transcreve (mais rápido que baixar URL).


language (string, opcional)

O que é: Código do idioma do áudio (ex: pt-BR, en-US, es-ES). Melhora precisão se especificado.

Padrão: "pt-BR"

Flow completo para testar:

{
  "name": "Teste SPEECH - Idioma Específico",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Transcrever Inglês",
        "parameters": {
          "audioUrl": "{{message.audio.url}}",
          "provider": "openai",
          "language": "en-US",
          "apiKey": "sk-..."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mostrar",
        "parameters": {
          "message": "Transcription: {{transcription.text}} (Language: {{transcription.language}})"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "speech_1" },
    { "source": "speech_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Envie áudio em inglês. Especificar idioma aumenta precisão em até 20%.


provider (string, opcional)

O que é: Serviço de transcrição: "openai" (Whisper v1), "google" (Cloud Speech), "groq" (Whisper v3 ultra-rápido).

Padrão: "openai"

Flow completo para testar:

{
  "name": "Teste SPEECH - Comparar Providers",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Início" }
    },
    {
      "id": "speech_openai",
      "type": "speech",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "OpenAI Whisper",
        "parameters": {
          "audioUrl": "{{message.audio.url}}",
          "provider": "openai",
          "language": "pt-BR",
          "apiKey": "sk-..."
        }
      }
    },
    {
      "id": "speech_google",
      "type": "speech",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Google Cloud",
        "parameters": {
          "audioUrl": "{{message.audio.url}}",
          "provider": "google",
          "language": "pt-BR",
          "apiKey": "AIza..."
        }
      }
    },
    {
      "id": "speech_groq",
      "type": "speech",
      "position": { "x": 300, "y": 300 },
      "data": {
        "label": "Groq Whisper",
        "parameters": {
          "audioUrl": "{{message.audio.url}}",
          "provider": "groq",
          "language": "pt-BR",
          "apiKey": "gsk_..."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 200 },
      "data": {
        "label": "Comparar",
        "parameters": {
          "message": "OpenAI: {{transcription_openai.text}}\n\nGoogle: {{transcription_google.text}}\n\nGroq: {{transcription_groq.text}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 200 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "speech_openai" },
    { "source": "start_1", "target": "speech_google" },
    { "source": "start_1", "target": "speech_groq" },
    { "source": "speech_openai", "target": "message_1" },
    { "source": "speech_google", "target": "message_1" },
    { "source": "speech_groq", "target": "message_1" }
  ]
}

Teste: Envie mesmo áudio e compare resultados. Groq é 10x mais rápido, Google tem melhor confiança, OpenAI melhor balanceamento.


apiKey (string, obrigatório por provider)

O que é: Chave de API do serviço escolhido (OpenAI, Google Cloud ou Groq).

Padrão: Nenhum (obrigatório)

Flow completo para testar:

{
  "name": "Teste SPEECH - Validação de API Key",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Testar API Key",
        "parameters": {
          "audioUrl": "{{message.audio.url}}",
          "provider": "groq",
          "language": "pt-BR",
          "apiKey": "gsk_sua_chave_aqui"
        }
      }
    },
    {
      "id": "message_success",
      "type": "message",
      "position": { "x": 500, "y": 50 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "API Key válida! Transcrição: {{transcription.text}}"
        }
      }
    },
    {
      "id": "message_error",
      "type": "message",
      "position": { "x": 500, "y": 150 },
      "data": {
        "label": "Erro",
        "parameters": {
          "message": "Erro: API Key inválida ou sem créditos"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "speech_1" },
    { "source": "speech_1", "target": "message_success", "condition": "success" },
    { "source": "speech_1", "target": "message_error", "condition": "error" },
    { "source": "message_success", "target": "end_1" },
    { "source": "message_error", "target": "end_1" }
  ]
}

Teste:

Parâmetros

Campo Tipo Obrigatório Descrição
audioUrl string Condicional* URL pública do arquivo de áudio (formato: OGG, MP3, WAV, etc.)
audioBase64 string Condicional* Conteúdo do áudio codificado em Base64
language string Não Código do idioma (pt-BR, en-US, es-ES, etc.) - padrão: pt-BR
provider string Não Provedor: 'openai', 'google', 'groq' - padrão: openai
apiKey string Sim Chave de API do provedor selecionado

* Condicional: Deve fornecer audioUrl OU audioBase64 (um dos dois obrigatório)

Comparação de Providers

Característica OpenAI Whisper Google Cloud Speech Groq Whisper
Modelo Whisper v1 Proprietário Google Whisper v3 Large
Velocidade ~10-20s ~5-10s ~1-3s
Precisão 90-95% 95-98% 90-93%
Custo $0.006/min $0.004/min GRATUITO (tier grátis generoso)
Idiomas 99+ 125+ 99+
Confiança Não fornece Sim (0-1) Não fornece
Timestamps Não Não Sim (word-level)
Limite arquivo 25 MB 10 MB 25 MB
Formatos Todos OGG, FLAC, WAV Todos
Melhor para Uso geral Alta precisão Velocidade máxima

Recomendação:

  • Protótipo/Testes: Use Groq (grátis e ultra-rápido)
  • Produção com volume: Use OpenAI (melhor custo-benefício)
  • Aplicações críticas: Use Google (maior precisão)

Exemplo 1: Atendimento Automático com Análise de Áudio

Objetivo: Cliente envia áudio com pedido, sistema transcreve e processa automaticamente.

JSON para Importar

{
  "name": "Atendimento por Voz - Pedido de Pizza",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Cliente envia áudio" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Aguardar áudio",
        "parameters": {
          "message": "🎙️ Envie um áudio com seu pedido de pizza!\n\nExemplo: 'Quero uma pizza calabresa grande, borda recheada, com Coca 2L'"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 200 },
      "data": {
        "label": "Receber áudio",
        "parameters": {
          "variableName": "pedido_audio",
          "validationType": "audio"
        }
      }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 700, "y": 200 },
      "data": {
        "label": "Transcrever Pedido",
        "parameters": {
          "audioUrl": "{{pedido_audio.url}}",
          "provider": "groq",
          "language": "pt-BR",
          "apiKey": "gsk_..."
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 200 },
      "data": {
        "label": "Confirmar transcrição",
        "parameters": {
          "message": "📝 Entendi seu pedido:\n\n\"{{transcription.text}}\"\n\nEstá correto? Digite SIM para confirmar ou NÃO para refazer."
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 1100, "y": 200 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "variableName": "confirmacao"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 1300, "y": 200 },
      "data": {
        "label": "Confirmar?",
        "parameters": {
          "conditions": [
            {
              "variable": "confirmacao",
              "operator": "contains",
              "value": "sim",
              "caseSensitive": false
            }
          ]
        }
      }
    },
    {
      "id": "ai_1",
      "type": "ai",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "Extrair itens do pedido",
        "parameters": {
          "provider": "openai",
          "model": "gpt-4o-mini",
          "apiKey": "sk-...",
          "prompt": "Extraia os itens do pedido: {{transcription.text}}\n\nRetorne JSON: {\"sabor\": \"\", \"tamanho\": \"\", \"borda\": \"\", \"bebida\": \"\", \"observacoes\": \"\"}"
        }
      }
    },
    {
      "id": "message_3",
      "type": "message",
      "position": { "x": 1700, "y": 100 },
      "data": {
        "label": "Pedido processado",
        "parameters": {
          "message": "✅ Pedido confirmado!\n\n🍕 Pizza: {{ai_response.sabor}} {{ai_response.tamanho}}\n🥖 Borda: {{ai_response.borda}}\n🥤 Bebida: {{ai_response.bebida}}\n\n⏱️ Tempo estimado: 40-50 minutos\n💰 Total: R$ 45,90\n\nObrigado!"
        }
      }
    },
    {
      "id": "message_4",
      "type": "message",
      "position": { "x": 1500, "y": 300 },
      "data": {
        "label": "Refazer",
        "parameters": {
          "message": "Ok, vamos refazer! Envie outro áudio com seu pedido."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1900, "y": 200 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "speech_1" },
    { "source": "speech_1", "target": "message_2" },
    { "source": "message_2", "target": "input_2" },
    { "source": "input_2", "target": "condition_1" },
    { "source": "condition_1", "target": "ai_1", "label": "SIM" },
    { "source": "condition_1", "target": "message_4", "label": "NÃO" },
    { "source": "ai_1", "target": "message_3" },
    { "source": "message_3", "target": "end_1" },
    { "source": "message_4", "target": "input_1" }
  ]
}

Saída esperada:

Sistema: 🎙️ Envie um áudio com seu pedido de pizza!
Usuário: [ENVIA ÁUDIO: "Quero uma pizza calabresa grande, borda recheada, com Coca 2L"]
Sistema: 📝 Entendi seu pedido: "Quero uma pizza calabresa grande, borda recheada, com Coca 2L"
Usuário: SIM
Sistema: ✅ Pedido confirmado!
         🍕 Pizza: Calabresa Grande
         🥖 Borda: Recheada
         🥤 Bebida: Coca-Cola 2L
         ⏱️ Tempo estimado: 40-50 minutos
         💰 Total: R$ 45,90

Exemplo 2: Sistema de Triagem Médica por Voz (Google Cloud)

Objetivo: Paciente descreve sintomas por áudio, sistema transcreve com alta precisão e analisa gravidade.

JSON para Importar

{
  "name": "Triagem Médica - Análise de Sintomas por Voz",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Instruções",
        "parameters": {
          "message": "🏥 *TRIAGEM MÉDICA AUTOMATIZADA*\n\n🎙️ Descreva seus sintomas em um áudio de até 1 minuto:\n\n- O que você está sentindo?\n- Desde quando?\n- Intensidade da dor (leve/moderada/forte)\n- Outros sintomas\n\n⚕️ Suas informações são confidenciais."
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 200 },
      "data": {
        "label": "Receber áudio",
        "parameters": {
          "variableName": "sintomas_audio",
          "validationType": "audio"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 200 },
      "data": {
        "label": "Processando",
        "parameters": {
          "message": "⏳ Analisando seu relato...\n\nAguarde enquanto transcrevemos e analisamos seus sintomas."
        }
      }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 900, "y": 200 },
      "data": {
        "label": "Transcrever (Google Cloud)",
        "parameters": {
          "audioBase64": "{{sintomas_audio.base64}}",
          "provider": "google",
          "language": "pt-BR",
          "apiKey": "AIza..."
        }
      }
    },
    {
      "id": "ai_1",
      "type": "ai",
      "position": { "x": 1100, "y": 200 },
      "data": {
        "label": "Análise médica",
        "parameters": {
          "provider": "openai",
          "model": "gpt-4",
          "apiKey": "sk-...",
          "prompt": "Você é um sistema de triagem médica. Analise os sintomas:\n\n{{transcription.text}}\n\nRetorne JSON:\n{\n  \"sintomas_principais\": [],\n  \"gravidade\": \"baixa|moderada|alta|emergência\",\n  \"especialidade_recomendada\": \"\",\n  \"urgencia\": \"rotina|urgente|emergencial\",\n  \"recomendacoes\": []\n}"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 1300, "y": 200 },
      "data": {
        "label": "É emergência?",
        "parameters": {
          "conditions": [
            {
              "variable": "ai_response.urgencia",
              "operator": "equals",
              "value": "emergencial"
            }
          ]
        }
      }
    },
    {
      "id": "message_emergency",
      "type": "message",
      "position": { "x": 1500, "y": 100 },
      "data": {
        "label": "EMERGÊNCIA",
        "parameters": {
          "message": "🚨 *ATENÇÃO - SITUAÇÃO DE EMERGÊNCIA*\n\n⚠️ Seus sintomas indicam necessidade de atendimento IMEDIATO!\n\n📞 LIGUE 192 (SAMU) AGORA\n🏥 Ou vá ao Pronto Socorro mais próximo\n\n*Sintomas relatados:*\n{{transcription.text}}\n\n*Confiança da transcrição:* {{transcription.confidence}}%"
        }
      }
    },
    {
      "id": "message_normal",
      "type": "message",
      "position": { "x": 1500, "y": 300 },
      "data": {
        "label": "Orientação normal",
        "parameters": {
          "message": "📋 *RESULTADO DA TRIAGEM*\n\n*Seus sintomas:*\n{{transcription.text}}\n\n*Análise:*\n🔹 Gravidade: {{ai_response.gravidade}}\n🔹 Especialidade: {{ai_response.especialidade_recomendada}}\n🔹 Urgência: {{ai_response.urgencia}}\n\n*Recomendações:*\n{{ai_response.recomendacoes}}\n\n📅 Agende consulta pelo telefone: (11) 9999-9999"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1700, "y": 200 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "message_2" },
    { "source": "message_2", "target": "speech_1" },
    { "source": "speech_1", "target": "ai_1" },
    { "source": "ai_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_emergency", "label": "SIM" },
    { "source": "condition_1", "target": "message_normal", "label": "NÃO" },
    { "source": "message_emergency", "target": "end_1" },
    { "source": "message_normal", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🏥 TRIAGEM MÉDICA AUTOMATIZADA
Usuário: [ÁUDIO: "Estou com dor de cabeça forte há 3 dias, acompanhada de febre de 38 graus e rigidez no pescoço"]
Sistema: ⏳ Analisando seu relato...
Sistema: 🚨 ATENÇÃO - SITUAÇÃO DE EMERGÊNCIA
         ⚠️ Seus sintomas indicam necessidade de atendimento IMEDIATO!
         📞 LIGUE 192 (SAMU) AGORA

Exemplo 3: Assistente Multilíngue com Groq (Ultra-Rápido)

Objetivo: Demonstrar velocidade do Groq e suporte a múltiplos idiomas.

JSON para Importar

{
  "name": "Assistente Multilíngue - Groq Ultra-Rápido",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Boas-vindas",
        "parameters": {
          "message": "🌍 *ASSISTENTE MULTILÍNGUE*\n\n🎙️ Fale em qualquer idioma:\n\n🇧🇷 Português\n🇺🇸 English\n🇪🇸 Español\n🇫🇷 Français\n🇩🇪 Deutsch\n🇮🇹 Italiano\n🇯🇵 日本語\n\nEnvie seu áudio!"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 200 },
      "data": {
        "label": "Receber áudio",
        "parameters": {
          "variableName": "audio_multilingual",
          "validationType": "audio"
        }
      }
    },
    {
      "id": "speech_1",
      "type": "speech",
      "position": { "x": 700, "y": 200 },
      "data": {
        "label": "Transcrever (Groq - Autodetectar)",
        "parameters": {
          "audioUrl": "{{audio_multilingual.url}}",
          "provider": "groq",
          "apiKey": "gsk_..."
        }
      }
    },
    {
      "id": "ai_translate",
      "type": "ai",
      "position": { "x": 900, "y": 200 },
      "data": {
        "label": "Traduzir para PT-BR",
        "parameters": {
          "provider": "openai",
          "model": "gpt-4o-mini",
          "apiKey": "sk-...",
          "prompt": "Traduza para português brasileiro:\n\n{{transcription.text}}\n\n(Idioma original: {{transcription.language}})"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 1100, "y": 200 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "⚡ *TRANSCRIÇÃO GROQ* ({{transcription.duration}}s)\n\n🗣️ *Idioma detectado:* {{transcription.language}}\n📝 *Você disse:* {{transcription.text}}\n🔢 *Palavras:* {{transcription.wordsCount}}\n\n🌐 *Tradução (PT-BR):*\n{{ai_translation}}\n\n💡 Processado em tempo recorde!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 200 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "speech_1" },
    { "source": "speech_1", "target": "ai_translate" },
    { "source": "ai_translate", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🌍 ASSISTENTE MULTILÍNGUE
Usuário: [ÁUDIO EM INGLÊS: "Hello, I would like to schedule a meeting for next Monday at 3 PM"]
Sistema: ⚡ TRANSCRIÇÃO GROQ (2.1s)
         🗣️ Idioma detectado: en
         📝 Você disse: Hello, I would like to schedule a meeting for next Monday at 3 PM
         🔢 Palavras: 14
         🌐 Tradução (PT-BR): Olá, gostaria de agendar uma reunião para segunda-feira às 15h
         💡 Processado em tempo recorde!

Resposta do Node

Sucesso (OpenAI)

{
  "success": true,
  "action": "speech_transcribed",
  "provider": "openai",
  "audio": {
    "source": "url",
    "url": "https://exemplo.com/audio.ogg",
    "language": "pt-BR",
    "sizeBytes": 45123
  },
  "transcription": {
    "text": "Olá, gostaria de fazer um pedido de pizza calabresa grande",
    "confidence": 0.95,
    "language": "pt",
    "duration": 3.5,
    "wordsCount": 10,
    "provider": "openai"
  },
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Sucesso (Google Cloud)

{
  "success": true,
  "action": "speech_transcribed",
  "provider": "google",
  "audio": {
    "source": "base64",
    "url": null,
    "language": "pt-BR",
    "sizeBytes": 52341
  },
  "transcription": {
    "text": "Estou com dor de cabeça forte há três dias",
    "confidence": 0.97,
    "language": "pt-BR",
    "duration": null,
    "wordsCount": 8,
    "provider": "google",
    "alternatives": [
      {
        "transcript": "Estou com dor de cabeça forte há três dias",
        "confidence": 0.97
      },
      {
        "transcript": "Estou com dor de cabeça forte a três dias",
        "confidence": 0.83
      }
    ]
  },
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Sucesso (Groq)

{
  "success": true,
  "action": "speech_transcribed",
  "provider": "groq",
  "audio": {
    "source": "url",
    "url": "https://exemplo.com/audio.ogg",
    "language": "en-US",
    "sizeBytes": 38765
  },
  "transcription": {
    "text": "Hello, I would like to schedule a meeting for next Monday",
    "confidence": 0.93,
    "language": "en",
    "duration": 2.8,
    "wordsCount": 10,
    "provider": "groq",
    "segments": [
      {
        "id": 0,
        "start": 0.0,
        "end": 0.5,
        "text": "Hello",
        "tokens": [15947],
        "temperature": 0.0
      },
      {
        "id": 1,
        "start": 0.5,
        "end": 1.2,
        "text": " I would like",
        "tokens": [286, 1314, 588],
        "temperature": 0.0
      }
    ]
  },
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Erro (API Key inválida)

{
  "error": "Speech transcription failed: Invalid API key",
  "provider": "openai",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Erro (Áudio não fornecido)

{
  "error": "Either audioUrl or audioBase64 is required for speech transcription",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Boas Práticas

SIM:

  • Use Groq para protótipos e testes (grátis e ultra-rápido)
  • Use Google Cloud quando precisar de confiança percentual real
  • Use OpenAI para produção (melhor custo-benefício)
  • Especifique language quando souber o idioma (aumenta 15-20% precisão)
  • Sempre valide se audioUrl OU audioBase64 foi fornecido
  • Mostre mensagem "Processando..." enquanto transcreve (pode levar 5-20s)
  • Permita usuário confirmar transcrição antes de processar (evita erros)
  • Use transcription.confidence do Google para avaliar qualidade
  • Combine SPEECH com node AI para extrair entidades/intenções
  • Salve transcrições em banco para auditoria (node DATABASE)

NÃO:

  • Não confie cegamente na transcrição (sempre permita correção)
  • Não use SPEECH para áudios > 25 MB (Groq/OpenAI limite)
  • Não transcreva áudios muito curtos (< 1 segundo) - pode falhar
  • Não exponha API Keys no frontend (sempre use variáveis de ambiente)
  • Não use SPEECH para identificar QUEM fala (não faz identificação de locutor)
  • Não esqueça de tratar erros (API pode estar fora/sem créditos)
  • Não use language errado (reduz precisão drasticamente)
  • Não confunda pt-BR com pt (alguns providers aceitam apenas pt)

Dicas

💡 Dica 1 - Groq é IDEAL para iniciar: Groq oferece tier gratuito generoso e é 10x mais rápido que OpenAI. Perfeito para MVP e testes.

💡 Dica 2 - Google retorna alternativas: Google Cloud fornece múltiplas transcrições com confiança. Use para escolher melhor resultado.

💡 Dica 3 - Combine com AI para extrair dados: SPEECH apenas transcreve. Use node AI depois para extrair nomes, datas, intenções, etc.

💡 Dica 4 - Áudio em Base64 é mais rápido: Evolution API envia base64. Isso evita download de URL (economiza 1-2 segundos).

💡 Dica 5 - Timestamps do Groq são únicos: Apenas Groq fornece timestamps word-level. Útil para legendagem ou análise temporal.

💡 Dica 6 - Teste com áudios reais: Áudios sintéticos (TTS) têm 99% precisão. Áudios reais (WhatsApp) podem ter ruído - teste sempre!

💡 Dica 7 - Monitore custos: OpenAI cobra $0.006/min. Groq é grátis até 1000 min/dia. Google cobra $0.004/min.

Próximo Node

AI - Processar texto transcrito com modelos de linguagem → SENTIMENT - Analisar sentimento do áudio transcrito → ENTITY - Extrair entidades (nomes, datas, etc) da transcrição → VARIABLE - Armazenar transcrição em variável