【问题标题】:Can't open Microsoft Speech Recognition API via Post with Delphi无法使用 Delphi 通过 Post 打开 Microsoft Speech Recognition API
【发布时间】:2018-03-03 19:55:00
【问题描述】:

我想在 Delphi 中使用 Indy 的 TIdHTTP 通过 HTTPS 向 Microsoft Speech Recognition API 发送 Post 请求。

在微软的语音识别 API 页面上:Microsoft Speech Recognition API Get started with speech recognition by using the REST API

他们写道,您应该像这样发送 HTTP POST 请求:

POST     https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1
Accept: application/json;text/xml
Content-Type: audio/wav; codec=audio/pcm; samplerate=16000
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
Host: speech.platform.bing.com
Transfer-Encoding: chunked
Expect: 100-continue

我用 Delphi XE 10 Indy 试试这个。

但我曾经收到错误 400 - 作为答案的错误请求!

我在下面的代码中做错了什么?

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, csrf, url: String;
  PostStream: TIdMultipartFormDataStream;

  HTTPClient: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;


begin
  url := 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed HTTP/1.1';

  HTTPClient := TIdHTTP.Create;
  try
    HTTPClient.Disconnect;
    HTTPClient.AllowCookies := True;
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
    SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTPClient.IOHandler := SSL;
    HTTPClient.HandleRedirects := true;

    HTTPClient.Request.Accept := 'application/json;text/xml';
    HTTPClient.Request.Method := 'POST';
    HTTPClient.Request.ContentType := 'audio/wav; codec=audio/pcm;   samplerate=16000';

    //-----------------------------------------------------------------------


    PostStream := TIdMultiPartFormDataStream.Create;
    try
      PostStream.AddFormField('Ocp-Apim-Subscription-Key','YOUR_SUBSCRIPTION_KEY');

      PostStream.AddFile('file', 'test.wav');


      Response := HTTPClient.Post(url, PostStream);

      PostStream.Clear;


    finally
     PostStream.Free;
    end;

  finally
    HTTPClient.Free;
  end;
end;

【问题讨论】:

  • 做一些调试。你的代码传递了什么?
  • @David:我在代码中做错了什么?
  • 做一些调试。您的发布请求是什么样的。
  • 没有。我正在帮助您学习如何调试。检查您实际发布的内容。这是调试的起点。该网站不存在为您完成工作。
  • 如果您查看了实际的发布请求,您会发现它与规范不符。这正是雷米告诉你的。当然,他为你做了你的工作,给了你代码,现在你有了工作代码,但你什么也没学到。您仍然不知道如何调试。这意味着下次遇到困难时,您会回到这里要求其他人编写您的代码。如果你学会了调试,你就能解决自己的问题。

标签: delphi ssl https speech indy10


【解决方案1】:

您的 POST 请求未按照 Microsoft 文档所述的方式设置。最重要的是,您根本不应该使用 TIdMultipartFormDataStream,因为 REST 服务器不希望收到 multipart/form-data 格式的请求。请求的主体应该是只是实际的 WAV 文件,没有别的。 TIdHTTP 甚至有 Post() 的重载,专门用于上传文件。

试试这个:

procedure TForm1.Button1Click(Sender: TObject);
var
  Response, url: String;
  HTTPClient: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  url := 'https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=en-US&format=detailed';

  HTTPClient := TIdHTTP.Create;
  try
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
    SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    HTTPClient.IOHandler := SSL;

    HTTPClient.AllowCookies := True;
    HTTPClient.HandleRedirects := true;

    HTTPClient.Request.Accept := 'application/json;text/xml';
    HTTPClient.Request.ContentType := 'audio/wav; codec=audio/pcm; samplerate=16000';
    HTTPClient.Request.CustomHeaders.Values['Ocp-Apim-Subscription-Key'] := 'YOUR_SUBSCRIPTION_KEY';

    Response := HTTPClient.Post(url, 'test.wav');
  finally
    HTTPClient.Free;
  end;
end;

【讨论】:

  • 你好雷米,你是最棒的。是的,这段代码工作正常。非常感谢。
  • @Ingo:那你为什么不接受雷米的回答?
猜你喜欢
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
相关资源
最近更新 更多