ГлавнаяБлог → Распознавание речи в C#: подключение из .NET за пять минут

Распознавание речи в C#: подключение из .NET за пять минут

Опубликовано 2026-08-20 · 5 мин чтения

В корпоративных системах на .NET расшифровка звонков нужна чаще всего: телефония пишет разговоры, CRM хранит сделки, между ними не хватает текста. Подключение занимает пять минут — либо через официальный клиент, либо на голом HttpClient.

Через официальный клиент

Если в проекте уже стоит пакет OpenAI, достаточно указать другой адрес:

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);

Остальной код остаётся прежним: параметры, разбор ответа и типы исключений те же.

Без сторонних пакетов

Когда тянуть зависимость не хочется, хватает HttpClient:

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($"ошибка {(int)response.StatusCode}: {json}");

using var doc = JsonDocument.Parse(json);
Console.WriteLine(doc.RootElement.GetProperty("text").GetString());

Имя файла в form.Add обязательно: по нему определяется формат записи.

Обработка потока звонков

Телефония отдаёт записи пачками, поэтому обработку ставят в фоновую службу. Практичная схема: очередь заданий, ограничение параллельности через SemaphoreSlim, повтор временных ошибок с растущей паузой, запись результата в карточку сделки.

HttpClient создавайте один на приложение — через IHttpClientFactory или статическое поле. Новый экземпляр на каждый запрос исчерпывает сокеты под нагрузкой, и это классическая ошибка именно в .NET.

Частые вопросы разработки

Попробуйте на своих записях. Регистрация занимает минуту, бесплатных минут хватает, чтобы оценить качество.

Получить ключ бесплатно

Частые вопросы

Обязателен ли официальный клиент?

Нет, HttpClient из стандартной библиотеки полностью достаточен. Клиент удобнее, если он уже используется в проекте.

Почему падает по тайм-ауту на длинных файлах?

По умолчанию HttpClient ждёт сто секунд. Для записей в лимит размера ставьте две-три минуты.

Как получить сегменты с временем?

Добавьте поле response_format со значением verbose_json — в ответе появятся сегменты с началом и концом каждой реплики.

Подходит ли это для фоновой службы?

Да, обычная практика — фоновая служба с очередью и ограничением параллельности по лимиту вашего тарифа.

Читайте также