Главная → Блог → Распознавание речи в C#: подключение из .NET за пять минут
Распознавание речи в C#: подключение из .NET за пять минут
В корпоративных системах на .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.
Частые вопросы разработки
- Тайм-аут. Значение по умолчанию — сто секунд, длинной записи не хватит. Ставьте больше.
- Кодировка. Ответ приходит в UTF-8; при выводе в консоль Windows задайте Console.OutputEncoding, иначе кириллица превратится в вопросы.
- Формат ответа. Поле response_format добавляется таким же StringContent — так получают srt, vtt или сегменты с таймкодами.
- Секреты. Ключ храните в конфигурации приложения, а не в исходниках.
Попробуйте на своих записях. Регистрация занимает минуту, бесплатных минут хватает, чтобы оценить качество.
Получить ключ бесплатноЧастые вопросы
Обязателен ли официальный клиент?
Нет, HttpClient из стандартной библиотеки полностью достаточен. Клиент удобнее, если он уже используется в проекте.
Почему падает по тайм-ауту на длинных файлах?
По умолчанию HttpClient ждёт сто секунд. Для записей в лимит размера ставьте две-три минуты.
Как получить сегменты с временем?
Добавьте поле response_format со значением verbose_json — в ответе появятся сегменты с началом и концом каждой реплики.
Подходит ли это для фоновой службы?
Да, обычная практика — фоновая служба с очередью и ограничением параллельности по лимиту вашего тарифа.
Читайте также
- Как расшифровать запись звонка в текст — Пошаговое руководство: как перевести аудиозапись телефонного разговора в текст через API за несколько минут. Примеры кода на Python и C#, разбор ошибок.
- Ошибки API распознавания речи и что они означают — Разбор кодов ответа API транскрибации: почему приходит 401, 400, 413, 429 и 502, как это чинить и как правильно повторять неудачные запросы.
- Распознавание речи на Java: код на стандартном HttpClient — Как отправить аудио на распознавание из Java: multipart-запрос на встроенном HttpClient, разбор ответа, тайм-ауты и обработка ошибок в сервисе.