SpeakSsmlAsync возвращает BadRequest

При вызове SpeakSsmlAsync (Microsoft Speech SDK) возвращается следующее сообщение об ошибке:

> CANCELED: Reason=Error
> CANCELED: ErrorCode=BadRequest 
> CANCELED: ErrorDetails=[HTTPAPI result code = HTTPAPI_OK. HTTP status code=400.] 
> CANCELED: Did you update the subscription info?

Действия по воспроизведению:

  1. Загрузите образец быстрого запуска из https://github.com/Azure-Samples/cognitive-services-speech-sdk/tree/master/quickstart/text-to-speech/csharp-dotnet-windows

  2. Замените идентификатор подписки и регион собственными значениями, установите активную конфигурацию, как описано в документации, очистите и перестройте проект

  3. Запустите программу и введите текст типа «абракадабра».

    -> Работает нормально (использует SpeakTextAsync)

  4. Заменить SpeakTextAsync на SpeakSsmlAsync

  5. Запустите программу и введите текст

    -> ErrorCode = BadRequest

  6. Повторите попытку с правильным кодом SSML, например <speak version="1.0" xmlns="https://www.w3.org/2001/10/synthesis" xml:lang="en-US">abracadabra</speak> "

    -> ErrorCode = BadRequest

Система

  • .NET Framework 4.6.1
  • Windows 10, сборка 17134
  • Регион обслуживания = "westeurope"

Код

using System;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;

namespace helloworld
{
    class Program
    {

        private static string endpointSpeechKey = "<MyOwnServiceKey>";
        private static string region = "westeurope";

        public static async Task SynthesisToSpeakerAsync()
        {
            var config = SpeechConfig.FromSubscription(endpointSpeechKey, region);
            using (var synthesizer = new SpeechSynthesizer(config))
            {
                Console.WriteLine("Type some text that you want to speak...");
                Console.Write("> ");
                string text = Console.ReadLine();

                using (var result = await synthesizer.SpeakSsmlAsync(text))
                {
                    if (result.Reason == ResultReason.SynthesizingAudioCompleted)
                    {
                        Console.WriteLine($"Speech synthesized to speaker for text [{text}]");
                    }
                    else if (result.Reason == ResultReason.Canceled)
                    {
                        var cancellation = SpeechSynthesisCancellationDetails.FromResult(result);
                        Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

                        if (cancellation.Reason == CancellationReason.Error)
                        {
                            Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                            Console.WriteLine($"CANCELED: ErrorDetails=[{cancellation.ErrorDetails}]");
                            Console.WriteLine($"CANCELED: Did you update the subscription info?");
                        }
                    }
                }

                // This is to give some time for the speaker to finish playing back the audio
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }

        static void Main()
        {
            SynthesisToSpeakerAsync().Wait();
        }
    }
}

Снимок экрана отладки

введите здесь описание изображения


person Frank im Wald    schedule 03.06.2019    source источник


Ответы (2)


Кажется, что Azure принимает SSML только при включении голосовой метки. В противном случае вы получите ошибку http-400.

В приведенном ниже коде вызов SpeakSsmlAsync работает успешно:

text = @"<speak version='1.0' xmlns='https://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='en-US-ZiraRUS'>abracadabra</voice></speak>";
using (var result = await synthesizer.SpeakSsmlAsync(text))

Будьте внимательны при поиске Microsoft SSML. Есть разница между

https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/speech-synthesis-markup

(это то, что вам нужно при программировании с использованием речевых служб Azure) и

https://docs.microsoft.com/en-us/cortana/skills/speech-synthesis-markup-language

person Frank im Wald    schedule 04.06.2019
comment
Насколько я понимаю, голос не является обязательным. Возникает вопрос, почему вы получаете ошибку 400? Может быть, служба речи ищет голос по умолчанию, который не установлен? Я бы отметил это как дефект в документации по речевому сервису и / или использовал бы обратную связь для сообщения. - person Micromuncher; 04.06.2019
comment
@Micromuncher Я только что получил ответ на форуме MSDN, подтверждающий поведение. Они проверит, могут ли они это исправить social.msdn.microsoft.com/Forums/en-US/ - person Frank im Wald; 05.06.2019
comment
Можете ли вы получить аудиофайл, который возвращается и автоматически воспроизводится? Поскольку каждый новый запрос извлекает новый аудиофайл с сервера (даже если текст не изменился), было бы удобно спрятать аудиофайл для последующего использования и воспроизвести его из этого «кеша». Кто-нибудь? - person mramosch; 14.04.2021
comment
@mramosch - да, конечно, это то, что вы обычно делаете. Если это не сработает для вас, возможно, размещение соответствующего вопроса будет правильным решением. - person Frank im Wald; 14.04.2021
comment
Я подумал, что лучше задать вопрос здесь, когда участвуют люди, которые, кажется, обладают необходимыми знаниями, чтобы помочь мне. Обычно, когда я публикую какую-то новую проблему, я вообще не получаю ответа ... - person mramosch; 15.04.2021
comment
@mramosch Понятно, но смею сказать, что и вы не получите ответа. Просто опубликуйте свой вопрос, обязательно добавьте всю релевантную информацию (особенно, какой именно вопрос), добавьте соответствующие теги, и есть шанс, что люди ее найдут. - person Frank im Wald; 15.04.2021

да, служба Azure TTS принимает только SSML с голосовыми тегами.

причина в том, что голосов очень много, поэтому лучше явно указать, какой голос использовать.

person Sheng    schedule 06.12.2019