Cole o stream, não a página. O áudio real de uma emissora fica em um endereço que termina em .mp3, .aac ou .m3u8, e, quando uma transcrição ao vivo o recebe, ninguém precisa estar ouvindo.
Uma redação que acompanha três emissoras de rádio, dois canais de TV em stream e um punhado de lives no YouTube tem um problema de equipe antes de ter um problema de transcrição. Alguém precisa estar ouvindo, e alguém precisa apertar o botão de gravar. Uma transcrição ao vivo com um stream como fonte assume as duas tarefas: basta informar o endereço do stream, e o servidor o abre, decodifica e transcreve enquanto o conteúdo vai ao ar, de modo que ninguém precisa estar numa mesa quando uma coletiva começa mais cedo. A parte difícil, descobriu-se, é encontrar o endereço.
Uma transcrição ao vivo pode tirar o áudio de um stream que o próprio servidor puxa: uma rádio na internet, uma playlist HLS (.m3u8), um manifesto DASH (.mpd) ou uma live do YouTube. No Painel, isso é uma nova transcrição ao vivo em Transcriptions → New → Live cuja fonte é um stream, e não o microfone. O endereço é definido na criação da transcrição e nunca muda; por isso, um monitor é configurado uma vez e iniciado sempre que a emissora valer a pena gravar.
O endereço precisa ser o próprio stream, não a página web que o reproduz. A página de uma emissora é HTML; o áudio que ela toca vem de outro lugar, geralmente de um servidor Icecast ou Shoutcast, e o player da página encontra esse endereço com JavaScript depois que ela carrega. Procure no site um link "Listen", "Direct stream" ou "Other players": ele termina em .mp3, .aac, .m3u, .m3u8 ou .pls. Um .pls ou .m3u também não é áudio. É um arquivo de texto curto, de poucas linhas, cada uma com o endereço de um stream; ele existe para que players de desktop possam receber um único link, e o VocalStack transcreve o stream que ele indica. Se você colar a página, o VocalStack a requisita, vê HTML voltando e avisa você. Cada emissora esconde o stream de um jeito diferente; a maioria o esconde atrás de um botão marcado "Listen", que é a única coisa na página que não vale a pena clicar.
Duas categorias de link são recusadas de imediato. Links para páginas que reproduzem mídia, como Spotify, SoundCloud ou Twitch, são rejeitados antes de qualquer conexão. Streams protegidos por cópia também não são compatíveis: uma playlist ou manifesto que exige uma licença DRM falha com uma mensagem que diz isso. Alguns streams também recusam pedidos de fora do país da emissora, então um endereço que toca no escritório pode não tocar a partir de um servidor no exterior. Se um stream toca no navegador, mas não no VocalStack, a emissora está afastando outros players; peça à emissora um endereço que outros aplicativos tenham permissão de usar. A maioria oferece um stream MP3, AAC ou HLS. Com o endereço certo em mãos, a próxima pergunta é se ele algum dia termina.
Um stream ao vivo nunca termina, por isso não é um arquivo. A distinção importa especialmente no caso do YouTube. Uma live do YouTube que está no ar pertence a uma transcrição ao vivo, e o Painel a acompanha enquanto ela vai ao ar. Uma live do YouTube agendada, mas que ainda não começou, aparece como Not live yet e pode ser gravada assim que entrar no ar. Um vídeo encerrado é outra coisa: ele tem duração, então é transcrito como arquivo. Cole o link em Transcriptions → New.
A própria playlist diz qual é o caso, e é assim que qualquer player faz a diferença. Uma playlist HLS encerrada traz a tag #EXT-X-ENDLIST ou #EXT-X-PLAYLIST-TYPE:VOD; uma ao vivo não tem nenhuma das duas e continua crescendo, por isso o player a busca de novo a cada poucos segundos para obter novos segmentos. Um manifesto DASH declara type="dynamic" enquanto a transmissão está no ar e type="static" quando já é uma gravação. Um stream MP3 ou AAC de um servidor Icecast não tem duração alguma; simplesmente nunca para.
No código, GET /v1/transcriptions/probe?url= resolve isso antes que qualquer coisa seja armazenada. O kind da resposta é live para uma live do YouTube no ar ou agendada, um stream HTTP sem fim, uma playlist HLS sem fim ou um manifesto DASH dinâmico. É file para tudo o que tem fim, e unknown quando a sondagem não consegue distinguir. Quando o link não abriu como mídia, ok é false e problem é uma frase que você pode mostrar. A sondagem não guarda nada e está limitada a 60 chamadas por minuto.
As transcrições de arquivos rodam muitas vezes mais rápido do que o áudio toca, então uma hora de televisão já encerrada não leva uma hora. Um stream ao vivo é transcrito em tempo real, mas o "tempo real" já fica atrás da transmissão, e vale saber o quanto. Um stream Icecast chega a um player alguns segundos depois do microfone. HLS e DASH são segmentados, e um player não começa a tocar antes de acumular dois ou três segmentos de cerca de seis segundos cada; por isso, um stream HLS costuma ficar de 10 a 30 segundos atrás da transmissão, antes de a transcrição acrescentar o próprio atraso. Uma linha que parece chegar tarde geralmente é o atraso da emissora, não o da transcrição. Cada stream gera uma gravação; uma mesa de redação executa vários, e todos acabam no mesmo lugar.
Cada transcrição ao vivo vai para a biblioteca Transcriptions, ao lado de todos os arquivos. Cada gravação é guardada com a sua transcrição e, quando as palavras estão finalizadas, recebe um título e um resumo, em todos os idiomas. O idioma falado é detectado automaticamente, e os falantes podem trocar de idioma a qualquer momento. Quando você sabe o idioma, indicá-lo melhora a qualidade da transcrição.
A biblioteca pode ser pesquisada entre idiomas: busque em todas as transcrições, qualquer que seja o idioma, e receba os resultados no seu. Um repórter que lê só inglês pode pesquisar o programa matinal da emissora romena pelo nome de um ministro e ler os resultados em inglês, cada um com a transcrição de origem e o momento em que foi dito. O nome do ministro vai aparecer grafado de três formas em três emissoras; pesquisá-lo em inglês poupa a leitura de todas as três.
Uma transcrição pode ser traduzida para até 10 idiomas de uma só vez, de modo que a mesma gravação possa ser lida em todos os idiomas com que a redação trabalha. Um resultado de busca só é útil se você puder citá-lo.
Uma transcrição não é um bloco de texto corrido. A rota GET /v1/recordings/{id}/transcript da API retorna sentences, segments com o tempo de cada palavra e speakers, de modo que uma citação pode ser situada com precisão de segundo na gravação. O Painel reproduz uma gravação ao vivo exatamente como chegou, com o áudio, para que uma frase possa ser ouvida antes de ser citada.
Antes de confiar em qualquer transcrição de áudio de rádio, de qualquer sistema, vale saber duas coisas. O reconhecimento de fala tropeça mais em nomes próprios, lugares e números, justamente o que um repórter pesquisa. Um nome que o reconhecedor nunca viu sai como a palavra comum mais próxima, e uma busca pela grafia correta não o encontra. Em vez disso, pesquise uma palavra distintiva dita na mesma fala e leia o trecho em volta do resultado. E rádio não é só fala: trilhas musicais, vinhetas e blocos publicitários produzem linhas que parecem frases, mas não são. Ouça o áudio antes de citar.
Os rótulos de falantes têm três configurações: desligado, ligado ou When Needed, que mostra os rótulos quando um segundo falante é ouvido. Você pode dar nome a um falante em uma gravação (PUT /v1/recordings/{id}/speakers/{idx}), e, depois que a voz de um falante é cadastrada, as gravações seguintes o reconhecem pelo nome. Para uma emissora cujos apresentadores voltam todas as manhãs, os rótulos deixam de ser "Speaker 2" na primeira semana. Depois que a citação é conferida, ela precisa sair da redação.
Cada formato na aba Export de uma transcrição tem uma função em uma redação. O SRT vai para o editor de vídeo, para que um clipe do stream leve legendas; um SRT traduzido as leva em outro idioma. O Excel vai para o pesquisador, com uma linha por frase e o seu horário, para ser filtrado e anotado. O PDF vai para o editor que quer ler a hora inteira no trem. O JSON vai para quem está escrevendo as ferramentas internas da redação. Pela API, a exportação é GET /v1/recordings/{id}/export?format=srt|json|xlsx|pdf, com lang= para uma versão traduzida. Download audio entrega a gravação como MP3 para o próprio pacote de reportagem.
Acompanhar uma transmissão para fazer reportagem é prática comum em redações. Republicar um trecho dela é outra coisa. Isso é regido pelo uso justo (fair dealing ou fair use) onde você estiver e pelos termos da própria emissora, de modo que as regras habituais da redação sobre citar um concorrente também valem para o áudio do concorrente. Tudo o que foi descrito acima leva alguns cliques no Painel; para uma redação com vinte emissoras, é melhor automatizar.
O caminho inteiro está na API, incluído em todos os planos e cobrado com a mesma tarifa do Painel. Uma transcrição ao vivo com um stream como fonte é criada em espera, iniciada pela sua primeira gravação e controlada por HTTP. Como o servidor puxa o áudio, iniciar a gravação não retorna nenhum stream para você publicar: do seu lado, nada envia áudio.
API=$VOCALSTACK_API_ORIGIN # the origin shown in the API reference
AUTH="Authorization: Bearer $VOCALSTACK_API_KEY"
# A live transcription whose source the server pulls itself.
TX=$(jq -n '{name: "Morning show", source: {kind: "stream", url: "https://example.org/live.mp3"},
settings: {speakerLabels: "auto"}}' \
| curl -sSf "$API/v1/transcriptions/live" -H "$AUTH" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" -d @- | jq -r .id)
# Start recording: the server opens the stream now.
REC=$(curl -sSf -X POST "$API/v1/transcriptions/$TX/recordings" -H "$AUTH" \
-H "Content-Type: application/json" -d '{}' | jq -r .recording.id)
# Later: pause, then stop (a live recording must be paused before it is stopped).
curl -sSf -X POST "$API/v1/recordings/$REC/pause" -H "$AUTH"
curl -sSf -X POST "$API/v1/recordings/$REC/stop" -H "$AUTH" -H "Content-Type: application/json" -d '{}'
# Search everything that was said, in English.
curl -sSfG "$API/v1/search" -H "$AUTH" --data-urlencode "q=budget" --data-urlencode "lang=en"
O Idempotency-Key faz com que uma criação repetida retorne a primeira transcrição, em vez de criar uma segunda. Os SDKs em TypeScript e Python encapsulam as mesmas chamadas e são baixados na área Developers; a referência da API tem todas as rotas e seus frames.
Um agente de IA pode trabalhar com a biblioteca sem nenhum código. O servidor MCP em /v1/mcp oferece ao agente um conjunto de ferramentas; entre elas, quatro são relevantes aqui. search_transcriptions pesquisa o que foi dito em todas as transcrições da conta, em qualquer idioma, e retorna as linhas correspondentes, cada uma com a transcrição a que pertence e o momento em que foi dita. get_summary retorna o resumo de uma gravação. transcribe_url e wait_for_transcription transcrevem um vídeo encerrado ou o link de uma gravação e aguardam o resultado. Iniciar um monitor de stream ao vivo continua sendo função do Painel ou da API acima. A configuração para Claude Code, Cursor ou qualquer cliente Streamable HTTP fica em Developers → Connect an AI agent; o artigo sobre MCP explica o passo a passo. Quanto custa rodar o script é a última pergunta.
Transcrição ao vivo custa $0.60 por hora de áudio, cobrada por segundo ($0.01 por minuto), com um mínimo de 5 minutos por transcrição. Transcrições ao vivo custam mais do que as de arquivo porque são feitas enquanto o conteúdo acontece, pelo tempo em que estiverem rodando. Arquivos custam $0.20 por hora ($0.0033 por minuto; um arquivo de 30 minutos custa $0.10). As tarifas são as mesmas em todos os planos e pela API, e traduções, resumos, nomeação de falantes, criação de transmissões e compartilhamento nunca acrescentam nada à conta.
Uma emissora monitorada oito horas por dia, cinco dias por semana, representa 40 horas ao vivo: $24 por semana, qualquer que seja o número de idiomas em que a redação a lê.
Os limites que importam para o monitoramento variam conforme o plano. Cada um é listado na ordem Pague conforme o uso, Premium, Enterprise:
Uma conta nova começa com $5 de crédito de cadastro e sem cartão, o que dá mais de oito horas de monitoramento ao vivo para experimentar. A tabela completa está na página de preços.