Как создать языкового бота в прямом канале

Я создаю бота, используя бот-фреймворк, в прямом канале. Я создал двух ботов, один на английском, другой на французском, но моя идея состоит в том, чтобы создать только одного бота и вызывать диалоговые окна на английском и французском языках в зависимости от пользователей.

Мой бот также использует распознавание речи.

Вот мой код для французской прямой линии:

<!DOCTYPE html>
 <html>
<head>
<link href="https://cdn.botframework.com/botframework- 
  webchat/latest/botchat.css" rel="stylesheet" />
   </head>
  <body>
<div id="bot" />
<script src="https://cdn.botframework.com/botframework- 
  webchat/latest/botchat.js"></script>
<script src="https://cdn.botframework.com/botframework- 
    webchat/latest/CognitiveServices.js"></script>
<script>
var speechOptions = {
    speechRecognizer: new CognitiveServices.SpeechRecognizer(
        { locale: 'fr-fr', subscriptionKey: 
    'xxxxxxx' }),

    speechSynthesizer: new CognitiveServices.SpeechSynthesizer(
        {
            subscriptionKey: 'xxxxxxxxxxx',
            gender: CognitiveServices.SynthesisGender.Female,
            voiceName: 'Microsoft Server Speech Text to Speech Voice (fr-FR, 
         HortenseRUS)'
        })
}

var botConnection = new BotChat.DirectLine({
    // secret: 
         "yF0xxxxxxxxxxxxxxM",
    secret: "yBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    webSocket: true ,

});


  BotChat.App({
        speechOptions: speechOptions,
        botConnection: botConnection,
        user: {
            id: 'userid',
            name: 'User',
        },
        bot: { id: 'botid' },
        resize: 'detect',
        locale: 'fr-FR'

    },
  document.getElementById("bot"));

   function postHelp() {
    botConnection
        .postActivity({
            from: { id: 'userid', name: 'User' },
            name: 'postHelp',
            type: 'message',
            text: 'help'
        })
        .subscribe(function(id) {
            console.log('"postHelp" sent');
        });
};

function welcome() {
    botConnection
        .postActivity({
            from: { id: 'userid', name: 'User' },
            name: 'welcome',
            type: 'event',
            value: 'help'
        })
        .subscribe(function (id) {
            console.log('"welcome" sent');
        });
  }
    </script>
   </body>
    </html>

Как создать функцию для определения языка из messagecontroller.cs или, если у вас есть другие идеи, помогите мне.

заранее спасибо

Новый код directline.html

<!DOCTYPE html>
<html>
<head>
<link href="https://cdn.botframework.com/botframework- 
 webchat/latest/botchat.css" rel="stylesheet" />
 </head>
 <div id="bot" />
  <script src="https://cdn.botframework.com/botframework- 
 webchat/latest/botchat.js"></script>
  <script src="https://cdn.botframework.com/botframework- 
  webchat/latest/CognitiveServices.js"></script>
  <script>
   var speechOptions = {
    speechRecognizer: new CognitiveServices.SpeechRecognizer(
        { locale: String.localrec, subscriptionKey: 
   'xxxxxxxxxxxxx' }),

    speechSynthesizer: new CognitiveServices.SpeechSynthesizer(
        {
            subscriptionKey: 'xxxxxxxxxxxxxxxx',
            gender: CognitiveServices.SynthesisGender.Female,
           // voiceName: 'Microsoft Server Speech Text to Speech Voice (fr- 
         FR, HortenseRUS)'
            voiceName: String.localevoice

        })
}

var botConnection = new BotChat.DirectLine({
    // secret: "yxxxxxxxxxxxxxxxM",
    secret: "yxxxxxxxxxxxxxxxxxxx",
    webSocket: true ,

  });


      BotChat.App({
        speechOptions: speechOptions,
        botConnection: botConnection,
        user: {
            id: 'userid',
            name: 'User',
        },
        bot: { id: 'botid' },
        resize: 'detect',
        locale: String.localed

    },
document.getElementById("bot"));

function postHelp() {
    botConnection
        .postActivity({
            from: { id: 'userid', name: 'User' },
            name: 'postHelp',
            type: 'message',
            text: 'help'
        })
        .subscribe(function(id) {
            console.log('"postHelp" sent');
        });
};

function welcome() {
    botConnection
        .postActivity({
            from: { id: 'userid', name: 'User' },
            name: 'welcome',
            type: 'event',
            value: 'help'
        })
        .subscribe(function (id) {
            console.log('"welcome" sent');
        });
}
     var getFirstBrowserLanguage = function () {
var nav = window.navigator,
browserLanguagePropertyKeys = ['language', 'browserLanguage', 
'systemLanguage', 'userLanguage'],
i,
language;

    // support for HTML 5.1 "navigator.languages"
 if (Array.isArray(nav.languages)) {
  for (i = 0; i < nav.languages.length; i++) {
    language = nav.languages[i];
    if (language && language.length) {
      return language;
    }
  }
    }

// support for other well known properties in browsers
for (i = 0; i < browserLanguagePropertyKeys.length; i++) {
  language = nav[browserLanguagePropertyKeys[i]];
  if (language && language.length) {
    return language;
    }
   }

    return null;
   };

  console.log(getFirstBrowserLanguage());

let localed = "";
if ((navigator.languages != undefined) || (navigator.languages == "fr") || 
 getFirstBrowserLanguage() =="fr")
String.localed = 'fr-fr';
  else
String.localed = 'en-US';

    let localrec = "";
  if ((navigator.languages != undefined) || (navigator.languages == "fr") || 
  getFirstBrowserLanguage() =="fr")
String.localrec = 'fr-fr';
else
String.localrec = null;


function getVoice(localevoice) {
if (locale.startsWith('fr'))
    return 'Microsoft Server Speech Text to Speech Voice (fr-FR, 
      HortenseRUS)';
else
    return 'Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)';
  }

let localevoice = "";
if ((navigator.languages != undefined) || (navigator.languages == "fr") || 
 (getFirstBrowserLanguage() =="fr")  || (navigator.languages[0] == "fr") || 
    (navigator.language == "fr") || (navigator.userLanguage == "fr" ))// IE 
            <= 10

    String.localevoice = 'Microsoft Server Speech Text to Speech Voice (fr- 
           FR, HortenseRUS)';
      else
    String.localevoice = 'Microsoft Server Speech Text to Speech Voice (en- 
                   US, 
         ZiraRUS)';



   </script>
      </body>
     </html>

Теперь проблема в том, что бот может понять, что bonjour — это frenchdialog, а hello или другие слова на английском — englishdialog. Но когда я начинаю говорить, бот во французском диалоге читает слова так же, как и на английском. Я не могу найти проблему в моем коде


person Community    schedule 25.09.2018    source источник
comment
Какой SDK вы используете? Вот пример v4 для динамическое изменение языка бота во время разговора.   -  person Mark B    schedule 26.09.2018
comment
Как вы изменили язык ввода в WebChat? Я хотел бы создать немецко-немецкий разговор, но в настоящее время у меня есть немецко-английский. Означает, что ввод на английском языке не имеет смысла для моего бота. В HTML я изменил локаль на «de-DE», но ввод по-прежнему на английском языке...   -  person MarcoWirtl    schedule 11.06.2020
comment
Если я скопирую и вставлю ваш код выше и просто проанализирую свои подразделы, в WebChat ничего не отобразится...   -  person MarcoWirtl    schedule 11.06.2020


Ответы (1)


Вы можете проверить свойство .Locale активности в контроллере сообщений и загрузить другой диалог на его основе:

if (activity.Locale.StartsWith("fr"))
    await Conversation.SendAsync(activity, () => new FrenchLuisDialog());
else
    await Conversation.SendAsync(activity, () => new EnglishLuisDialog());

А на странице, где размещен элемент управления веб-чатом, извлеките языковой стандарт из навигатора и используйте его для установки распознавателя речи, выбора голоса и установки языкового стандарта для BotChat.App:

<script>

function getVoice(locale) {
    if (locale.startsWith('fr'))
        return 'Microsoft Server Speech Text to Speech Voice (fr-FR, HortenseRUS)';
    else
        return 'Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)';
}

let locale = "";
if (navigator.languages != undefined)
    locale = navigator.languages[0];
else
    locale = navigator.language;


var speechOptions = {
    speechRecognizer: new CognitiveServices.SpeechRecognizer(
        {locale: locale, subscriptionKey:'xxxxxxx' }),

    speechSynthesizer: new CognitiveServices.SpeechSynthesizer(
        {
            subscriptionKey: 'xxxxxxxxxxx',
            gender: CognitiveServices.SynthesisGender.Female,
            voiceName: getVoice(locale)
        })
}

var botConnection = new BotChat.DirectLine({
    secret: "yBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    webSocket: true ,

});


  BotChat.App({
        speechOptions: speechOptions,
        botConnection: botConnection,
        user: {
            id: 'userid',
            name: 'User',
        },
        bot: { id: 'botid' },
        resize: 'detect',
      locale: locale

    },
  document.getElementById("bot"));

...

person Eric Dahlvang    schedule 26.09.2018
comment
первая часть в порядке, но во второй прямой линии распознавание речи не работает. Можно добавить в качестве первого сообщения 2 флага: английский флаг и французский флаг, и пользователь может выбрать один из них, а затем начать диалог с выбранным языком? - person ; 27.09.2018
comment
@Alia Конечно, вот пример: github.com/EricDahlvang/ChooseLanguageBot - person Eric Dahlvang; 27.09.2018
comment
спасибо, я обновил свой код, чтобы объяснить, в чем моя проблема, я думаю, что он отличается от кода, который вы отправили - person ; 28.09.2018
comment
я нашел решение ... я поместил весь свой код в оператор if, else и работает хорошо ... но французский язык не поддерживается в chrome, теперь я должен это исправить :) - person ; 28.09.2018