如何改造API使其接收WAV音频文件而非字符串?
嘿,我来帮你搞定这个API接收WAV文件的问题!看你已经搞定了wit.ai的调用,就差最后一步调整API端点了,下面是具体的实现步骤,基于你的代码片段推测是ASP.NET Core环境:
解决方案:修改API接收WAV音频文件并集成Speech-To-Text
1. 调整API端点的配置
首先得把原来接收字符串的端点改成支持接收音频文件的形式,需要添加[Consumes]特性指定接收multipart/form-data,并把参数换成IFormFile来接收上传的文件:
[ApiController] [Route("api/speech-to-text")] // 替换成你原来的路由 [Produces("application/json")] // 声明这个接口接收multipart/form-data类型的请求(传文件用这个类型) [Consumes("multipart/form-data")] public class SpeechToTextController : ControllerBase { // 注入你已经实现的wit.ai服务实例 private readonly IWitAiService _witAiService; public SpeechToTextController(IWitAiService witAiService) { _witAiService = witAiService; } [HttpPost] public async Task<IActionResult> ProcessAudio([FromForm] IFormFile audioFile) { // 后续的文件验证、处理逻辑都写在这里 } }
2. 验证上传的是合法WAV文件
为了避免收到不符合要求的文件,我们从扩展名和MIME类型两方面做验证:
// 先检查是否上传了文件 if (audioFile == null || audioFile.Length == 0) { return BadRequest("请上传有效的WAV音频文件"); } // 验证文件扩展名 var allowedExtensions = new[] { ".wav" }; var fileExtension = Path.GetExtension(audioFile.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(fileExtension)) { return BadRequest("仅支持WAV格式的音频文件"); } // 验证MIME类型 var allowedMimeTypes = new[] { "audio/wav", "audio/x-wav" }; if (!allowedMimeTypes.Contains(audioFile.ContentType.ToLowerInvariant())) { return BadRequest("上传的文件不是有效的WAV音频"); }
3. 处理音频并调用Speech-To-Text服务
接下来把上传的文件流直接传给wit.ai的API(或者你迁移后的服务器端STT服务),这里是wit.ai的调用示例:
try { // 打开文件的读取流 using var audioStream = audioFile.OpenReadStream(); // 调用你已经实现的wit.ai服务方法,传入音频流 var transcriptionText = await _witAiService.SendAudioForTranscription(audioStream); return Ok(new { TranscribedText = transcriptionText }); } catch (Exception ex) { // 这里可以添加日志记录,方便排查问题 return StatusCode(500, $"处理音频时发生错误:{ex.Message}"); }
如果你还没封装wit.ai的服务,这里给你一个简单的实现参考:
// 先定义接口 public interface IWitAiService { Task<string> SendAudioForTranscription(Stream audioStream); } // 实现类 public class WitAiService : IWitAiService { private readonly HttpClient _httpClient; private readonly string _witApiKey; public WitAiService(HttpClient httpClient, IConfiguration config) { _httpClient = httpClient; _witApiKey = config["WitAi:ApiKey"]; // 从配置文件读取你的wit.ai密钥 _httpClient.BaseAddress = new Uri("https://api.wit.ai/"); // 添加授权头 _httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {_witApiKey}"); } public async Task<string> SendAudioForTranscription(Stream audioStream) { var content = new StreamContent(audioStream); // 设置WAV文件的Content-Type content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("audio/wav"); // 调用wit.ai的语音转文本接口,注意替换成你使用的API版本号 var response = await _httpClient.PostAsync("speech?v=20240101", content); response.EnsureSuccessStatusCode(); // 如果请求失败会抛出异常 // 解析wit.ai的响应,这里的模型对应wit.ai返回的JSON结构 var result = await response.Content.ReadFromJsonAsync<WitAiResponse>(); return result?.Text; } } // 对应wit.ai的响应模型,根据实际返回结构调整 public class WitAiResponse { public string Text { get; set; } // 可以添加其他字段,比如意图、实体等,根据你的需求 }
4. 把服务注册到依赖注入容器
在Program.cs里添加服务注册,让框架能注入你的wit.ai服务:
// 注册HttpClient和WitAiService builder.Services.AddHttpClient<IWitAiService, WitAiService>(client => { client.Timeout = TimeSpan.FromSeconds(30); // 设置超时时间,避免长时间等待 });
5. 额外注意事项
- 文件大小限制:ASP.NET Core默认上传文件大小是30MB,如果需要支持更大的文件,可以在
Program.cs里配置:
builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 100 * 1024 * 1024; // 设置为100MB });
- 本地STT迁移:如果之后要把本地STT服务迁到服务器,只需要把调用wit.ai的部分换成你服务器端STT服务的调用逻辑即可,同样是传入音频流处理。
测试API
你可以用Postman或者curl来测试:
用curl的话,命令大概是这样:
curl -X POST -F "audioFile=@your-local-file.wav" https://your-server-domain/api/speech-to-text
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

