@ech199801 建議整個專案sync下來build比較穩唷
因為我們飯粒有測試過可以build過,有些gradle吃libary的寫法也先寫好在裡面了,會減少在環境上study的時間
Posts made by wu.will
@musicsusanshen
針對第一個問題 playFaceAnimation(int id)
目前此API是我們開發中先定義出來的Interface,尚未實現,目前凱比臉僅能控制嘴巴與show/hide唷
https://developer-docs.nuwarobotics.com/sdk/javadoc/reference/com/nuwarobotics/service/facecontrol/UnityFaceManager.html
針對問題二,
是否有相關log可以參考?
另外提醒一下,此API僅適用於下一次的startTTS
請在每次下startTTS前設定這個參數
mRobot.setSpeakParameter(VoiceEventListener.SpeakType.NORMAL, "pitch", "100"); //the parameters is 50~200
mRobot.setSpeakParameter(VoiceEventListener.SpeakType.NORMAL, "speed", "100"); //the parameters is 50~200
mRobot.setSpeakParameter(VoiceEventListener.SpeakType.NORMAL, "isForced", "true"); //MUST set as true
mRobot.startTTS("說話字串");
@w-lchang1108 這個API僅支援,用於預設主要辨識的語言。
目前無API用於設定只辨識某個語言唷。
@grace861211 請問您是使用標準Android Camera API開啟相機嗎?
可否分享一下程式碼片段呢?
Hi @hang ,
我們NUWA提供的語音觸發有兩條路可以走
- activity : 宣告在這裡,nuwa聽到你定義的語音詞,會"開啟" 直接startActivity
- receiver : 宣告在這裡,nuwa聽到你定義的語音詞,會"通知" broadcast intent給該receiver
若你需要"開啟"Activity,需要宣告的是Activity內的metadata與action即可
<activity
android:name=".YouAppClass"
android:exported="true"
android:label="App Name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="com.nuwarobotics.api.action.VOICE_COMMAND" />
</intent-filter>
<meta-data android:name="com.nuwarobotics.api.action.VOICE_COMMAND" android:value="你的語音詞" >
</activity>
試試看~~
我覺得跟我猜的差不多^^"
你每次click item都會檢查一次所有宣告的權限 (包含你宣告的+NuwaSDK Manifest內宣告的)
但由於 nuwa sdk 內宣告的這兩個,因為這兩個要系統APP才能取得權限,因此你們永遠都無法取得權限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
這導致了你的allPermissionsGranted() 永遠都會回傳false.
- 小提醒 : 你使用的PackageInfo 內的requestPermissions 取得的是所有<uses-permission>宣告,但並非所有宣告都屬於run time permission。 (只有runtime permission可以被使用者同意取得權限)
https://stackoverflow.com/questions/39421952/packageinfo-requestedpermissions-vs-permissions
我猜測你們這段權限判斷,是不是只是想確保每次click run time permission都有被允許??
一般來說(Google建議)runtime permission都要在一開APP的時候就確認
底下給個sample code參考一下,你只需要針對runtime permission在一開始的時候確認即可,一但取得權限了,通常不會在APP UI執行期間重複的檢查
private static final int PERMISSION_REQUEST_PERM = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
this.requestPermissions();
}else{
checkSystemWritePermission();
}
}
private void requestPermissions() {
String[] permissions = new String[] {
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.READ_PHONE_STATE};
ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_PERM );
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case LOCATION_PERM:
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Log.e(TAG, "Coarse location permission is not granted!");
finish();
}
break;
}
}
@chuangwater2487 很抱歉範例沒有說明清楚
目前Kebbi Air硬體版本臉部觸控,改用新的API
我們在下面臉部控制範例中,加上了收face touch callback的範例
https://github.com/nuwarobotics/NuwaSDKExample/blob/master/app/src/main/java/com/nuwarobotics/example/activity/FaceControlExampleActivity.java
若有正確收到事件,會有底下log出現
請參考一下~~
@chuangwater2487 NuwaSDK確實有宣告這兩個permission, 但在一般情況下應該是不會因為宣告了而造成程式異常。
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
可否分享更多點的程式片斷讓我幫忙看看,我在想會不會是你判斷權限的地方若有一個permission沒有被grant就把整個行為檔掉。
如果是的話,可能要請你調整一下判斷,ignore讓INSTALL_PACKAGES permission不會因為沒有grant而檔掉你的行為。
@grace861211 可以壓,如果要依序一直撥放下去
可以收onCompleteOfMotionPlay作為開始下一個motion的開始點~
onCompleteOfMotionPlay callback用途是通知APP,你撥放的這個motion完成了。
@dick510091
Hi,
程式碼部分可以參考GitHub上的範例
https://github.com/nuwarobotics/NuwaSDKExample/blob/master/app/src/main/java/com/nuwarobotics/example/motion/demo/PlayMotionActivity.java
這個是個簡單撥放動作的程式碼,裡面有初始化,收callback等最基本的程式碼範例
另外Gradle的設定可以參考這支
https://github.com/nuwarobotics/NuwaSDKExample/blob/master/app/build.gradle
@chuangwater2487
Hi, 您好
你的寫法看起來沒有甚麼問題,主要是命令部分可能要調整一下
"I want to watch TV,I want to sleep,I want to turn on air conditioner"
有幾個重點
- 繁體中文版的凱比,語音是聽中文,故請先試著使用中文關鍵字(不要中英混合)
- 此字串會與語音辨識後結果做比對,若關鍵字中不了,請嘗試調整命令字串。
@chuangwater2487
感謝您回報此問題。
您好,我們已經確認問題原因,並正在確認如何修改,將修正於未來的版本。
@lyr 您好,由於機器人設計與隱私的疑慮,SDK不允許收系統事件唷,目前APP僅能透過SDK取得自己觸發的那次收音字串。
@aas2854tw 您好,經過詢問較熟悉Unity開發的同仁,可以參考下面這個討論串
https://forum.unity.com/threads/redirect-to-app-settings.461140/
擷取內文的範例
Android Intent Example
String packageName = activity.getPackageName();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", packageName, null));
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
activity.startActivity(intent);
Unity 寫法
try
{
#if UNITY_ANDROID
using (var unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
using (AndroidJavaObject currentActivityObject = unityClass.GetStatic<AndroidJavaObject>("currentActivity"))
{
string packageName = currentActivityObject.Call<string>("getPackageName");
using (var uriClass = new AndroidJavaClass("android.net.Uri"))
using (AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("fromParts", "package", packageName, null))
using (var intentObject = new AndroidJavaObject("android.content.Intent", "android.settings.APPLICATION_DETAILS_SETTINGS", uriObject))
{
intentObject.Call<AndroidJavaObject>("addCategory", "android.intent.category.DEFAULT");
intentObject.Call<AndroidJavaObject>("setFlags", 0x10000000);
currentActivityObject.Call("startActivity", intentObject);
}
}
#endif
}
catch (Exception ex)
{
Debug.LogException(ex);
}
這部分給您參考看看
@aas2854tw Hi, 請透過Voice Callback來收狀態
How to know STT/TTS state
ㆍ TTS state
- onSpeakState(VoiceEventListener.SpeakType type,
VoiceEventListener.SpeakState state):
ㆍ STT state - onSpeechState(VoiceEventListener.ListenType type,
VoiceEventListener.SpeechState state)
@chuangwater2487 Hi, 想請你幫忙檢查一下,是否有import相關class
import com.nuwarobotics.service.IClientId;
import com.nuwarobotics.service.agent.NuwaRobotAPI;
import com.nuwarobotics.service.agent.RobotEventListener;
另外我注意到app\build.gradle沒有宣告這段,可能會找不到位於\libs路徑下的aar檔案
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
以上線索可以參考一下
@lyr 您好, 可以參考這個範例
https://github.com/nuwarobotics/NuwaSDKExample/blob/master/app/src/main/java/com/nuwarobotics/example/voice/CloudASRActivity.java
此範例中BtnStart(View view) 按鈕,觸發了
mRobotAPI.startSpeech2Text(false);//Start listen without wakeup
此行為就可以開啟機器人開始聆聽
當機器人收到聲音,並辨識出來後,會從這個callback給出辨識後的文字字串
public void onSpeech2TextComplete(boolean isError, String json) {
Log.d(TAG, "onSpeech2TextComplete:" + !isError + ", json:" + json);
//Step 5 : Robot recognized the word of user speaking on onMixUnderstandComplete
//both startMixUnderstand and startLocalCommand will receive this callback
String result_string = VoiceResultJsonParser.parseVoiceResult(json);
//Step 6 : Request Robot speak what you want.
setText(getCurrentTime() + "onSpeech2TextComplete:" + !isError + ", result:" + result_string, false);
runOnUiThread(new Runnable() {
@Override
public void run() {
//Allow user click button.
mStartBtn.setEnabled(true);
mStopBtn.setEnabled(false);
}
});
}