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:
- Acessibilidade Universal: Permitir que mensagens de voz sejam processadas automaticamente pelo sistema
- Análise de Conteúdo: Transcrever áudios para análise de sentimento, extração de entidades e outras operações
- Automação de Atendimento: Compreender comandos por voz sem intervenção humana
- Flexibilidade de Provedores: Escolher entre velocidade (Groq), precisão (Google) ou versatilidade (OpenAI)
Como funciona internamente?
Quando o SPEECH é executado, o sistema:
- Valida entrada: Verifica se
audioUrlouaudioBase64foi fornecido - Obtém áudio: Se URL, faz download; se base64, converte para Buffer
- Seleciona provider: Usa
providerconfigurado (padrão: OpenAI) - Envia para API: Faz requisição ao serviço escolhido (OpenAI/Google/Groq)
- Processa resposta: Extrai texto transcrito, confiança, idioma e metadados
- Se erro: Lança exceção com mensagem detalhada do provider
- 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
- Atendimento por Voz: "Transcrever mensagem de áudio do cliente para processar pedido automaticamente"
- Análise de Sentimento: "Converter áudio em texto para análise com node AI"
- Comandos por Voz: "Permitir que usuários controlem o bot por áudio (ex: 'consultar saldo')"
- Documentação Médica: "Transcrever relatos de sintomas para criar prontuário"
- 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:
- OpenAI: Obtenha em https://platform.openai.com/api-keys (formato:
sk-...) - Google: Crie em https://console.cloud.google.com/apis/credentials (formato:
AIza...) - Groq: Grátis em https://console.groq.com/keys (formato:
gsk_...)
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
languagequando souber o idioma (aumenta 15-20% precisão) - Sempre valide se
audioUrlOUaudioBase64foi fornecido - Mostre mensagem "Processando..." enquanto transcreve (pode levar 5-20s)
- Permita usuário confirmar transcrição antes de processar (evita erros)
- Use
transcription.confidencedo 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
languageerrado (reduz precisão drasticamente) - Não confunda
pt-BRcompt(alguns providers aceitam apenaspt)
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