在自定义 WebAPi 中调用 Azure Speech API 时进入无限循环
Posted
技术标签:
【中文标题】在自定义 WebAPi 中调用 Azure Speech API 时进入无限循环【英文标题】:Azure Speech API gets into an endless loop when called inside a custom WebAPi 【发布时间】:2021-03-13 16:52:59 【问题描述】:让我解释一下场景-
我为具有多个参数的应用程序创建了一个自定义 Web API,用户通过传递基于某些逻辑连接的多个参数来调用此 api,然后在此自定义 api 中调用 Azure 语音 API 将文本转换为语音(分两步 - 1. 我调用 Azure 语音服务获取令牌,2. 我调用 Azure 语音服务将文本转换为语音)
问题 - 当我调用 Azure 语音服务来获取令牌时,它一直处于无限循环中。
以下是示例代码,任何正确方向的指针都会有所帮助-
public class ConverterController : ApiController
/// <summary>
/// default constructor
/// </summary>
public ConverterController()
[HttpGet]
public HttpResponseMessage ConvertUsingSpeech([FromUri] OutReachMessage outReachMessage)
try
outReachMessage = new OutReachMessage();
var result = ConvertUsingSpeechApi(outReachMessage);
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StringContent(OutputMp3FilePath);
return response;
catch (Exception ex)
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
async Task ConvertUsingSpeechApi(OutReachMessage outReachMessage)
var authObj = new Authentication("key");
var token = authObj.GetAccessToken();
using (var client = new HttpClient())
client.DefaultRequestHeaders.Add("Authorization", token);
client.DefaultRequestHeaders.Add("Content-Type", contentType);
client.DefaultRequestHeaders.Add("X-Microsoft-OutputFormat", outputFormat);
UriBuilder uriBuilder = new UriBuilder(fetchSpeechUri);
var content = new StringContent("<speak version='1.0' xml:lang='hi-IN'><voice xml:lang='hi-IN' xml:gender='Female' name = 'hi-IN-SwaraNeural'>" +
"Welcome mahesh to the world of Azure - feeling great. </voice></speak>",
Encoding.UTF8, "text/xml");
var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, content);
using (var response = client.PostAsync(uriBuilder.Uri.AbsoluteUri, content).Result)
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
string fileToWriteTo = OutputMp3FilePath;
using (Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create))
await streamToReadFrom.CopyToAsync(streamToWriteTo);
身份验证类 - 获取令牌
public class Authentication
public static readonly string FetchTokenUri =
"https://centralindia.api.cognitive.microsoft.com/sts/v1.0/issueToken";
private string subscriptionKey;
private string token;
public Authentication(string subscriptionKey)
this.subscriptionKey = subscriptionKey;
this.token = FetchTokenAsync(FetchTokenUri, subscriptionKey).Result;
public string GetAccessToken()
return this.token;
private async Task<string> FetchTokenAsync(string fetchUri, string subscriptionKey)
using (var client = new HttpClient())
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
UriBuilder uriBuilder = new UriBuilder(fetchUri);
var result = await client.PostAsync(uriBuilder.Uri.AbsoluteUri, null);
Console.WriteLine("Token Uri: 0", uriBuilder.Uri.AbsoluteUri);
return await result.Content.ReadAsStringAsync();
注意 - 我可以使用邮递员和控制台应用程序调用 Azure Speech api,但只有当我在我的自定义 webapi 中调用 azure 服务时它才不起作用。
【问题讨论】:
如果您需要进一步的帮助,请告诉我。 如果我的回复有帮助,请采纳为答案(点击回复旁边的标记选项将其从灰色切换为填写。),请参阅meta.stackexchange.com/questions/5234/… 【参考方案1】:如下更改代码,删除string subscriptionKey
。它会起作用的。
public Authentication()
this.subscriptionKey = subscriptionKey;
this.token = FetchTokenAsync(FetchTokenUri, subscriptionKey).Result;
【讨论】:
以上是关于在自定义 WebAPi 中调用 Azure Speech API 时进入无限循环的主要内容,如果未能解决你的问题,请参考以下文章
Azure 自定义视觉:是不是可以在自定义视觉环境中存储图像元数据(不是标签)?
无需用户代表从自定义 azure webapp api 调用 azure DevOps API