Как переключить язык Artyom.js на лету с помощью голосовой команды

Artyom.js делает все проще, когда мы говорим о реализации простого голосового помощника в Google Chrome с помощью JavaScript. Он автоматически предоставит API-интерфейс, с которым очень легко работать, и очень хорошо оборачивает API распознавания речи и синтеза речи. Несмотря на то, что библиотека хорошо документирована, иногда вы сами не можете придумать простые вещи, о которых, возможно, разработчик не задумывался, например, переключение языка на лету с помощью голосовой команды.

Если вы думаете сделать это, вам придется логически подумать о том, что мне делать с библиотекой, чтобы начать с другого языка. Во-первых, оригинальный API распознавания речи не позволяет переключать распознанный язык на лету, что означает, что вам нужно перезапустить экземпляр. То же самое касается Artyom.js, чтобы переключиться с языка, вам нужно будет его перезапустить. Если вы работаете с простым API распознавания речи, это будет головной болью, если вы захотите сделать это с нуля, но благодаря Artyom этого очень легко достичь.

В зависимости от того, как вы хотите работать, вы можете использовать один или несколько экземпляров Artyom (по 1 на каждый язык), не стесняйтесь работать так, как вы хотите.

А. Работа с одним экземпляром Артема

Если вы хотите переключить язык на лету с одним экземпляром Artyom, вам нужно будет выполнить следующие шаги:

1. Создать экземпляр и конфигурацию

В этом случае наш экземпляр будет доступен как Jarvis, тогда мы будем хранить нашу конфигурацию в виде простого объекта JS с 2 разными ключами для каждого языка, а именно испанского и английского:

// Initialize an instance of artyom
var Jarvis = new Artyom();
// Create an object to store the configuration for every language
var JarvisConfigurations = {
spanish: {
lang: "es-ES",
continuous: true,
listen: true,
debug: true
},
english: {
lang: "en-GB",
continuous: true,
listen: true,
debug: true
}
};

2. Добавьте команду для переключения языка

Поскольку у нас есть только 2 языка в одном экземпляре, команды также будут храниться в одном и том же экземпляре, и они должны реагировать на «Переключение на испанский» и «Cambiar a inglés (Переключение на английский на испанском)». Мы добавим 2 команды, которые следуют следующей логике:

  1. Когда команда сработает, остановите Артема с помощью fatality ()
  2. Когда обещание фатальности выполнено, выполните инициализацию снова с исходной конфигурацией, сохраненной в переменной JarvisConfigurations в соответствии с языком.
  3. Когда обещание инициализации выполнено, скажите привет на соответствующем языке.
Jarvis.addCommands([
// English Command
{
indexes: ["Switch to Spanish"],
action: function(){
// Stop Jarvis
Jarvis.fatality().then(function(){
// When it stops, initialize with Spanish configuration :)
Jarvis.initialize(JarvisConfigurations.spanish).then(function(){
Jarvis.say("Hola");
});
});
}
},
// Spanish Command
{
indexes: ["Cambiar a inglés"],
action: function(){
// Stop Jarvis
Jarvis.fatality().then(function(){
// When it stops, initialize with english configuration :)
Jarvis.initialize(JarvisConfigurations.english).then(function(){
Jarvis.say("Hello");
});
});
}
}
]);

3. Инициализировать в первый раз с языком по умолчанию

Поскольку мы используем команды для динамического переключения языка, должен быть уже запущенный экземпляр Artyom, иначе никто ничего не узнает. В этом случае мы начнем с английской конфигурации:

// Initialize for first time !
Jarvis.initialize(JarvisConfigurations.english).then(function(){
console.log("Ready to work, try changing the language!");
});

Как только Artyom запускается, когда мы находимся в режиме английского языка, вы можете изменить на испанский, говоря «Переключитесь на испанский», и Артем скажет «Hola» и наоборот.

Б. Работа с несколькими экземплярами Артема

При работе с разными языками многим разработчикам нравится абстрагировать и отделять логику для каждого языка, создавая несколько экземпляров Artyom. Таким образом, у вас не будет, например, испанских команд внутри английского экземпляра (так как они никогда не будут вызваны, потому что служба распознавания находится на другом языке) Artyom и наоборот.

Заметка

Если вы планируете поддерживать более двух языков, этот подход больше не нужен, поэтому перейдите к варианту C. Этот параметр предназначен только для понимания.

1. Создайте экземпляры и настройку

Если вы хотите использовать несколько экземпляров Artyom для организации, они должны будут называться по-разному. В этом случае для нашего экземпляра на английском языке имя в коде будет Jarvis, а для экземпляра на испанском языке его имя будет Maria:

// Initialize English Instance of Artyom
var Jarvis = new Artyom();
// Initialize Spanish Instance of Artyom
var Maria = new Artyom();
// Create an object to store the configuration for every instance
var ArtyomConfiguration = {
spanish: {
lang: "es-ES",
continuous: true,
listen: true,
debug: true
},
english: {
lang: "en-GB",
continuous: true,
listen: true,
debug: true
}
};

2. Добавьте команды для переключения языка соответственно

Теперь вам нужно добавить 2 команды, которые запускают логику перезапуска с другой конфигурацией:

// Add Switch language command for Maria (Spanish Mode)
Maria.addCommands([
{
indexes: ["Cambiar a inglés"],
action: function(){
// Stop the Spanish (Maria) Instance
Maria.fatality().then(function(){
// Initialize Jarvis
Jarvis.initialize(ArtyomConfiguration.Jarvis).then(function(){
Jarvis.say("Hello");
});
});
}
}
]);
// Add Switch language command for Jarvis (English Mode)
Jarvis.addCommands([
{
indexes: ["Switch to Spanish"],
action: function(){
// Stop the English (Jarvis) Instance
Jarvis.fatality().then(function(){
// Initialize Maria
Maria.initialize(ArtyomConfiguration.Maria).then(function(){
Maria.say("Hola");
});
});
}
}
]);

3. Инициализируйте в первый раз с языком по умолчанию.

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

// Initialize for first time !
Jarvis.initialize(ArtyomConfiguration.Jarvis).then(function(){
console.log("Ready to work, try changing the language!");
});

C. Работа с 3 или более экземплярами Артема

Если вы работаете с 3 или более языками в Artyom, вам нужно будет подумать о простом способе хранения всех экземпляров и мирной работы со всеми из них, чтобы предотвратить сбой API, кроме того, он должен работать как часы! Как автор библиотеки Артема, следующий способ является самым простым, однако он может меняться в зависимости от того, что вам нужно.

1. Создайте экземпляры и настройку

Во-первых, нам нужно также сохранить конфигурацию и экземпляры внутри объекта JS, и в нашем примере мы будем использовать 3 экземпляра (для более подробной информации вы можете следовать той же логике):

var InstancesCollector = {
Jarvis: new Artyom(),
Maria: new Artyom(),
Christine: new Artyom()
// Add more if you need to
};
var InstancesConfiguration = {
Jarvis: {
lang: "en-GB",
continuous: true,
listen: true,
debug: true
},
Maria: {
lang: "es-ES",
continuous: true,
listen: true,
debug: true
},
Christine: {
lang: "de-DE",
continuous: true,
listen: true,
debug: true
}
// Add more if you need to
};

2. Создайте многоразовые инициализаторы

Поскольку вы работаете с несколькими экземплярами, и вам может не потребоваться вводить разные функции инициализации для каждого языка, так как ваш код может иметь много одинакового, вы можете создать другую переменную, в которой будет храниться модель инициализации с простыми функциями:

/**
* The initializers will be stored in this variable as normally you would want to execute this
* more than once, however writing just once.
*/
var AutoInitializers = {
Jarvis: function(){
// Start English
InstancesCollector.Jarvis.initialize(InstancesConfiguration.Jarvis).then(function(){
InstancesCollector.Jarvis.say("Hello, i'm Jarvis");
});
},
Maria: function(){
// Start Spanish
InstancesCollector.Maria.initialize(InstancesConfiguration.Maria).then(function(){
InstancesCollector.Maria.say("Hola, soy Maria");
});
},
Christine: function(){
// Start German
InstancesCollector.Christine.initialize(InstancesConfiguration.Christine).then(function(){
InstancesCollector.Christine.say("Hallo, ich bin Christine");
});
}
};

Таким образом, каждый раз, когда запускается другой язык, он будет говорить на своем языке (только для тестирования).

3. Добавить команды для переключения языков соответственно

Теперь в этой части вам нужно быть осторожным. Поскольку смена языка происходит с помощью голоса, вам необходимо определить, с какого языка вы переключаетесь и куда. Кроме того, вам нужно остановить текущий экземпляр, откуда поступает запрос, например, если вы запрашиваете изменение языка, говорящего по-английски (Jarvis Instance), вам необходимо остановить Jarvis. В действии каждой команды мы будем идентифицировать с распознанной командой, какой язык нам следует изменить после остановки текущего экземпляра:

// Add command switcher from english to: spanish or german
InstancesCollector.Jarvis.addCommands([
{
indexes: ["Switch to Spanish", "Switch to German"],
action: function(i){
switch(i){
case 0:
// Stop English Instance
InstancesCollector.Jarvis.fatality().then(function(){
// Start Maria
AutoInitializers.Maria();
});
break;
case 1:
// Stop English Instance
InstancesCollector.Jarvis.fatality().then(function(){
// Start German
AutoInitializers.Christine();
});
break;
}
}
}
]);
// Add command switcher from spanish to: english or german
InstancesCollector.Maria.addCommands([
{
indexes: ["Cambiar a inglés", "Cambiar a alemán"],
action: function(i){
switch(i){
case 0:
// Stop Spanish Instance
InstancesCollector.Maria.fatality().then(function(){
// Start English
AutoInitializers.Jarvis();
});
break;
case 1:
// Stop Spanish Instance
InstancesCollector.Maria.fatality().then(function(){
// Start German
AutoInitializers.Christine();
});
break;
}
}
}
]);
// Add command switcher from german to: english or spanish
InstancesCollector.Christine.addCommands([
{
indexes: ["zu Englisch wechseln", "zu Spanisch wechseln"],
action: function(i){
switch(i){
case 0:
// Stop German Instance
InstancesCollector.Christine.fatality().then(function(){
// Start English
AutoInitializers.Jarvis();
});
break;
case 1:
// Stop German Instance
InstancesCollector.Christine.fatality().then(function(){
// Start Spanish
AutoInitializers.Maria();
});
break;
}
}
}
]);

Так что теперь вы можете переключаться с любого языка на другой, так как каждый случай покрывается нашим кодом инициализации, например, с испанского на немецкий, с немецкого на английский и т. Д.

4. Инициализировать в первый раз с языком по умолчанию

В качестве последнего шага, запустите Artyom впервые с языком по умолчанию, чтобы вы могли переключаться с языка своим голосом:

InstancesCollector.Jarvis.initialize(InstancesConfiguration.Jarvis).then(function(){
InstancesCollector.Jarvis.say("Ready to work, try changing the language!");
});

Как вы заметили в шаге B для двух разных языков, чем больше у вас языков, тем сложнее логика для обработки.

Ссылка на основную публикацию
Adblock
detector