Search code examples
androidgoogle-glassvoice-recognition

I dont know how to change ok glass phrase in google glass


I want to make glass application with offline voice recognition with no ok glass what I want to know is changing ok glass to other words ( something like "start").

I saw the source decompiled GlassHome.apk and GlassVoice.apk. I knew that setting to ok glass is related with VoiceInputHelper, voice_label_ok_glass in String.xml

so I tried to change all of string "ok glass" to "nice"(temp guard phrase) in String.xml but when I said any word (like "hahaha" or "kakaka") , all of word I said is recognized to my guard phrase ("nice") by VoiceService.

what should I do for changing "ok glass" to my guard phrase and working it right ??????? (P.S sorry my bad english. I hope you understand what question means)

here is my code ( I tried to set VoiceConfig to "nice")

public class MainActivity extends GlassActivity implements VoiceListener {

public static final String TEST_SERVICE_EXTRAS_KEY = "serviceExtras";

private ImageView gradientView;
private GuardHintAnimator guardHintAnimator;
private TextView guardPhraseView;
private boolean isRunning = false;
private final FormattingLogger logger = FormattingLoggers.getLogger(this);
private VoiceConfig onWindowFocusChangedRecoverConfig;
private VoiceConfig voiceConfig;
@VisibleForTesting
VoiceInputHelper voiceInputHelper;
private IVoiceMenuDialog voiceMenuDialog;
public FormattingLogger getLogger()
{
    return this.logger;
}
public boolean isRunning()
{
    return this.isRunning;
}
@Override
protected void onCreateInternal(Bundle bundle) {
    super.onCreateInternal(bundle);

    this.voiceInputHelper = new VoiceInputHelper(this, new DelegatingVoiceListener(this)
    {
        public VoiceConfig onVoiceCommand(VoiceCommand paramAnonymousVoiceCommand)
        {
            if ((!MainActivity.this.hasWindowFocus()) && (!MainActivity.this.isMessageShowing()))
            {
                MainActivity.this.logger.d("Ignoring voice command because we don't have window focus.", new Object[0]);
                return null;
            }
            Log.d("listener",paramAnonymousVoiceCommand.toString());
            //return super.onVoiceCommand(paramAnonymousVoiceCommand);
            return null;
        }
    }, getVoiceServiceExtras());

}

protected void onPauseInternal()
{
    this.isRunning = false;
    super.onPauseInternal();
    closeVoiceMenu();
    this.voiceInputHelper.setVoiceConfig(VoiceConfig.OFF);
    this.voiceInputHelper.unregisterGrammarLoaders();
}
public void closeVoiceMenu()
{
    if (this.voiceMenuDialog != null)
    {
        this.voiceMenuDialog.dismiss(false);
        this.voiceMenuDialog = null;
    }
}
public void onPrepareVoiceMenu(VoiceMenuDialog paramVoiceMenuDialog) {}

public boolean onResampledAudioData(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
{
    return false;
}

protected void onResumeInternal()
{

    this.isRunning = true;
    super.onResumeInternal();
    this.voiceInputHelper.registerGrammarLoaders();
    this.voiceInputHelper.setWantAudioData(shouldProvideAudioData());
    NetworkUtil.checkNetwork();
    VoiceConfig localVoiceConfig = new VoiceConfig();
    String[] arrayOfString = new String[1];
    arrayOfString[0] = "nice";
    localVoiceConfig = localVoiceConfig.setCustomPhrases(arrayOfString).setShouldSaveAudio(true);
    voiceInputHelper.setVoiceConfig(localVoiceConfig);

}
public boolean isVoiceMenuShowing()
{
    return (this.voiceMenuDialog != null) && (this.voiceMenuDialog.isShowing());
}
public VoiceConfig onVoiceCommand(VoiceCommand paramVoiceCommand)
{
    Log.d("hhh",paramVoiceCommand.toString());
    this.logger.w("Unrecognized voice command: %s", new Object[] { paramVoiceCommand });
    return null;
}
protected Bundle getVoiceServiceExtras()
{
    Bundle localBundle = new Bundle();
/*    if (getIntent().hasExtra("serviceExtras"))
    {
        localBundle.putAll(getIntent().getBundleExtra("serviceExtras"));
    }*/
    return localBundle;
}

public void setVoiceConfig(VoiceConfig paramVoiceConfig)
{
    this.voiceConfig = paramVoiceConfig;
    if (paramVoiceConfig != null) {
        this.voiceInputHelper.setVoiceConfig(this.voiceConfig);
    }
}

public boolean shouldProvideAudioData()
{
    return false;
}
public void onVoiceConfigChanged(VoiceConfig paramVoiceConfig, boolean paramBoolean) {}

}

DelegatingVoiceListener :

class DelegatingVoiceListener implements VoiceListener { private final VoiceListener delegate;

DelegatingVoiceListener(VoiceListener paramVoiceListener)
{
    this.delegate = paramVoiceListener;
}

public FormattingLogger getLogger()
{
    return this.delegate.getLogger();
}

public boolean isRunning()
{
    return this.delegate.isRunning();
}

public boolean onResampledAudioData(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
{
    return this.delegate.onResampledAudioData(paramArrayOfByte, paramInt1, paramInt2);
}

public VoiceConfig onVoiceCommand(VoiceCommand paramVoiceCommand)
{
    return this.delegate.onVoiceCommand(paramVoiceCommand);
}

public void onVoiceConfigChanged(VoiceConfig paramVoiceConfig, boolean paramBoolean)
{
    this.delegate.onVoiceConfigChanged(paramVoiceConfig, paramBoolean);
}

}


Solution

  • You need to request special permissions in your manifest to implement unlisted voice commands. Go here. However, I doubt you can change the 'ok glass' voice command. You can still try if you really want to.