Как получить учетные данные для служб когнитивной речи Azure

Я создал Speech Cognitive services на Azure портале и хотел бы подписаться на это руководство. где-то в указанном руководстве есть что-то вроде следующего:

fetch('https://webchat-mockbot.azurewebsites.net/speechservices/token', { method: 'POST' }).

У меня вопрос, на какой адрес заменить эту часть кода? Я пробовал несколько вещей, но безуспешно. Например, я попробовал https://westeurope.api.cognitive.microsoft.com/sts/v1.0/issuetoken и попытался указать один из двух ключей, которые я вижу в разделе Keys and Endpoints, в качестве параметра метода post. Но это не сработало. Я даже пробовал использовать ключ подписки и регион, но это тоже не сработало. Возможно, я использовал неправильный синтаксис.

Буду признателен, если кто-нибудь сможет мне помочь.

Обновление: вот мой обновленный код, у которого все еще есть проблема с микрофоном:

    <!DOCTYPE html>
    <html lang="en-US">

    <head>
<title>Web Chat: Cognitive Services Speech Services using JavaScript</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script crossorigin="anonymous" src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <style>
        html,
        body {
            height: 100%;
        }

        body {
            margin: 0;
        }

        #webchat {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="webchat" role="main"></div>
    <script>
        function createFetchSpeechServicesCredentials() {
            let expireAfter = 0;
            let lastPromise;

            return () => {
                const now = Date.now();

                if (now > expireAfter) {
                    expireAfter = now + 300000;
                    lastPromise =  fetch(
                        'https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken',
                        { method: 'POST', headers: { 'Ocp-Apim-Subscription-Key': 'my_subscription-key-speech-services' } }
                    ).then(
                        res => res.json(),
                        err => {
                            expireAfter = 0;

                            return Promise.reject(err);
                        }
                    );
                }

                return lastPromise;
            };
        }

        const fetchSpeechServicesCredentials = createFetchSpeechServicesCredentials();

        (async function () {

            const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate',
                { method: 'POST', headers: { Authorization: 'Bearer My_direct_line_secret_key1' } });
            const { token } = await res.json();

            const webSpeechPonyfillFactory = await window.WebChat.createCognitiveServicesSpeechServicesPonyfillFactory({
                credentials: fetchSpeechServicesCredentials
            });

            window.WebChat.renderWebChat(
                {
                    directLine: window.WebChat.createDirectLine({ token }),
                    webSpeechPonyfillFactory
                },
                document.getElementById('webchat')
            );

            document.querySelector('#webchat > *').focus();
        })().catch(err => console.error(err));
    </script>
</body>
</html>

Для простоты копирую код, который сработал после долгого обсуждения с @Hury Shen:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <title>Web Chat: Cognitive Services Speech Services using JavaScript</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script crossorigin="anonymous" src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    <style>
        html,
        body {
            height: 100%;
        }

        body {
            margin: 0;
        }

        #webchat {
            height: 100%;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="webchat" role="main"></div>
    <script>


       

        (async function () {

            const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', { method: 'POST', headers: { Authorization: 'Bearer my-directline-secret-key' } });
            const { token } = await res.json();

            let authorizationToken;
            const tokenRes = await fetch(
                'https://westeurope.api.cognitive.microsoft.com/sts/v1.0/issuetoken',
                { method: 'POST', headers: { 'Ocp-Apim-Subscription-Key': 'my-cognitive-services-subscription-key' } }
            );

            if (tokenRes.status === 200) {
                region = 'westeurope', 
                authorizationToken = await tokenRes.text()
            } else {
                return (new Error('error!'))
            }

            const webSpeechPonyfillFactory = await window.WebChat.createCognitiveServicesSpeechServicesPonyfillFactory({
                authorizationToken: authorizationToken,
                region: region 
            });

            window.WebChat.renderWebChat({
                directLine: window.WebChat.createDirectLine({ token }),
                webSpeechPonyfillFactory: webSpeechPonyfillFactory
            }, document.getElementById('webchat'));
        })().catch(err => console.error(err));
    </script>
</body>
</html>

С уважением, Ханна


person user13578    schedule 18.08.2020    source источник


Ответы (1)


Вам необходимо использовать один из ключей в разделе Ключи и Конечные точки в заголовке вашего почтового запроса, но не в качестве параметра вашего почтового запроса. Ниже приведен образец запроса для справки:

const tokenRes = await fetch(
  'https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken',
  { method: 'POST', headers: { 'Ocp-Apim-Subscription-Key': 'yourCognitiveServicesSubscriptionKey' } }
);

if (tokenRes.status === 200) {
  region = 'westus',
  authorizationToken = await tokenRes.text()
} else {
  return (new Error('error!'))
}

Вы также можете проверить это в почтальоне. На скриншоте ниже мой тест, я помещаю ключ в заголовок почтового запроса, но не в Params. введите описание изображения здесь

====================== Обновление ==================== знак равно

Согласно некоторым тестам, я думаю, вам следует использовать адрес конечной точки, как показано ниже:

Если сделать это в одном сервисе приложения, вы должны использовать:

https://webchat-mockbot.azurewebsites.net/directline/token

Код js должен быть:

const res = await fetch('https://webchat-mockbot.azurewebsites.net/directline/token', { method: 'POST' });
const { token } = await res.json();

Если только для теста (выставить ключ на странице), вы должны использовать:

https://directline.botframework.com/v3/directline/tokens/generate

Код js должен быть:

const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', { method: 'POST', headers: { Authorization: 'Bearer your_secret' }});
const { token } = await res.json();

====================== Обновление 2 =================== ==

Вы можете изменить свой код в соответствии с приведенным ниже кодом:

let authorizationToken;
const tokenRes = await fetch(
  'https://westus.api.cognitive.microsoft.com/sts/v1.0/issueToken',
  { method: 'POST', headers: { 'Ocp-Apim-Subscription-Key': 'yourCognitiveServicesSubscriptionKey' } }
);

if (tokenRes.status === 200) {
  authorizationToken = await tokenRes.text()
} else {
  return (new Error('error!'))
}

const webSpeechPonyfillFactory = await window.WebChat.createCognitiveServicesSpeechServicesPonyfillFactory( {
  authorizationToken: authorizationToken
} );

window.WebChat.renderWebChat({
  directLine: directLine,
  webSpeechPonyfillFactory: webSpeechPonyfillFactory
}, document.getElementById('webchat') );
person Hury Shen    schedule 19.08.2020
comment
Спасибо @Hury Shen. Это помогло мне, и сейчас я на шаг вперед :), но на более позднем этапе в моем js-коде появляется еще одна ошибка. Думаю, мой адрес для прямой линии тоже неверен. Не могли бы вы сказать мне, где я могу найти соответствующую конечную точку. Для прямой линии я вижу ключи, нажимая кнопку редактирования. Но когда я использую в качестве адреса конечную точку обмена сообщениями, это не работает. Какая правильная конечная точка? - person user13578; 19.08.2020
comment
Я также пытался следовать приведенным здесь инструкциям: docs.microsoft.com/en-us/azure/bot-service/ Но, к сожалению, все равно безуспешно. - person user13578; 19.08.2020
comment
Привет @ user13578 Не могли бы вы попробовать const res = await fetch('https://directline.botframework.com/v3/directline/tokens/generate', { method: 'POST', headers: { Authorization: 'Bearer your_secret' }}); const { token } = await res.json();. Я не уверен. - person Hury Shen; 19.08.2020
comment
@ user13578 Пожалуйста, обратитесь к обновлению в моем ответе. - person Hury Shen; 19.08.2020
comment
Спасибо еще раз. Это тоже помогло, и я снова на шаг вперед. Раньше символ микрофона не отображался, а теперь отображается, но не работает. Я могу общаться со своим ботом, он правильно подключен по текстовой базе. Но при нажатии на микрофон я вижу это сообщение в веб-консоли: Неподготовлено (в обещании) Ошибка: веб-речевые-когнитивные-сервисы: необходимо указать authorizationToken или subscriptionKey. - person user13578; 19.08.2020
comment
@ user13578 Вы должны указать authorizationToken в своем коде, например const webSpeechPonyfillFactory = await window.WebChat.createCognitiveServicesSpeechServicesPonyfillFactory({ authorizationToken: authorizationToken });. - person Hury Shen; 19.08.2020
comment
@ user13578 authorizationToken находится в первом блоке кода моего ответа. - person Hury Shen; 19.08.2020
comment
@ Я обновил свой пост своим кодом. Не могли бы вы взглянуть на это? - person user13578; 19.08.2020
comment
@ user13578 Укажите authorizationToken вместо credentials в своем createCognitiveServicesSpeechServicesPonyfillFactory коде - person Hury Shen; 19.08.2020
comment
@ user13578 authorizationToken происходит из первого блока кода моего ответа. В вашем коде это может быть authorizationToken: lastPromise.text() - person Hury Shen; 19.08.2020
comment
@ user13578 Пожалуйста, обратитесь к моему обновлению 2. - person Hury Shen; 19.08.2020
comment
Я только что попробовал ваше второе обновление, но оно тоже не сработало. Пришлось ли мне заменить всю js-часть на новую? Я имею в виду, мне больше не нужно указывать учетные данные прямой линии для моего кода? Если это так, и я правильно это понял, я бы сказал, что это не работает, но мне интересно, как я могу ожидать, что это сработает? - person user13578; 19.08.2020
comment
@ user13578 Как вы упомянули, сообщение об ошибке Either "authorizationToken" or "subscriptionKey" must be provided. Поэтому я думаю, вам нужно добавить authorizationToken в свой код. Что теперь за сообщение об ошибке? - person Hury Shen; 19.08.2020
comment
@ user13578 Могу я узнать, как вы пробовали использовать мой код обновления 2? Не могли бы вы предоставить свой последний код? - person Hury Shen; 19.08.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Hury Shen; 19.08.2020