Início → Blog → Voz para texto em C#: conectando a partir do .NET em cinco minutos
Voz para texto em C#: conectando a partir do .NET em cinco minutos
Em casas .NET a necessidade costuma começar pelas chamadas: a telefonia grava as conversas, o CRM guarda as negociações e o texto é o elo que falta. Conectar leva cinco minutos, pelo cliente oficial ou com um HttpClient puro.
Usando o cliente oficial
Se o pacote OpenAI já está no projeto, só muda o endereço:
var options = new OpenAIClientOptions { Endpoint = new Uri("https://voicesscribe.com/v1") };
var client = new OpenAIClient(new ApiKeyCredential(Environment.GetEnvironmentVariable("VS_KEY")), options);
var audio = client.GetAudioClient("whisper-1");
var result = await audio.TranscribeAudioAsync("call.ogg");
Console.WriteLine(result.Value.Text);
O resto continua igual: parâmetros, leitura da resposta e tipos de exceção não mudam.
Sem pacotes de terceiros
Quando você prefere não adicionar dependência, o HttpClient basta:
using var http = new HttpClient { Timeout = TimeSpan.FromMinutes(3) };
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("VS_KEY"));
using var form = new MultipartFormDataContent();
using var stream = File.OpenRead("call.ogg");
var file = new StreamContent(stream);
file.Headers.ContentType = new MediaTypeHeaderValue("audio/ogg");
form.Add(file, "file", "call.ogg");
form.Add(new StringContent("whisper-1"), "model");
var response = await http.PostAsync("https://voicesscribe.com/v1/audio/transcriptions", form);
var json = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new InvalidOperationException($"erro {(int)response.StatusCode}: {json}");
using var doc = JsonDocument.Parse(json);
Console.WriteLine(doc.RootElement.GetProperty("text").GetString());
O nome do arquivo em form.Add é obrigatório — é ele que identifica o formato do áudio.
Lidando com um fluxo de chamadas
A telefonia entrega gravações em lotes, então o trabalho pertence a um serviço em segundo plano. Formato prático: fila de tarefas, limite de paralelismo com SemaphoreSlim, retentativas com pausa crescente para falhas temporárias e o resultado gravado no card da negociação.
Crie um HttpClient por aplicação — via IHttpClientFactory ou campo estático. Uma instância nova por requisição esgota sockets sob carga, e esse é o erro clássico do .NET.
Detalhes que mordem
- Tempo limite. O padrão é cem segundos, pouco para gravação longa. Aumente.
- Codificação. As respostas são UTF-8; ajuste Console.OutputEncoding no Windows ou acentos viram interrogações.
- Formato da resposta. Adicione response_format como outro StringContent para obter srt, vtt ou segmentos com tempo.
- Segredos. Guarde a chave na configuração, fora do controle de versão.
Teste com as suas próprias gravações. O cadastro leva um minuto e os minutos gratuitos bastam para avaliar a qualidade.
Obter uma chave de API grátisPerguntas frequentes
O cliente oficial é obrigatório?
Não, o HttpClient da biblioteca padrão é plenamente suficiente. O cliente é cômodo quando o projeto já o usa.
Por que arquivos longos estouram o tempo?
O HttpClient espera cem segundos por padrão. Para arquivos no limite de tamanho use dois ou três minutos.
Como obter segmentos com tempo?
Adicione o campo response_format com verbose_json e a resposta traz início e fim de cada fala.
Serve para um serviço em segundo plano?
Serve, e o padrão usual é um serviço hospedado com fila e limite de paralelismo conforme o seu plano.
Leitura relacionada
- Como transcrever a gravação de uma chamada — Guia passo a passo para transformar a gravação de uma ligação em texto pela API em poucos minutos. Com exemplos em Python e C# e a lista de erros mais comuns.
- Erros da API de transcrição e o que eles realmente significam — Explicação dos códigos de status da API: por que aparecem 401, 400, 413, 429 e 502, como corrigir cada um e quais falhas vale a pena repetir.
- Voz para texto em Java: código no HttpClient padrão — Como enviar áudio para transcrição a partir do Java: montar a requisição multipart no HttpClient nativo, ler a resposta, tempos limite e tratamento de erros.