首页博客 → 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 的经典错误。

会咬人的细节

用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。

免费获取 API 密钥

常见问题

必须用官方客户端吗?

不必,标准库的 HttpClient 完全够用。项目里已经在用客户端时它更顺手。

长文件为什么超时?

HttpClient 默认等一百秒。贴近体积上限的文件请设两三分钟。

怎么拿到带时间的分段?

加一个 response_format 字段,值为 verbose_json,响应里就会带上每句的起止时间。

适合放进后台服务吗?

适合,常见做法就是带队列的托管服务,并按套餐上限限制并发。

相关阅读