首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >接受api中的音频文件

接受api中的音频文件
EN

Stack Overflow用户
提问于 2018-04-24 17:40:57
回答 2查看 3.2K关注 0票数 1

我试图将我的API转换成接受音频文件而不是字符串,但是在查看了它之后,我找不到一个合适的例子来说明如何这样做。

目前,语音到文本服务在本地运行,但我想将其移到服务器上。我已经进行的对wit.ai服务的API调用。剩下的就是让API接受一个音频文件(音频总是.wav)。

如果有人有什么建议让我知道我被困在这件事上了

代码语言:javascript
复制
[Produces("application/json")]
[Route("api")]
public class CommandApiController : Controller
{
    // constructor

    [HttpPost]
    public async Task<IActionResult> ProcessCommandAsync([FromBody]string command)
    {
        // Testing SpeechToText method
        string path = @"C:\Users\rickk\Desktop\SmartSpeaker\agenda.wav";
        // Overridden for now  
        command = await CovnvertSpeechToTextApiCall(new ByteArrayContent(System.IO.File.ReadAllBytes(path)));

        // Logic

    }


    async Task<string> CovnvertSpeechToTextApiCall(ByteArrayContent content)
    {
        var httpClient = new HttpClient();

        content.Headers.ContentType = MediaTypeHeaderValue.Parse("audio/wav");

        // Wit.ai server token
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);
        var httpResponseMessage = await httpClient.PostAsync("https://api.wit.ai/speech", content);
        if (httpResponseMessage.IsSuccessStatusCode)
        {
            var response = await httpResponseMessage.Content.ReadAsStringAsync();
            var modeldata = Newtonsoft.Json.JsonConvert.DeserializeObject<Model.DeserializedJsonDataModel>(response);

            return modeldata._text;
        }
        else
        {
            return null;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-26 14:00:26

谢谢你的评论。

不完全是我想要的,但这是我的错,因为我没有正确解释它。以下是我找到的解决办法。

代码语言:javascript
复制
    [Produces("application/json")]
    [Route("api/audio")]
    [HttpPost]
    public async Task<IActionResult> ProcessCommandAsync([FromForm]IFormFile command)
    {  
        if(command.ContentType != "audio/wav" && command.ContentType != "audio/wave" || command.Length < 1)
        {
            return BadRequest();
        }
        var text = await CovnvertSpeechToTextApiCall(ConvertToByteArrayContent(command));

        return Ok(FormulateResponse(text));
    }


    private ByteArrayContent ConvertToByteArrayContent(IFormFile audofile)
    {
        byte[] data;

        using (var br = new BinaryReader(audofile.OpenReadStream()))
        {
            data = br.ReadBytes((int) audofile.OpenReadStream().Length);
        }

        return new ByteArrayContent(data);
    }
票数 0
EN

Stack Overflow用户

发布于 2018-04-24 17:58:09

可以使用Asp.net轻松地将文件上载到IFormFile核心web中,如下所示,在post操作中接受以前类型的参数

代码语言:javascript
复制
    [HttpPost]
    public async Task<IActionResult> UploadAudioFile(IFormFile file)
    {
        /* 
         * the content types of Wav are many
         * audio/wave
         * audio/wav
         * audio/x-wav
         * audio/x-pn-wav
         * see "https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types"
        */
        if (file.ContentType != "audio/wave")
        {
            return BadRequest("Wrong file type");
        }
        var uploads = Path.Combine(HostingEnvironment.WebRootPath, "uploads");//uploads where you want to save data inside wwwroot
        var filePath = Path.Combine(uploads, file.FileName);
        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(fileStream);
        }
        return Ok("File uploaded successfully");
    }

您需要使用依赖项注入在控制器构造函数中请求IHostingEnvironment对象,如下所示:

代码语言:javascript
复制
public FileController(IHostingEnvironment hostingEnvironment)
    {
        HostingEnvironment = hostingEnvironment;
    }

然后将其分配给控制器内的属性。

此外,不要忘记将来自客户端的请求作为多部分表单发送,如下(示例):

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50007820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档