2016-08-11 1 views
1

J'essaie d'envoyer une demande de publication HTTP à l'API Microsoft Bing pour transcrire un fichier audio. Nous devons d'abord envoyer une demande de post pour obtenir un "jeton d'accès" en guise de réponse, puis ce jeton est utilisé (en tant qu'autorisation "dans une autre demande de post pour télécharger le fichier réel et obtenir la transcription dans la réponse. demande de poste et obtenir avec succès le jeton d'accès, mais je ne suis pas en mesure d'obtenir une réponse raisonnable pour ma deuxième demande de poste, je suis cette page. https://www.microsoft.com/cognitive-services/en-us/speech-api/documentation/api-reference-rest/bingvoicerecognitionEnvoi d'une requête HTTP en C# à l'API de discours Microsoft Bing

Ceci est la deuxième demande de poste:

 Guid requestId = Guid.NewGuid(); 
     var Uri = @"https://speech.platform.bing.com/recognize?version=3.0&requestid=" + requestId.ToString() + @"&appID=D4D52672-91D7-4C74-8AD8-42B1D981415A&format=json&locale=en-US&device.os=Windows%20OS&scenarios=ulm&instanceid=f1efbd27-25fd-4212-9332-77cd63176112"; 
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Uri); 

     request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken)); 
     request.Headers.TryAddWithoutValidation("Content-Type", @"audio/wav; samplerate=16000"); 
     MemoryStream ms = new MemoryStream(); 
     using (var fs = System.IO.File.OpenRead("audio.wav")) 
     { 
      byte[] buffer = new byte[1024 * 8]; 
      while (fs.Read(buffer, 0, buffer.Length) > 0) 
      { 
       ms.Write(buffer, 0, buffer.Length); 
      } 
      fs.Close(); 
     } 
     ms.Seek(0, SeekOrigin.Begin); 

     HttpContent _Body = new StreamContent(ms); 
     request.Content = _Body; 
     var client2 = new HttpClient(); 
     var response2 = client2.SendAsync(request); 

I suppose que le problème est l'endroit où je définis le "Content-Type" pour l'en-tête.La raison est quand je débogue, je ne vois pas cette propriété étant définie dans l'en-tête de la demande.En fait, il n'y a pas de Content-Type l'en-tête. p serait apprécié. Cette page, qui parle de la commande équivalente curl, peut également être utile: https://social.msdn.microsoft.com/Forums/en-US/ad73e4f1-e576-4080-9fe7-060cc2f583ca/microsoft-bing-voice-recognition-api-authorization-404resource-not-found?forum=SpeechService

Répondre

1

Content-Type est un en-tête lié au contenu. Le code suivant fonctionne pour moi:

public async Task<string> SendRequestAsync(string url, string bearerToken, string contentType, string fileName) 
{ 
    var content = new StreamContent(File.OpenRead(fileName)); 
    content.Headers.TryAddWithoutValidation("Content-Type", contentType); 

    using (var httpClient = new HttpClient()) 
    {   
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken); 
     var response = await httpClient.PostAsync(url, content); 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 

L'invocation dans votre cas (si vous travaillez dans un contexte synchrone):

var result = SendRequestAsync(Uri, accessToken, "audio/wav; samplerate=16000", "audio.wav").Result; 
1

Vous pouvez envoyer l'en-tête suivant à la place, ne pas avoir à faire 2 demandes à cause du jeton.

Si vous voulez ne pas avoir à se connecter à chaque fois au lieu d'utiliser l'en-tête 'Authorization': 'Bearer {TOKEN}' vous pouvez utiliser le 'Ocp-Apim-Subscription-Key': '{YOUR AZURE TOKEN}' afin de ne pas avoir à faire une usine d'autorisation ou plusieurs demandes que nécessaire à l'application et la rendre plus rapide

REMARQUE: {TOKEN} est un jeton JWT comme

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6Imh0dHBzOi8vc3BlZWNoLnBsYXRmb3JtLmJpbmcuY29tIiwic3Vic2NyaXB0aW9uLWlkIjoiZmFhZTNlYTkxNmI1NGMxZWEyODY4MDlhYTg3ZWE1MmUiLCJwcm9kdWN0LWlkIjoiQmluZy5TcGVlY2guUHJldmlldyIsImNvZ25pdGl2ZS1zZXJ2aWNlcy1lbmRwb2ludCI6Imh0dHBzOi8vYXBpLmNvZ25pdGl2ZS5taWNyb3NvZnQuY29tL2ludGVybmFsL3YxLjAvIiwiYXp1cmUtcmVzb3VyY2UtaWQiOiIiLCJpc3MiOiJ1cm46bXMuY29nbml0aXZlc2VydmljZXMiLCJhdWQiOiJ1cm46bXMuc3BlZWNoIiwiZXhwIjoxNTAwODgxNjIzfQ.KdlCrIJ_H0jxs1yyeyYxYR7ucbLuFKT__ep7lGJmGbU 

NOTE2: {VOTRE AZURE TOKEN} est comme d5kals90935b40809dc6k38533c21e85 et vous le trouvez here

Les reques t ressemblerait à ceci:

curl -v -X POST "https://speech.platform.bing.com/speech/recognition/interactive/cognitiveservices/v1?language=es-ES&locale=es-ES&format=simple&requestid=req_id" -H "Ocp-Apim-Subscription-Key: d5kals90935b40809dc6k38533c21e85" -H 'Transfer-Encoding: chunked' -H 'Content-type: audio/wav; codec="audio/pcm"; samplerate=8000' --data-binary @"{BINAYFILE}.wav"