Azure 文本到语音转换突然开始"400 Bad Request"返回



我以这种格式成功使用了几个月的 Azure 文本到语音转换 API:

<speak version='1.0' xmlns='w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='Microsoft Server Speech Text to Speech Voice (fi-FI, HeidiRUS)'>My text</voice></speak>

但突然间,这个请求开始返回:

HTTP/1.1 400 错误请求

我们成功地使用了几个月的同一个请求(当然有不同的短语(,但就在几周前,同一个请求开始返回此错误。我没有获得任何其他信息,所以我不知道去哪里看。Azure 文档 说:

必需参数缺失、为空或为 null。或者,传递的值 到必需或可选参数无效。常见问题 是一个太长的标头。

我还尝试通过添加性别和语言并用双引号替换单引号来使请求更具体,但没有用:

<speak version="1.0" xmlns="w3.org/2001/10/synthesis" xml:lang="fi-FI" xml:gender="Female"><voice name="Microsoft Server Speech Text to Speech Voice (fi-FI, HeidiRUS)">Text.</voice></speak>

API 中是否发生了更改?或者我的请求中缺少什么?

当我发送以下有效负载时,我得到了 200 OK 和正确的内容:

<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='Microsoft Server Speech Text to Speech Voice (fi-FI, HeidiRUS)'>This is my test</voice></speak>

这是我发送此内容的 C# 代码:

// Generate request
string body = $@"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='{voiceLang}'><voice name='{voiceName}'>{text}</voice></speak>";
using (var client = new HttpClient())
{
using (var request = new HttpRequestMessage())
{
// Set the HTTP method
request.Method = HttpMethod.Post;
// Construct the URI
request.RequestUri = new Uri(ttsHostUri);
// Set the content type header
request.Content = new StringContent(body, Encoding.UTF8, "application/ssml+xml");
// Set additional header, such as Authorization and User-Agent
request.Headers.Add("Authorization", "Bearer " + accessToken);
request.Headers.Add("Connection", "Keep-Alive");
// Update your resource name
request.Headers.Add("User-Agent", "YOUR_RESOURCE_NAME");
request.Headers.Add("X-Microsoft-OutputFormat", "riff-24khz-16bit-mono-pcm");
// Create a request
using (var response = await client.SendAsync(request).ConfigureAwait(false))
{
response.EnsureSuccessStatusCode();
// Asynchronously read the response
using (var dataStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
// ... Process your audio here
}
}
}
}

我可以在我们的有效负载上看到的唯一区别是xmlns值,其中我有一个完整的 url(带有 http://(,而你的没有得到它。

错误可能出在其他地方:是否确定在查询终结点时对自己进行身份验证?

我们也突然收到 400 错误,在我们的例子中,我们错过了封装 XML 请求的文本

<![CDATA[ your text here ]]>

在代码中执行此操作后,用户不再报告400个错误。

最新更新