首页 >后端开发 >php教程 >使用API​​.AI的语音控制PHP应用

使用API​​.AI的语音控制PHP应用

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-02-17 10:56:11346浏览

使用API​​.AI的语音控制PHP应用

在本教程中,我们将研究API.AI,这是一种API,它使我们可以构建了解自然语言的应用程序,就像Siri一样。它可以接受文本或语音作为输入,然后将其解析并返回一个可以通过我们编写的代码来解释的JSON字符串。

我们将在本教程中使用的所有文件都可以在此GitHub存储库中使用。

>

使用API​​.AI的语音控制PHP应用

钥匙要点

通过处理文本或语音以及以JSON格式返回可行的数据,
    api.ai允许开发人员创建与Siri相似的自然语言输入的PHP应用程序。 API.AI中的关键概念包括代理(应用程序),实体(货币等自定义概念),意见(基于用户命令的操作),上下文(用户表达式上下文),别名(代码中的实体引用)和域(实体引用)和域(预定义的知识包)。
  • >教程展示了构建一个PHP应用程序,使用API​​.AI,Google的地理编码API和TimeZone API在任何位置获取当前时间,说明了如何将API数据集成和转换为可用响应。
  • > api.ai的域功能(仍处于beta中),通过提供需要最小设置的内置实体和意图来简化集成,从而可以快速创建诸如视频搜索(YouTube)的应用程序。
  • >
  • >该教程还涵盖了使用API​​.AI创建货币转换器PHP应用程序,展示如何处理用户输入,定义意图和实体,并与外部API集成,例如用于实时数据的CurrencyLayer。
  • api.ai支持多个平台和语言,为开发人员提供了灵活性,可以在网络环境(包括移动和桌面应用程序)以外创建支持语音的应用程序。
  • 概念
  • 在我们继续进行实际部分之前,重要的是要首先了解以下概念:>
代理 - 代理是应用。我们创建一个代理作为分组单个实体和意图的一种手段。

>

实体 - 实体是我们要将其纳入应用程序的自定义概念。他们通过添加示例为特定概念提供了一种赋予特定概念的方式。样本实体将是“货币”。我们通过添加诸如“美元”,“美元”或“美元”之类的同义词来定义它。然后将每个同义词分配给可以在代码中使用的参考值。这只是一个可以用来指代该概念的单词列表。 API.AI已经提供了一些基本实体,例如 @sys.number,该实体是指任何数字的实体,以及 @sys.email,它是指任何电子邮件地址的实体。我们可以通过将@SYS指定为前缀来使用内置实体。

  • >

    意图 - 目的允许我们根据用户所说的内容来定义程序将执行哪些操作。样本意图是“转换货币”。然后,我们列出用户是否要转换货币的所有可能的短语或句子。例如,用户可以说“ @sys.number:number @currency:@currency in @currency:tocurrency:tocurrency?’在此示例中,我们使用了两个实体: @sys.number和@currency。实体之后使用结肠允许我们为该实体定义一个别名。然后可以在我们的代码中使用此别名来获取实体的价值。我们需要给相同的实体一个不同的别名,以便我们可以在代码中分别对待它们。为了使人类理解上述意图,我们要做的就是替代具有实际价值观的实体。因此,用户可能会说“日元中的900美元是多少?对于Tocurrency @currency。

  • 上下文 - 上下文表示用户表达式的当前上下文。例如,用户可能会说“日元55美元?”,然后跟随“在菲律宾比索中怎么办?”。在这种情况下,API.AI使用用户以前所说的“多少55美元”作为第二个表达式的上下文。
  • >

    别名 - 别名提供了一种指代代码中特定实体的方法,正如我们先前在意图的解释中所看到的那样。

    >
  • 域 - 域是预定义的知识包。我们可以将它们视为API.AI中的内置实体和意图的集合。换句话说,它们是API.AI可以执行的技巧,几乎不需要设置或编码。例如,用户可以说:“在YouTube上查找Pikachu的视频。” API.AI已经知道如何解析并将“ Pikachu”作为搜索词返回,而“ YouTube”作为服务。从那里,我们可以使用返回的数据导航到YouTube并搜索“ Pikachu”。在JavaScript中,只是设置位置的问题。
  • >要为代理使用域,请从控制台中选择代理,然后单击顶部的域菜单。从那里,启用领域的知识库和成就。请注意,域当前处于Beta中,但是您始终可以使用API​​控制台对其进行测试。
  • >

    <span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
  • 启用域知识库可以实现域功能。实现履行可以使用第三方服务,例如小谈话和天气。这意味着,如果我们需要与API.AI. 集成的服务,我们无需向特定API提出单独的请求。

    将当前时间在特定的位置

    >现在我们对主要概念有了了解,我们可以继续构建一个简单的应用程序。我们要构建的第一件事是将当前时间置于特定位置的应用。>

    如果您尚未这样做,请在API.AI网站上注册一个免费帐户,验证您的电子邮件地址,然后登录 /登录您的凭据。

    >

    接下来,转到代理页面,并单击“创建代理”按钮创建新代理。在创建新代理的页面中,输入名称,描述和语言,然后保存。>

    使用API​​.AI的语音控制PHP应用>这为您提供了订阅密钥,开发人员访问令牌和客户端访问令牌。您可以使用这些来从客户端(浏览器)或服务器向API提出请求。从服务器中提出请求的一个优点是将您的凭据隐藏。

    > 我们创建的代理将使用域。这意味着我们不需要建立实体和意图。我们需要的是两个Google API的帮助:地理编码API和TimeZone API。地理编码API用于将我们从API.AI获得的位置转换为坐标。然后,我们使用这些坐标来查询时区API,以获取该位置的当前时间。转到您的Google控制台,启用时区API。地理编码API不需要提供API键,因此我们不需要启用它。

    接下来,安装guzzle。我们将使用Guzzle 5向API.AI.

    提出请求。

    然后,创建一个新的php文件(time.php)并添加以下代码,以便我们可以使用文件中的guzzle。

    之后,定义您的API键:

    <span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
    自然,在真实的应用中,您可能会在某种本地配置文件中保留凭据外面的凭据。

    我们现在可以向API.AI提出请求。为了提出请求,我们需要将开发人员访问令牌和订阅密钥作为标题传递。然后,我们将请求的正文作为JSON传递。请求主体应包含查询和lang键。查询通过邮政请求从客户端提交。该应用程序查询的一个示例是“西班牙巴塞罗那几点钟?”或“目前在日本伊克布库罗的时间是多少?”。返回的响应是一个JSON字符串,因此我们通过调用$响应的JSON方法将其转换为数组。
    <span>composer require guzzlehttp/guzzle:~5.0</span>

    >这是我们在上述请求时得到的示例响应:>
    <span><?php
    </span><span>require 'vendor/autoload.php';
    </span><span>
    </span><span>use GuzzleHttp\Client;
    </span><span>
    </span><span>$client = new Client();</span>

    如果我们获得200个状态代码,则意味着请求成功。我们需要的数据存储在结果项目中。在这种情况下,我们只需要从参数提取位置。如果未返回位置,那么我们只会告诉用户找不到位置。

    <span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>

    如果找到位置,我们向Google Geocoding API提出请求,以将位置转换为坐标。如果状态可以,这意味着我们得到了结果。因此,我们只从第一个结果提取纬度和经度值。

    >
    <span>composer require guzzlehttp/guzzle:~5.0</span>
    接下来,我们将获得当前的UNIX时间戳。我们将此值与纬度和经度一起传递,以查询我们向Google TimeZone API的请求。然后,我们提取可以使用date_default_timezone_set方法临时设置时区的TimeZoneID。最后,我们只是将格式的时间输出给用户。

    >

    <span><?php
    </span><span>require 'vendor/autoload.php';
    </span><span>
    </span><span>use GuzzleHttp\Client;
    </span><span>
    </span><span>$client = new Client();</span>
    >让我们继续前往客户端。创建一个带有以下代码的index.html文件:

    >

    <span>$google_api_key = 'YOUR_GOOGLE_API_KEY';
    </span><span>$apiai_key = 'YOUR_API_AI_AGENT_DEVELOPER_ACCESS_TOKEN';
    </span><span>$apiai_subscription_key = 'YOUR_API_AI_SUBSCRIPTION_KEY';</span>
    我们正在使用jQuery(用于事件处理)和响应式voice.js。响应式声音库使我们能够将文本转换为语音。我们用它来说明我们从服务器获得的结果。

    >我们也有语音识别。JS,我们用于将语音转换为文本。这使用网络语音API。可悲的是,在写作时,它仍然仅在一些浏览器上得到部分支持,因此本教程将假定您使用Chrome(确实支持它)。

    >让我们解释以上文件。首先是我们将用来存储当前语音识别对象的全局变量。>

    接下来是StarTreagnition方法。这是创建一个新的语音识别对象。这将要求用户使用麦克风。接下来,我们将语言设置为英语并开始语音识别。然后,我们聆听Onstart活动。当触发此事件时,这意味着语音识别已经开始。发生这种情况时,我们调用Updaterec方法,该方法更改了按钮的文本,以启动和停止语音识别。我们还聆听on Result事件,当用户停止讲话几秒钟时,该事件会触发。这包含语音识别的结果。我们必须循环浏览结果,并在每个结果中使用成绩单项来获取所需的文本。完成此操作后,我们调用SETINPUT方法,该方法更改查询文本字段的值,并调用将查询提交到服务器的发送方法。接下来,我们称之为停止语音识别并更新UI的停止认知方法。我们还需要在ONEND事件中进行同样的事情。

    >
    <span>$query = $_POST['query']; //the users query
    </span><span>
    </span><span>$response = $client->post('https://api.api.ai/v1/query', array(
    </span><span>    'headers' => array(
    </span><span>        'Authorization' => "Bearer {$apiai_key}",
    </span><span>        'ocp-apim-subscription-key' => $apiai_subscription_key,
    </span><span>        'Content-Type' => 'application/json; charset=utf-8'
    </span><span>    ),
    </span><span>    'json' => array(
    </span><span>        "query" => $query,
    </span><span>        "lang" => "en"
    </span><span>    )
    </span><span>));
    </span><span>
    </span><span>$result = $response->json();</span>

    这是Updaterec方法。

    >
    Array
    (
        [id] => eb69f468-6e1a-41c9-883d-6ac7c71cd187
        1739117986 => 2015-05-16T09:19:47.519Z
        [result] => Array
            (
                [source] => domains
                [resolvedQuery] => What's the current time in Barcelona Spain?
                [speech] => 
                [action] => clock.time
                [parameters] => Array
                    (
                        [location] => Barcelona Spain
                    )
    
                [metadata] => Array
                    (
                        [inputContexts] => Array
                            (
                            )
    
                        [outputContexts] => Array
                            (
                            )
    
                        [contexts] => Array
                            (
                            )
    
                    )
    
            )
    
        [status] => Array
            (
                [code] => 200
                [errorType] => success
            )
    
    )

    setInput方法。

    <span>if(!empty($result['result']) && !empty($result['result']['parameters']['location'])){
    </span><span>    $location = $result['result']['parameters']['location'];
    </span><span>
    </span><span>}else{
    </span><span>    echo "Sorry, I could not find that location.";
    </span><span>}</span>

    >停止认知方法。

    <span>$place_response = $client->get("http://maps.googleapis.com/maps/api/geocode/json?address={$location}&sensor=false");
    </span><span>
    </span><span>$place_result = $place_response->json();
    </span><span>
    </span><span>if($place_result['status'] == 'OK'){
    </span><span>
    </span><span>    $lat = $place_result['results'][0]['geometry']['location']['lat'];
    </span><span>    $lng = $place_result['results'][0]['geometry']['location']['lng'];
    </span><span>}</span>
    除此之外,我们还拥有SwitchRevention方法,每当用户单击按钮以触发语音识别以开始或停止时。

    用户按查询字段上的Enter键时,这也触发要发送到服务器的查询。
    <span>$timestamp = time(); //get the current unix timestamp
    </span><span>
    </span><span>$time_response = $client->get("https://maps.googleapis.com/maps/api/timezone/json?location={$lat},{$lng}&timestamp={$timestamp}&key={$google_api_key}");
    </span><span>
    </span><span>$time_result = $time_response->json();
    </span><span>
    </span><span>if($time_result['status'] == 'OK'){
    </span><span>    $timezone = $time_result['timeZoneId'];
    </span><span>
    </span><span>    date_default_timezone_set($timezone);
    </span><span>
    </span><span>    echo 'It's currently ' . date('l, F j, Y g:i A') . ' in ' . $location;
    </span><span>}</span>
    >
    <span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>

    语音cognition.js文件中的大多数代码来自该要旨,该要点显示了如何在客户端上使用api.ai的示例。

    下一步是我们向服务器提交查询的main.js文件。一旦得到响应,我们就会使用响应式声音将其说出来,并将其输出在响应容器中。这样,我们可以从视觉上检查响应。
    <span>composer require guzzlehttp/guzzle:~5.0</span>
    >

    货币转换器

    我们将要构建的下一个应用程序允许用户将特定金额从一种货币转换为另一种货币。

    首先,创建一个新代理并称其为货币转换器。

    使用API​​.AI的语音控制PHP应用

    在该代理下,创建一个新实体并将其称为货币。这将代表我们可以转换的不同货币。定义一些我们可以用于测试的货币,然后单击“保存”。

    >

    使用API​​.AI的语音控制PHP应用

    接下来创建一个新意图并将其称为ConvertMoney。

    使用API​​.AI的语音控制PHP应用

    从上面的屏幕截图中,您可以看到我们在“用户说”部分下添加了以下内容:

    >

    <span><?php
    </span><span>require 'vendor/autoload.php';
    </span><span>
    </span><span>use GuzzleHttp\Client;
    </span><span>
    </span><span>$client = new Client();</span>
    “用户说”部分是我们定义用户所说的示例以触发此特定意图的示例。我们在这里做的是将实体用作用户可能使用的实际值的替代。 @sys.number可以参考任何数字。 @Currency可以指我们创建货币实体时先前添加的任何货币。实体后使用结肠使我们可以为其分配一个别名。然后可以使用此别名来获取用户在代码中使用的值。

    >。

    “动作”部分是我们定义要执行此特定意图的操作或方法的地方。在这种情况下,我们不会定义任何内容,因为我们只是创建一个只能做一件事的应用程序。

    >

    >“履行”部分是我们在使用意图后要输出的语音模板定义模板。例如,我们可以说以下内容:

    <span>$google_api_key = 'YOUR_GOOGLE_API_KEY';
    </span><span>$apiai_key = 'YOUR_API_AI_AGENT_DEVELOPER_ACCESS_TOKEN';
    </span><span>$apiai_subscription_key = 'YOUR_API_AI_SUBSCRIPTION_KEY';</span>
    >在我们获得的结果中,这将在语音项目上可用。从那里,我们可以执行替换字符串,以将这些变量替换为我们获得的实际值。但是,让我们把它作为空白的这个应用程序。

    >完成后,单击“保存”按钮以保存意图。

    >

    >现在我们准备继续进行代码。然后,在工作目录中创建一个Exchange-rate.php文件,添加以下代码:>
    <span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
    从上面的代码中可以看到

    >,它基本上与我们在上一个应用程序中的早期相同。只有这一次,我们添加了$ CurrencyLayer_Apikey变量。这将存储我们从CurrencyLayer.com获得的API密钥,这是一种API,它使我们能够从一种货币到另一种货币获得当前的汇率。如果您想跟进,请继续注册API键。

    > 接下来,我们检查是否有任何结果,并提取所需的数据。在这种情况下,我们需要获取用户希望转换的货币,将其转换为金额的货币。

    然后,我们向API提出请求,然后从结果中提取汇率:>
    <span>composer require guzzlehttp/guzzle:~5.0</span>

    我们从API中获得的结果如下:

    <span><?php
    </span><span>require 'vendor/autoload.php';
    </span><span>
    </span><span>use GuzzleHttp\Client;
    </span><span>
    </span><span>$client = new Client();</span>

    >现在我们有了当前的汇率,我们现在要做的就是将速率乘以用户提供的数量,然后输出结果。>

    <span>$google_api_key = 'YOUR_GOOGLE_API_KEY';
    </span><span>$apiai_key = 'YOUR_API_AI_AGENT_DEVELOPER_ACCESS_TOKEN';
    </span><span>$apiai_subscription_key = 'YOUR_API_AI_SUBSCRIPTION_KEY';</span>
    在客户端,我们仍然使用与第一个应用程序上早期使用的相同的HTML和文件。如果您关注的话,您可以继续将相同的文件放入工作目录中。

    >

    <span>$query = $_POST['query']; //the users query
    </span><span>
    </span><span>$response = $client->post('https://api.api.ai/v1/query', array(
    </span><span>    'headers' => array(
    </span><span>        'Authorization' => "Bearer {$apiai_key}",
    </span><span>        'ocp-apim-subscription-key' => $apiai_subscription_key,
    </span><span>        'Content-Type' => 'application/json; charset=utf-8'
    </span><span>    ),
    </span><span>    'json' => array(
    </span><span>        "query" => $query,
    </span><span>        "lang" => "en"
    </span><span>    )
    </span><span>));
    </span><span>
    </span><span>$result = $response->json();</span>
    >唯一的区别是我们发送请求的URL。将其指向您的Exchange-rate.php的位置:

    >

    Array
    (
        [id] => eb69f468-6e1a-41c9-883d-6ac7c71cd187
        1739117986 => 2015-05-16T09:19:47.519Z
        [result] => Array
            (
                [source] => domains
                [resolvedQuery] => What's the current time in Barcelona Spain?
                [speech] => 
                [action] => clock.time
                [parameters] => Array
                    (
                        [location] => Barcelona Spain
                    )
    
                [metadata] => Array
                    (
                        [inputContexts] => Array
                            (
                            )
    
                        [outputContexts] => Array
                            (
                            )
    
                        [contexts] => Array
                            (
                            )
    
                    )
    
            )
    
        [status] => Array
            (
                [code] => 200
                [errorType] => success
            )
    
    )
    结论

    在本教程中,我们学会了如何使用API​​.AI来创建启用语音的PHP应用程序。浏览器支持仍然非常有限,因为网络语音API仍未得到广泛实现。但是API.AI支持除Web之外的其他平台。 Android,Cordova,.net,iOS就是几个例子。这意味着我们可以使用API​​.AI,而不必担心这些平台上的支持。如果您想了解更多信息,请务必查看他们的文档。我们在本教程中使用的文件可在此GitHub存储库中可用。>

    <span>if(!empty($result['result']) && !empty($result['result']['parameters']['location'])){
    </span><span>    $location = $result['result']['parameters']['location'];
    </span><span>
    </span><span>}else{
    </span><span>    echo "Sorry, I could not find that location.";
    </span><span>}</span>
    在语音控制的php应用程序上的常见问题(常见问题解答)api.ai

    >

    >如何将API.AI与PHP集成以进行语音识别?

    >将API.AI与PHP集成以进行语音识别涉及几个步骤。首先,您需要在API.AI中创建一个新代理。该代理将负责了解用户的语音输入并将其转换为可行的数据。创建代理后,您需要用短语和响应来训练它。培训代理后,您可以使用API​​.AI PHP SDK将代理集成到您的PHP应用程序中。 SDK提供了将语音数据发送给代理并接收处理后数据的方法。>

    >使用api.ai?

    构建语音控制的PHP应用程序的先决条件是什么,使用API​​.AI构建语音控制的PHP应用 - 面向编程。您还需要对API.AI及其工作方式有工作知识。此外,您需要拥有可以托管PHP应用程序的服务器。最后,您需要在服务器上安装API.AI php SDK。

    >我可以使用其他语音识别API,wpp?

    是的,您可以使用带有PHP的其他语音识别API 。 API.AI的一些流行替代方案包括IBM Watson,Microsoft Azure认知服务和Google Cloud语音到文本。这些API还提供了可以用来将其集成到PHP应用程序中的PHP SDK。

    >

    >如何在PHP应用程序中提高语音识别的准确性?

    >提高语音识别的准确性在您的PHP应用程序中,涉及对您的API.AI代理进行更多的短语和响应。代理拥有的数据越多,它就越能理解和处理语音输入。您还可以使用代理商的机器学习功能来不断地提高其性能。因此,您可以训练代理商以理解和响应不同语言的语音输入。在向代理发送语音数据时,您可以在请求中指定语言。然后,代理将根据指定的语言处理语音输入。

    >我可以在我的php应用程序中使用api.ai进行文本到语音吗? AI用于PHP应用程序中的文本到语音。 API.AI提供了将文本转换为语音的方法。您可以使用这些方法使您的应用程序向用户说出响应或说明。

    >如何在PHP应用程序中保护语音数据?

    >在PHP应用中保护语音数据在将数据发送到API.AI之前,涉及对数据进行加密。您可以使用PHP的内置加密功能来加密数据。此外,您应该将https用于应用程序和api.ai之间的所有通信以防止数据截距。

    >

    >我可以将api.ai用于语音控制的Web应用程序吗?使用API​​.AI进行语音控制的Web应用程序。 API.AI PHP SDK可用于任何PHP应用程序,包括Web应用程序。您可以使用JavaScript在浏览器中捕获用户的语音输入,然后将其发送到您的PHP后端进行处理。

    >

    >如何测试我的PHP应用程序的语音识别功能?可以通过创建一组测试短语和响应来测试PHP应用程序的语音识别功能。然后,您可以使用这些测试来检查应用程序是否正确理解和处理语音输入。

    >我可以将API.AI用于语音控制的移动应用程序吗?但是,您需要将API.AI SDK用于特定的移动平台(Android或iOS)而不是PHP SDK。移动SDK提供了用于捕获用户语音输入并将其发送到API.AI进行处理的方法。

    以上是使用API​​.AI的语音控制PHP应用的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明:
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn