ভয়েস ইনপুট আপনাকে সত্যিকারের হ্যান্ডস-ফ্রি ইন্টারফেস তৈরি করতে দেয়। গ্লাস আপনাকে ভয়েস ইনপুট ব্যবহার করার তিনটি উপায় দেয়।
প্রধান ভয়েস কমান্ডগুলি হোম কার্ড থেকে গ্লাসওয়্যার শুরু করে, প্রাসঙ্গিক ভয়েস কমান্ডগুলি একটি কার্যকলাপের মধ্যে ক্রিয়া সম্পাদন করতে পারে এবং সিস্টেমের বক্তৃতা শনাক্তকরণ কার্যকলাপ আপনাকে ব্যবহারকারীদের কাছ থেকে ফ্রি-ফর্ম ভয়েস ইনপুট পেতে দেয়।
প্রধান ভয়েস কমান্ড
এই ভয়েস কমান্ডগুলি হোম কার্ড (ক্লক কার্ড) থেকে গ্লাসওয়্যার চালু করে। আপনি যখন একটি প্রধান ভয়েস কমান্ড ঘোষণা করেন, ব্যবহারকারীরা হোম কার্ডে ট্যাপ করে আপনার গ্লাসওয়্যার শুরু করার সিদ্ধান্ত নিলে গ্লাস স্বয়ংক্রিয়ভাবে ফলব্যাক হিসাবে একটি টাচ মেনু আইটেম তৈরি করে।
ঠিক আছে গ্লাস ভয়েস প্রধান মেনুতে একটি ভয়েস কমান্ড যোগ করতে:
res/xml/<my_voice_trigger>.xml
এ ভয়েস কমান্ডের জন্য একটি XML সংস্থান তৈরি করুন যাVoiceTriggers.Command
এ সংজ্ঞায়িত বিদ্যমান ভয়েস কমান্ডগুলির একটি ব্যবহার করে। উদাহরণস্বরূপ, এখানে "একটি দৌড় শুরু করুন" কীভাবে ব্যবহার করবেন।<?xml version="1.0" encoding="utf-8"?> <trigger command="START_A_RUN" />
একটি ভয়েস কমান্ড তৈরি করতে যা ব্যবহারকারীকে আপনার কার্যকলাপ বা পরিষেবা শুরু করার আগে একটি অতিরিক্ত বাক্যাংশ বলতে অনুরোধ করে, একটি
input
উপাদানও অন্তর্ভুক্ত করুন। উদাহরণস্বরূপ, আপনি যদি "আপডেট পোস্ট করুন" ব্যবহার করেন তবে আপনি এটি করতে চাইতে পারেন।<?xml version="1.0" encoding="utf-8"?> <trigger command="POST_AN_UPDATE"> <input prompt="@string/glass_voice_prompt" /> </trigger>
আপনার Android ম্যানিফেস্টে
com.google.android.glass.action.VOICE_TRIGGER
অ্যাকশন ব্যবহার করে একটি অভিপ্রায় ফিল্টার নিবন্ধন করুন৷ অভিপ্রায় ফিল্টার আপনার ক্রিয়াকলাপ বা পরিষেবা শুরু করে যদি এটি সনাক্ত করে যে ব্যবহারকারীরা আপনার ভয়েস কমান্ড বলছে।<?xml version="1.0" encoding="utf-8"?> <application ...> <activity | service ...> <intent-filter> <action android:name= "com.google.android.glass.action.VOICE_TRIGGER" /> </intent-filter> <meta-data android:name="com.google.android.glass.VoiceTrigger" android:resource="@xml/my_voice_trigger" /> </activity | service> // ... </application>
আপনার কার্যকলাপ বা পরিষেবার জন্য একটি
android:icon
বৈশিষ্ট্য ঘোষণা করুন। এটি গ্লাসকে ঠিক আছে, গ্লাস টাচ মেনুতে আপনার গ্লাসওয়্যারের জন্য একটি আইকন প্রদর্শন করতে দেয়।<activity |service android:icon="@drawable/my_icon" ...> ... </activity | service>
যদি আপনার ভয়েস কমান্ড একটি ভয়েস প্রম্পট ব্যবহার করে এবং একটি কার্যকলাপ শুরু করে, তাহলে নিম্নলিখিত কোড সহ যেকোনো প্রতিলিপি করা পাঠ্য পান (যেমন
onResume()
):ArrayList<String> voiceResults = getIntent().getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS);
যদি ভয়েস কমান্ড একটি পরিষেবা শুরু করে, তাহলে অভিপ্রায় অতিরিক্ত
onStartCommand()
কলব্যাকে উপলব্ধ:@Override public int onStartCommand(Intent intent, int flags, int startId) { ArrayList<String> voiceResults = intent.getExtras() .getStringArrayList(RecognizerIntent.EXTRA_RESULTS); // ... }
সীমাবদ্ধতা সেট করা
আপনার গ্লাসওয়্যার শুরু করার জন্য আপনার যদি নিম্নলিখিত বৈশিষ্ট্যগুলির একটি বা সমস্ত প্রয়োজন হয়, সেগুলিকে res/xml/<my_voice_trigger>.xml
রিসোর্সে উল্লেখ করুন৷ বৈশিষ্ট্যগুলি উপলব্ধ না হলে, গ্লাস ভয়েস কমান্ড অক্ষম করে:
-
camera
-
network
microphone
<trigger command="POST_AN_UPDATE"> <constraints camera="true" network="true" /> </trigger>
প্রাসঙ্গিক ভয়েস কমান্ড
প্রাসঙ্গিক ভয়েস কমান্ড ব্যবহারকারীদের কার্যকলাপ থেকে ক্রিয়া সম্পাদন করতে দেয়। আপনি স্ট্যান্ডার্ড অ্যান্ড্রয়েড মেনু API এর সাথে প্রাসঙ্গিক ভয়েস কমান্ড তৈরি করেন তবে ব্যবহারকারীরা স্পর্শের পরিবর্তে ভয়েস কমান্ড সহ মেনু আইটেমগুলিকে আহ্বান করতে পারেন।
একটি নির্দিষ্ট কার্যকলাপের জন্য প্রাসঙ্গিক ভয়েস কমান্ড সক্ষম করতে:
প্রাসঙ্গিক ভয়েস কমান্ড সক্ষম করতে পছন্দসই কার্যকলাপে
getWindow().requestFeature(
WindowUtils.FEATURE_VOICE_COMMANDS
)
এ কল করুন। এই বৈশিষ্ট্যটি সক্ষম করার সাথে, যখনই এই কার্যকলাপটি ফোকাস পায় তখনই স্ক্রিনের ফুটার এলাকায় "ওকে গ্লাস" মেনু প্রদর্শিত হয়৷onCreatePanelMenu()
ওভাররাইড করুন এবং যেখানেWindowUtils.FEATURE_VOICE_COMMANDS
সক্ষম করা আছে সেটি পরিচালনা করুন। যদি সক্ষম করা থাকে, এখানেই আপনি এক-কালীন মেনু সেটআপ করেন, যেমন একটি মেনু সংস্থান ফুলিয়ে দেওয়া বা আপনার ভয়েস মেনু সিস্টেম তৈরি করতেMenu.add()
পদ্ধতিতে কল করা।ব্যবহারকারীরা যখন কথা বলে তখন ভয়েস কমান্ডগুলি পরিচালনা করতে
onMenuItemSelected()
ওভাররাইড করুন। যখন ব্যবহারকারীরা একটি মেনু আইটেম নির্বাচন করা শেষ করেন, তখন "ঠিক আছে, গ্লাস" ভয়েস কমান্ডটি স্বয়ংক্রিয়ভাবে স্ক্রীনের ফুটার বিভাগে পুনরায় উপস্থিত হয়, যতক্ষণ কার্যকলাপটি ফোকাসে থাকে ততক্ষণ একটি নতুন ভয়েস কমান্ড গ্রহণ করার জন্য প্রস্তুত।নিম্নলিখিত কোডটি প্রাসঙ্গিক ভয়েস কমান্ডগুলিকে সক্ষম করে, উপযুক্ত হলে একটি মেনু সংস্থানকে স্ফীত করে এবং যখন তারা কথা বলা হয় তখন ভয়েস কমান্ডগুলি পরিচালনা করে:
public class ContextualMenuActivity extends Activity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); // Requests a voice menu on this activity. As for any other // window feature, be sure to request this before // setContentView() is called getWindow().requestFeature(WindowUtils.FEATURE_VOICE_COMMANDS); setContentView(R.layout.activity_main); } @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { getMenuInflater().inflate(R.menu.main, menu); return true; } // Pass through to super to setup touch menu. return super.onCreatePanelMenu(featureId, menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { switch (item.getItemId()) { case R.id.dogs_menu_item: // handle top-level dogs menu item break; case R.id.cats_menu_item: // handle top-level cats menu item break; case R.id.lab_menu_item: // handle second-level labrador menu item break; case R.id.golden_menu_item: // handle second-level golden menu item break; case R.id.calico_menu_item: // handle second-level calico menu item break; case R.id.cheshire_menu_item: // handle second-level cheshire menu item break; default: return true; } return true; } // Good practice to pass through to super if not handled return super.onMenuItemSelected(featureId, item); } }
পূর্ববর্তী কার্যকলাপ দ্বারা ব্যবহৃত মেনু সম্পদের একটি উদাহরণ এখানে। লক্ষ্য করুন কিভাবে আপনি একটি শ্রেণিবদ্ধ ভয়েস মেনু সিস্টেমের জন্য নেস্টেড মেনু আইটেম তৈরি করতে পারেন। নিম্নলিখিত উদাহরণে, প্রথম মেনু আইটেমটি এইভাবে অ্যাক্সেস করা যেতে পারে: ঠিক আছে গ্লাস, আমাকে কুকুর দেখান, ল্যাব্রাডর ।
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/dogs_menu_item" android:title="@string/show_me_dogs"> <menu> <item android:id="@+id/lab_menu_item" android:title="@string/labrador" /> <item android:id="@+id/golden_menu_item" android:title="@string/golden" /> </menu> </item> <item android:id="@+id/cats_menu_item" android:title="@string/show_me_cats"> <menu> <item android:id="@+id/cheshire_menu_item" android:title="@string/cheshire" /> <item android:id="@+id/calico_menu_item" android:title="@string/calico" /> </menu> </item> </menu>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Use the constants defined in the ContextualMenus.Command enum--> <item android:id="@+id/play_menu_item" android:title="PLAY_MUSIC" /> <item android:id="@+id/pause_menu_item" android:title="PAUSE_MUSIC" /> </menu>
(ঐচ্ছিক) ওভাররাইড
onPreparePanel()
,WindowUtils.FEATURE_VOICE_COMMANDS
সক্ষম আছে কিনা তা পরীক্ষা করে দেখুন। যদি সক্ষম করা থাকে, এখানে আপনি মেনু সিস্টেম সেট আপ করার জন্য অন্যান্য যুক্তি করতে পারেন, যেমন কিছু মানদণ্ডের উপর ভিত্তি করে নির্দিষ্ট মেনু আইটেম যোগ করা এবং অপসারণ করা। আপনি কিছু মানদণ্ডের উপর ভিত্তি করে প্রাসঙ্গিক ভয়েস মেনু চালু (true
ফেরত) এবং বন্ধ (false
ফেরান) টগল করতে পারেন। যেমন:private boolean mVoiceMenuEnabled; ... @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS) { // toggle this boolean on and off based on some criteria return mVoiceMenuEnabled; } // Good practice to call through to super for other cases return super.onPreparePanel(featureId, view, menu); }
একই সাথে ভয়েস এবং স্পর্শ মেনু সমর্থন করে
যেহেতু প্রাসঙ্গিক ভয়েস কমান্ড বিদ্যমান অ্যান্ড্রয়েড মেনু API ব্যবহার করে, আপনি টাচ মেনুগুলির জন্য আপনার কাছে ইতিমধ্যে থাকা অনেক কোড এবং সংস্থান পুনরায় ব্যবহার করতে পারেন এবং একই সাথে উভয় ধরণের মেনু সমর্থন করতে পারেন৷
আপনাকে যা করতে হবে তা হল WindowUtils.FEATURE_VOICE_COMMANDS
ছাড়াও Window.FEATURE_OPTIONS_PANEL
বৈশিষ্ট্যটি পরীক্ষা করা .
উদাহরণস্বরূপ, আপনি এই মত স্পর্শ মেনুর জন্য সমর্থন যোগ করতে পূর্ববর্তী কার্যকলাপ উদাহরণ পরিবর্তন করতে পারেন (পরিবর্তন মন্তব্য করা হয়):
// 1. Check for Window.FEATURE_OPTIONS_PANEL
// to inflate the same menu resource for touch menus.
@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
// 2. Check for Window.FEATURE_OPTIONS_PANEL
// to handle touch menu item selections.
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (featureId == WindowUtils.FEATURE_VOICE_COMMANDS ||
featureId == Window.FEATURE_OPTIONS_PANEL) {
...
}
এই পরিবর্তনগুলির সাথে, আপনি হয় ট্যাপ করতে পারেন বা বলতে পারেন ওকে গ্লাস আপনার মেনু প্রদর্শন করতে।
উন্নয়নের জন্য তালিকাবিহীন ভয়েস কমান্ড ব্যবহার করা
আপনি যখন আপনার গ্লাসওয়্যার বিতরণ করতে চান, আপনাকে অবশ্যই VoiceTriggers.Command
এ অনুমোদিত প্রধান ভয়েস কমান্ড এবং ContextualMenus.Command
এ অনুমোদিত প্রাসঙ্গিক ভয়েস কমান্ড ব্যবহার করতে হবে।
আপনি যদি ভয়েস কমান্ডগুলি ব্যবহার করতে চান যা GDK-এ উপলব্ধ নয়, আপনি আপনার AndroidManifest.xml
ফাইলে একটি Android অনুমতির অনুরোধ করতে পারেন:
<uses-permission
android:name="com.google.android.glass.permission.DEVELOPMENT" />
তালিকাবিহীন প্রধান ভয়েস কমান্ড ব্যবহার করা
res/values/strings.xml
এ একটি স্ট্রিং মান ঘোষণা করুন যা আপনার ভয়েস ট্রিগারের নাম নির্ধারণ করে। আপনার গ্লাসওয়্যার শুরু করার আগে স্পিচ রিকগনিশন গ্লাসওয়্যার প্রদর্শন করতে ঐচ্ছিকভাবে একটি ভয়েস প্রম্পট ঘোষণা করুন।<?xml version="1.0" encoding="utf-8"?> <resources> <string name="glass_voice_trigger">read me a story</string> <string name="glass_voice_prompt">what story?</string> </resources>
res/xml/<my_voice_trigger>.xml
এ ভয়েস ট্রিগারের জন্য একটি XML সংস্থান তৈরি করুন। তালিকাবিহীন ভয়েস কমান্ডের জন্য, অনুমোদিত ভয়েস কমান্ডের জন্য ব্যবহৃতcommand
অ্যাট্রিবিউটের পরিবর্তে আপনারkeyword
অ্যাট্রিবিউট ব্যবহার করা উচিত।keyword
অ্যাট্রিবিউটটি ভয়েস কমান্ডকে সংজ্ঞায়িত করে এমন স্ট্রিং রিসোর্সের একটি রেফারেন্স হওয়া উচিত। একটি সাধারণ ভয়েস ট্রিগারের জন্য যা অবিলম্বে একটি কার্যকলাপ বা পরিষেবা শুরু করে, কেবলtrigger
উপাদান নির্দিষ্ট করুন:<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger" />
একটি ভয়েস ট্রিগার তৈরি করতে যা ব্যবহারকারীকে আপনার কার্যকলাপ বা পরিষেবা শুরু করার আগে একটি অতিরিক্ত বাক্যাংশ বলতে অনুরোধ করে, একটি ইনপুট উপাদানও অন্তর্ভুক্ত করুন:
<?xml version="1.0" encoding="utf-8"?> <trigger keyword="@string/glass_voice_trigger"> <input prompt="@string/glass_voice_prompt" /> </trigger>
তালিকাবিহীন প্রাসঙ্গিক ভয়েস কমান্ড ব্যবহার করা
মেনু আইটেম তৈরি করার সময়, মেনু আইটেমের শিরোনামের জন্য যেকোনো পাঠ্য ব্যবহার করুন। যেমন:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Use the constants defined in the ContextualMenus.Command enum-->
<item
android:id="@+id/pizza_menu_item"
android:title="@string/find_pizza" />
</menu>
বক্তৃতা স্বীকৃতি শুরু হচ্ছে
স্পিচ রিকগনিশন গ্লাসওয়্যার ব্যবহারকারীদের কথা বলার জন্য অপেক্ষা করে এবং ট্রান্সক্রাইব করা টেক্সট শেষ হওয়ার পর ফেরত দেয়। কার্যক্রম শুরু করতে:
-
ACTION_RECOGNIZE_SPEECH
অভিপ্রায় সহstartActivityForResult()
কল করুন। কার্যকলাপ শুরু করার সময় নিম্নলিখিত অভিপ্রায় অতিরিক্ত সমর্থিত হয়: EXTRA_RESULTS
অভিপ্রায় অতিরিক্ত থেকে প্রতিলিপিকৃত পাঠ্য পেতেonActivityResult()
কলব্যাক ওভাররাইড করুন। ব্যবহারকারীরা কথা বলা শেষ করলে এই কলব্যাক বলা হয়।private static final int SPEECH_REQUEST = 0; private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); startActivityForResult(intent, SPEECH_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SPEECH_REQUEST && resultCode == RESULT_OK) { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); // Do something with spokenText. } super.onActivityResult(requestCode, resultCode, data); }