个性化阅读
专注于IT技术分析

如何通过语音命令即时切换Artyom.js的语言

本文概述

当我们谈论使用JavaScript在Google Chrome中实现简单的语音助手时, Artyom.js使一切变得容易。它将自动公开一个非常易于使用的API, 并很好地包装了语音识别和语音合成API。尽管该库有充分的文档记录, 但是你有时可能自己并没有发现开发人员可能不会想到的简单事情, 例如使用语音命令即时切换语言。

如果你正在考虑这样做, 则必须从逻辑上考虑从其他语言开始我应该如何处理该库。首先, 原始的语音识别API不允许即时切换已识别的语言, 这意味着你必须重新启动实例。 Artyom.js也是如此, 要从语言切换, 则需要重新启动它。如果你使用普通的语音识别API, 那么如果你想从头开始做的话会很头疼, 但是由于有了Artyom, 这很容易实现。

根据你的工作方式, 你可能希望使用Artyom的单个或多个实例(每种语言1个), 可以根据需要随意工作。

A.使用Artyom的单个实例

如果你想使用单个Artyom实例即时切换语言, 则需要执行以下步骤:

1.创建实例和配置

在这种情况下, 我们的实例将以Jarvis的形式提供, 然后将我们的配置存储在一个普通的JS对象中, 该对象具有两种不同的键, 每种语言分别是西班牙语和英语:

// 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.添加命令以切换语言

由于单个实例中只有两种语言, 因此命令也将存储在相同的实例中, 并且它们应对”切换到西班牙语”和” Cambiar ainglés(切换到英语的西班牙语)”做出反应。我们将添加2条遵循以下逻辑的命令:

  1. 触发命令后, 使用fatality()停止artyom
  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开始, 就像我们在英语模式下一样, 你可以更改为西班牙语, 说” Switch to Spanish”, Artyom会说” Hola”, 反之亦然。

B.使用Artyom的多个实例

当使用不同的语言时, 许多开发人员喜欢为每种语言抽象和分离逻辑, 从而创建多个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.首次使用默认语言初始化。

与预期的一样, 仅在用户讲话时才触发命令, 因此需要运行artyom。在这种情况下, 我们将从默认的英语模式开始。

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

C.使用3个或更多Artyom实例

如果你使用Artyom使用3种或更多语言, 则现在需要考虑一种简单的方法来存储所有实例, 并与所有实例和平共处, 以防止API崩溃, 此外它还需要像时钟一样工作!作为Artyom库的作者, 以下方法是最简单的, 但是它可能会根据你的需要进行更改。

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实例), 则需要停止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中注意到的, 使用两种不同的语言时, 拥有的语言越多, 处理逻辑就越复杂。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何通过语音命令即时切换Artyom.js的语言

评论 抢沙发

评论前必须登录!