Rumah >pembangunan bahagian belakang >tutorial php >Aplikasi PHP yang dikawal suara dengan API.AI
Semua fail yang akan kami gunakan dalam tutorial ini boleh didapati dalam repositori GitHub ini.
Takeaways Key
- Ejen adalah aplikasi. Kami membuat ejen sebagai cara mengumpulkan entiti dan niat individu.
- Entiti adalah konsep tersuai yang ingin kami masukkan ke dalam permohonan kami. Mereka menyediakan cara memberi makna kepada konsep tertentu dengan cara menambah contoh. Entiti sampel akan menjadi 'mata wang'. Kami mentakrifkannya dengan menambah sinonim seperti 'USD', 'Dolar AS', atau hanya 'Dolar'. Setiap sinonim kemudian diberikan kepada nilai rujukan yang boleh digunakan dalam kod. Ia hanya senarai kata -kata yang boleh digunakan untuk merujuk kepada konsep itu. API.ai sudah menyediakan beberapa entiti asas seperti @sys.number, yang merupakan entiti yang merujuk kepada mana -mana nombor, dan @sys.email yang merupakan entiti yang merujuk kepada mana -mana alamat e -mel. Kita boleh menggunakan entiti terbina dalam dengan menentukan @SYS sebagai awalan.
Intents - Intents membolehkan kita untuk menentukan tindakan mana yang akan dilaksanakan oleh program bergantung kepada apa yang dikatakan pengguna. Niat sampel akan 'menukar mata wang'. Kami kemudian menyenaraikan semua frasa atau ayat yang mungkin pengguna katakan jika mereka mahu menukar mata wang. Sebagai contoh, pengguna boleh mengatakan 'berapa banyak @sys.number: nombor @currency: daricurrency dalam @currency: tocurrency?'. Dalam contoh ini, kami telah menggunakan 2 entiti: @sys.number dan @currency. Menggunakan kolon selepas entiti membolehkan kita menentukan alias untuk entiti itu. Alias ini kemudiannya boleh digunakan dalam kod kami untuk mendapatkan nilai entiti. Kita perlu memberikan entiti yang sama alias yang berbeza supaya kita dapat merawatnya secara berasingan dalam kod kita. Agar manusia memahami niat di atas, yang perlu kita lakukan ialah menggantikan entiti dengan nilai sebenar. Jadi pengguna mungkin mengatakan 'berapa 900 dolar AS dalam yen Jepun?' untuk tocurrency @currency.
Konteks - Konteks mewakili konteks semasa ekspresi pengguna. Sebagai contoh, pengguna mungkin mengatakan 'berapa 55 dolar AS dalam yen Jepun?' Dan kemudian ikuti dengan 'Bagaimana dengan Peso Filipina?'. Api.ai, dalam kes ini, menggunakan apa yang telah dituturkan oleh pengguna, 'berapa 55 dolar AS,' sebagai konteks untuk ekspresi kedua.
<span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>Untuk menggunakan domain untuk ejen anda, pilih ejen anda dari konsol dan kemudian klik pada menu Domain di bahagian atas. Dari sana, membolehkan asas pengetahuan domain dan pemenuhan. Perhatikan bahawa domain sedang dalam beta, tetapi anda sentiasa boleh menggunakan konsol API untuk menguji mereka.
Sekarang kita mempunyai pemahaman tentang konsep utama, kita boleh meneruskan dengan membina aplikasi mudah. Perkara pertama yang akan kita bina adalah aplikasi untuk mendapatkan masa semasa di tempat tertentu.
Jika anda belum melakukannya, daftar untuk akaun percuma di laman web API.AI, sahkan alamat e-mel anda dan kemudian log masuk / masuk dengan kelayakan anda.
Seterusnya, pergi ke halaman Ejen dan buat ejen baru dengan mengklik butang 'Buat Agen'. Sekali dalam halaman untuk membuat ejen baru, masukkan nama, keterangan, dan bahasa, dan simpan.
Ejen yang kami buat akan menggunakan domain. Ini bermakna kita tidak perlu menubuhkan entiti dan niat. Apa yang kita perlukan adalah sedikit bantuan daripada dua API Google: API Geocoding dan API TimeZone. API Geocoding digunakan untuk menukar lokasi yang kami dapat dari API.AI ke dalam koordinat. Kami kemudian menggunakan koordinat ini untuk menanyakan API zon waktu untuk mendapatkan masa semasa untuk lokasi tersebut. Pergi ke Konsol Google anda dan aktifkan API Zon Time. API Geocoding tidak memerlukan kunci API untuk dibekalkan, jadi kami tidak perlu mengaktifkannya.
Seterusnya, pasang Guzzle. Kami akan menggunakan Guzzle 5 untuk membuat permintaan untuk api.ai.
<span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>Kemudian, buat fail PHP baru (time.php) dan tambahkan kod berikut supaya kami boleh menggunakan Guzzle dari fail kami.
<span>composer require guzzlehttp/guzzle:~5.0</span>Selepas itu, tentukan kekunci API anda:
<span><?php </span><span>require 'vendor/autoload.php'; </span><span> </span><span>use GuzzleHttp\Client; </span><span> </span><span>$client = new Client();</span>secara semulajadi, dalam aplikasi sebenar, anda mungkin akan menyimpan kelayakan di luar logik aplikasi, dalam beberapa jenis fail konfigurasi tempatan.
kita kini boleh membuat permintaan untuk api.ai. Untuk membuat permintaan, kita perlu lulus dalam token akses pemaju dan kunci langganan sebagai tajuk. Kami kemudian lulus dalam badan permintaan sebagai JSON. Badan permintaan harus mengandungi pertanyaan dan kekunci Lang. Pertanyaan dikemukakan dari pihak klien melalui permintaan pos. Contoh pertanyaan untuk aplikasi ini ialah "pukul berapa di Barcelona, Sepanyol?" atau "Apa masa semasa di Ikebukuro, Jepun?". Sambutan yang dikembalikan adalah rentetan JSON sehingga kami menukarnya ke array dengan memanggil kaedah JSON pada respons $.
<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>Berikut adalah tindak balas sampel yang kita dapat apabila kita membuat permintaan di atas:
<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>Jika kita mendapat kod status 200, ini bermakna permintaan itu berjaya. Data yang kami perlukan disimpan dalam item hasil. Dalam kes ini, kita hanya perlu mengekstrak lokasi dari parameter. Jika lokasi tidak dikembalikan, maka kami hanya memberitahu pengguna bahawa lokasi tidak dijumpai.
<span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
Jika lokasi dijumpai, kami membuat permintaan kepada API Google Geocoding untuk menukar lokasi ke koordinat. Jika statusnya OK, ini bermakna kita mendapat hasil. Oleh itu, kita hanya mengeluarkan nilai latitud dan longitud dari hasil pertama.
<span>composer require guzzlehttp/guzzle:~5.0</span>
Seterusnya, kami mendapat timestamp UNIX semasa. Kami lulus nilai ini bersama -sama dengan latitud dan longitud sebagai pertanyaan untuk permintaan kami ke API Google Timezone. Kami kemudian mengekstrak zoneid time yang boleh kita gunakan untuk sementara menetapkan zon waktu menggunakan kaedah date_default_timezone_set. Akhirnya, kami hanya mengeluarkan masa yang diformat kepada pengguna.
<span><?php </span><span>require 'vendor/autoload.php'; </span><span> </span><span>use GuzzleHttp\Client; </span><span> </span><span>$client = new Client();</span>
mari kita teruskan ke sisi klien. Buat fail index.html dengan kod berikut:
<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>
Kami menggunakan jQuery (untuk pengendalian acara) dan responsif-voice.js. Perpustakaan suara responsif membolehkan kita menukar teks ke ucapan. Kami menggunakannya untuk bercakap hasil yang kami dapat dari pelayan.
Kami juga mempunyai pengiktirafan ucapan, yang kami gunakan untuk menukar ucapan kepada teks. Ini menggunakan API Ucapan Web. Malangnya, pada masa penulisan ia masih hanya disokong sebahagiannya pada beberapa pelayar, jadi tutorial ini akan menganggap anda menggunakan Chrome (yang menyokongnya).
mari kita jelaskan fail di atas. Pertama adalah pemboleh ubah global yang akan kami gunakan untuk menyimpan objek pengenalan ucapan semasa.
<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>
Seterusnya ialah kaedah StarTrecognition. Apa yang dilakukannya ialah mewujudkan objek pengiktirafan ucapan baru. Ini akan meminta pengguna menggunakan mikrofon. Seterusnya, kami menetapkan bahasa kepada bahasa Inggeris dan memulakan pengiktirafan pertuturan. Kami kemudian mendengar acara Onstart. Apabila peristiwa ini dicetuskan, ini bermakna pengiktirafan ucapan telah bermula. Kami memanggil kaedah UpdateRec apabila ini berlaku, yang mengubah teks butang untuk memulakan dan menghentikan pengiktirafan pertuturan. Kami juga mendengar acara OnResult yang dicetuskan apabila pengguna telah berhenti bercakap selama beberapa saat. Ini mengandungi hasil pengiktirafan pertuturan. Kita perlu gelung melalui hasil dan menggunakan item transkrip dalam setiap satu untuk mendapatkan teks yang kita perlukan. Setelah itu selesai, kami memanggil kaedah SetInput yang mengubah nilai medan teks pertanyaan dan memanggil kaedah hantar yang menyerahkan pertanyaan kepada pelayan. Seterusnya, kami memanggil kaedah StopRecognition untuk menghentikan pengiktirafan pertuturan dan mengemas kini UI. Kami juga perlu melakukan perkara yang sama dalam acara Onend.
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 ) )
Berikut adalah kaedah UpdateRec.
<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>
kaedah setInput.
<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>
kaedah stoprecognition.
<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}×tamp={$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>
Selain itu, kami juga mempunyai kaedah switchRecognition yang dipanggil setiap kali pengguna mengklik butang untuk mencetuskan pengiktirafan ucapan untuk memulakan atau berhenti.
<span><!DOCTYPE html> </span><span><html lang="en"> </span><span><head> </span><span> <meta charset="UTF-8"> </span><span> <title>time</title> </span><span> <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> </span><span> <script src="responsive-voice.js"></script> </span><span></head> </span><span><body> </span><span> <div> </span><span> <input type="text" id="query" name="query"> <button id="rec">Speak</button> </span><span> </div> </span><span> <div id="response"></div> </span><span> <script src="speech-recognition.js"></script> </span><span> <script src="main.js"></script> </span><span></body> </span><span></html></span>
Apabila pengguna menekan kekunci Enter pada medan pertanyaan, ini juga mencetuskan pertanyaan untuk dihantar ke pelayan.
<span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
Kebanyakan kod dalam fail pengiktirafan ucapan.js adalah dari intipati ini yang menunjukkan contoh cara menggunakan api.ai di sisi klien.
Seterusnya ialah fail main.js di mana kami menghantar pertanyaan kami ke pelayan. Sebaik sahaja kita mendapat respons, kita menggunakan suara responsif untuk bercakap dan juga mengeluarkannya dalam bekas tindak balas. Dengan cara itu, kita boleh menyemak respons secara visual.
<span>composer require guzzlehttp/guzzle:~5.0</span>
aplikasi seterusnya yang akan kami bina membolehkan pengguna menukar jumlah tertentu dari satu mata wang ke yang lain.
Pertama, buat ejen baru dan panggilnya CurrencyConverter.
seterusnya membuat niat baru dan panggilnya ConvertMoney.
Dari tangkapan skrin di atas, anda dapat melihat bahawa kami telah menambah perkara berikut di bawah bahagian 'Pengguna Says':
bahagian 'pengguna mengatakan' adalah di mana kita menentukan contoh apa yang pengguna boleh katakan untuk mencetuskan niat khusus ini. Apa yang kita lakukan di sini adalah menggunakan entiti sebagai pengganti untuk nilai sebenar yang boleh digunakan pengguna. @Sys.Number boleh merujuk kepada mana -mana nombor. @Currency boleh merujuk kepada mana -mana mata wang yang kami tambahkan sebelum ini apabila kami mencipta entiti mata wang. Menggunakan kolon selepas entiti membolehkan kami memberikan alias kepadanya. Alias ini kemudiannya boleh digunakan untuk mendapatkan nilai yang digunakan oleh pengguna dalam kod.
<span><?php </span><span>require 'vendor/autoload.php'; </span><span> </span><span>use GuzzleHttp\Client; </span><span> </span><span>$client = new Client();</span>Bahagian 'Tindakan' adalah di mana kita menentukan tindakan atau kaedah yang kita mahu laksanakan jika niat khusus ini digunakan. Dalam kes ini kita tidak akan menentukan apa -apa kerana kita hanya membuat aplikasi yang hanya melakukan satu perkara.
bahagian 'pemenuhan' adalah di mana kita menentukan templat untuk ucapan yang kita mahu output sebaik sahaja niat digunakan. Sebagai contoh, kita boleh meletakkan perkara berikut:
Ini kemudiannya boleh didapati pada item pertuturan dalam hasil yang kita dapat. Dari sana, kita boleh melakukan penggantian rentetan untuk menggantikan pembolehubah tersebut dengan nilai sebenar yang kita dapat. Tetapi mari kita biarkan ia kosong untuk aplikasi ini.
<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>Sebaik sahaja anda selesai, klik pada butang 'Simpan' untuk menyimpan niat.
Sekarang kami bersedia meneruskan kod tersebut. Buat fail Exchange.php dalam direktori kerja anda kemudian, tambahkan kod berikut:
<span>window.location.href = "https://www.youtube.com/results?search_query=pikachu";</span>
Seperti yang anda lihat dari kod di atas, ia pada dasarnya sama seperti yang kami lakukan sebelum ini dalam aplikasi sebelumnya. Hanya kali ini kami telah menambah pembolehubah $ currencylayer_apikey $. Ini menyimpan kekunci API yang kami dapat dari FirmanLayer.com, API yang membolehkan kami mendapatkan kadar pertukaran semasa dari satu mata wang ke yang lain. Jika anda ingin mengikuti, teruskan dan mendaftar untuk kunci API.
Seterusnya, kami periksa sama ada terdapat keputusan dan mengeluarkan data yang kami perlukan. Dalam kes ini, kita perlu mendapatkan mata wang yang pengguna ingin menukar, mata wang untuk menukarnya dan kemudian jumlahnya.
<span>composer require guzzlehttp/guzzle:~5.0</span>
Kami kemudian membuat permintaan ke API dan mengeluarkan kadar pertukaran dari hasilnya:
<span><?php </span><span>require 'vendor/autoload.php'; </span><span> </span><span>use GuzzleHttp\Client; </span><span> </span><span>$client = new Client();</span>
Hasil yang kita dapat dari API kelihatan seperti ini:
<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>
Sekarang kita mempunyai kadar pertukaran semasa, yang perlu kita lakukan sekarang adalah membiak kadar dengan jumlah yang diberikan pengguna dan kemudian mengeluarkan hasilnya.
<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>
Di sisi pelanggan, kami masih menggunakan HTML dan fail yang sama yang kami gunakan sebelum ini pada aplikasi pertama kami. Anda boleh meneruskan dan meletakkan fail yang sama dalam direktori kerja anda jika anda mengikuti.
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 ) )
Satu -satunya perbezaan ialah URL yang kami hantar permintaan. Tunjuk ke mana-mana nilai pertukaran anda.
<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>Kesimpulan
Soalan Lazim (Soalan Lazim) pada Apl PHP yang dikawal suara dengan API.AI
Atas ialah kandungan terperinci Aplikasi PHP yang dikawal suara dengan API.AI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!