首页 → 博客 → 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,否则中文变问号。
- 响应格式。再加一个 StringContent 传 response_format,就能拿到 srt、vtt 或带时间的分段。
- 密钥。放配置里,不要提交进版本库。
用你自己的录音试一试。 注册只需一分钟,免费额度足够判断识别质量。
免费获取 API 密钥常见问题
必须用官方客户端吗?
不必,标准库的 HttpClient 完全够用。项目里已经在用客户端时它更顺手。
长文件为什么超时?
HttpClient 默认等一百秒。贴近体积上限的文件请设两三分钟。
怎么拿到带时间的分段?
加一个 response_format 字段,值为 verbose_json,响应里就会带上每句的起止时间。
适合放进后台服务吗?
适合,常见做法就是带队列的托管服务,并按套餐上限限制并发。
相关阅读
- 如何把通话录音转成文字 — 分步教程:几分钟内通过 API 把电话录音转成文字,包含 Python 和 C# 代码示例、响应格式说明,以及常见错误的处理办法。
- 转录 API 的报错分别代表什么 — 逐个解释转录接口的状态码:401、400、413、429、502 各自的原因和修法,以及哪些失败值得自动重试。
- Java 里的语音转文字:标准 HttpClient 代码 — 从 Java 发送转录请求:用内置 HttpClient 拼 multipart 请求体、解析响应、设置超时,以及服务中的错误处理。