Azure Text to Speech неожиданно начал возвращать "400 Bad Request" - PullRequest
0 голосов
/ 26 сентября 2019

Я успешно использовал 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 Badrequest

Мы успешно использовали один и тот же запрос в течение нескольких месяцев (конечно, с другой фразой), но всего несколько недель назад тот же запрос начал возвращать эту ошибку.Я не получаю никакой дополнительной информации, поэтому не знаю, где искать.Документация Azure гласит:

Обязательный параметр отсутствует, пуст или пуст.Или значение, переданное в обязательный или необязательный параметр, недопустимо.Распространенной проблемой является слишком длинный заголовок.

Я также попытался сделать запрос более конкретным, добавив пол и язык и заменив одинарные кавычки на двойные, но без использования:

<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?Или чего не хватает в моем запросе?

1 Ответ

0 голосов
/ 26 сентября 2019

Я получил 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://), тогда как у вас его нет.

Ошибка может быть в другом месте: вы уверены, что аутентифицируете себяпри запросе конечной точки?

...