InícioBlog → 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

Publicado em 2026-08-20 · 5 min de leitura

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

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átis

Perguntas 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