首頁 > 後端開發 > php教程 > 使用API​​.AI的語音控制PHP應用

使用API​​.AI的語音控制PHP應用

Joseph Gordon-Levitt
發布: 2025-02-17 10:56:11
原創
345 人瀏覽過

使用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
    作者最新文章
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板