【问题标题】:How to open camera using voice search?如何使用语音搜索打开相机?
【发布时间】:2016-12-28 17:45:54
【问题描述】:

我是 Android 开发的新手。我正在尝试构建一个语音助手,我希望它在我说出特定单词时打开相机。我知道如何将语音转换为文本,但我无法打开相机。

if (Text.getText().toString().equals("Launch camera")){
  saySomething("Launching camera");
  // How do I make it launch the camera?
}

编辑:

到目前为止,我的应用程序将语音转换为文本,然后它会查找它是否等于命令并以这种方式响应。我对此有 2 个问题。

  1. 我可以在文本中使用“包含”吗?

  2. 如何让它先响应,然后再变成文本?

代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case RESULT_SPEECH: {
            if (resultCode == RESULT_OK && null != data) {
                ArrayList<String> text = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                Text.setText(text.get(0));
            }
            if (Text.getText().toString().equals("Hello")){
                saySomething("Hello");
            }
        }

    }
}

【问题讨论】:

  • 您想通过按钮点击还是语音打开相机?
  • 通过语音,但我有代码可以将其转换为文本并查看它是否包含该命令,但我无法弄清楚如何让它启动相机应用程序

标签: java android android-studio


【解决方案1】:

你需要在android中实现Speech to TextRecognizerIntentRecognizerIntent将给出用户所说的文本版本,稍后你可以使用结果文本result.contains("Launch camera")来验证结果文本是否包含你想要的操作,它基本上会给你一个可能的结果列表,你可以通过所有来匹配你的input

@Override
public void onResults(Bundle results) {
    List<String> list=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    for(String s: list)
    {
        if(s.contains("Launch camera"))
        {
         dispatchTakePictureIntent()
         // call the function to take picture 
         break;
        }
    }
}

将下面的代码添加到你的类中

// constant variable for request code 
static final int REQUEST_IMAGE_CAPTURE = 1;

// function to open the camera app using explicit intent 
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }

稍后您将在onActivityResult 中收到回复,您可以从data intent 获取您的图片

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     // verify the successful completion of picture taken
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

        // get the bundle 
        Bundle extras = data.getExtras();

        // imageBitmap will hold the image you are looking for 
        Bitmap imageBitmap = (Bitmap) extras.get("data");

        // optionally you can display this pic in some ImageView or can delete this line
        mImageView.setImageBitmap(imageBitmap);
    }
}

Code implementation

Android Speech to Text Example

Taking Photos Simply


我可以在文本中使用“包含”吗?

是的,您可以使用contains 来匹配和验证您找到的结果,这是用户输入的必需文本。你应该使用contains,因为equals只会在你找到一个精确的词对词匹配的时候起作用,并且可能会有一些影响响应文本的噪音,所以更安全的选择是使用contains

我怎样才能让它先响应,然后再变成文本?

基本上使用RecognizerIntent,输入已经转换为文本,您还需要文本输入稍后将其显示到您的TextView,因此您可以先启动相机意图并在拍照后显示文本因此将匹配内容存储到某个 String 变量中,然后使用该变量将其显示到您的 TextView

String inputcommand="";

@Override
public void onResults(Bundle results) {
    List<String> list=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    for(String s: list)
    {
        if(s.contains("Launch camera"))
        {
            // store your match in global variable to use it later
            inputcommand = s;

            dispatchTakePictureIntent()
            // respond it first  
         break;
        }
    }
}

图片捕捉成功后即可显示文字

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        ...            // same above mentioned code

        // display your input in TextView
        Text.setText(inputcommand );
    }
}

【讨论】:

  • 我已经有了,但我不知道如何让它打开相机应用程序
  • @BurakDemirelli 让我更新我的答案以获得更清晰的答案,但您必须研究“简单拍照”链接部分,即“获取缩略图”
  • @BurakDemirelli 如果这对您有用,那么您可以通过单击左侧的勾号图标来接受感谢我的答案,祝您编码愉快,是的,您可以提出更多问题,除非它们对于 cmets 来说太大了
  • 我让我的应用程序将语音转换为文本,然后我让它检查它是否等于语音命令我没有直接让它搜索它是否包含命令,现在我不确定是否我可以包含“包含”。如果在 cmets 中难以解释,我可以将其作为问题提出?
  • 非常感谢!你帮了我很多,如果没有这个帮助,这个项目需要很长时间。
猜你喜欢
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多