引
还是讯飞,前两篇文章
语音识别
语音合成
参考链接
人脸识别说明文档:https://doc.xfyun.cn/msc_android/%E4%BA%BA%E8%84%B8%E8%AF%84%E6%B5%8B.html
API文档:http://mscdoc.xfyun.cn/android/api/
人脸识别
概述
人脸识别(Face Recognize),是一项提取人脸特征信息进行智能分析的生物识别技术,识别率高达99.4%,比肉眼更准确。 MSC SDK 中人脸识别(IdentityVerifier)功能,主要分为下面几类型:
(1)人脸验证——1:1 相似度对比 通过提取两张人脸的特征,进行相似度对比,最终返回相应的置信度得分,系统根据特征匹配程度决定“拒绝”或者“接受”。用于判断两个输入人脸是否属于同一人。
(2)人脸检索——1:N相似度对比 在大规模人脸数据库中快速找出与待检索人脸相似度最高的一个或多个人脸。
导入集成
参考第一篇文章
权限及初始化
这部分也依旧(实际上权限并不是照旧,可以有选择的去掉一部分,当然不去掉也行)
<!-- 连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取当前wifi状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序改变网络连接状态 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 读取手机信息权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取联系人权限,上传联系人需要用到此权限 -->
<uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 外存储写权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 外存储读权限,构建语法需要用到此权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 配置权限,用来记录应用配置信息 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
<!-- 定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
package com.example.a5_23face;
import android.app.Application;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
//我这里已经换了...
SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5ce61df0");
}
}
人脸注册
布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册"
android:id="@+id/button_reg"
android:onClick="regClick"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/imageView"
app:layout_constraintTop_toBottomOf="@+id/button_reg"/>
</android.support.constraint.ConstraintLayout>
代码
package com.example.a5_23face;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.iflytek.cloud.FaceRequest;
import com.iflytek.cloud.RequestListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechUtility;
import java.io.ByteArrayOutputStream;
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private static final int REQUESR_CODE_CAPTURE_CAMERA = 0x1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
}
//人脸注册
public void regClick(View view) {
//捕获照片
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
//是否返回正确
if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA) {
//即拍照所得的Bitmap
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
//开始请求平台识别
//请求对象
FaceRequest face = new FaceRequest(this);
//设置参数
face.setParameter(SpeechConstant.WFR_SST, "reg");
//唯一ID
face.setParameter(SpeechConstant.AUTH_ID, "test2019");
//把bitmap转换成字节数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
//一定要是JPEG,
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
byte[] imgData = out.toByteArray();
face.sendRequest(imgData, mRequestListener);
}
}
private RequestListener mRequestListener = new RequestListener() {
@Override
public void onEvent(int i, Bundle bundle) {
}
@Override
public void onBufferReceived(byte[] bytes) {
}
@Override
public void onCompleted(SpeechError speechError) {
//完成,存在
if (speechError == null) {
Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
System.out.println("注册成功");
}else {
Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();
}
}
};
}
效果
可能会遇到没反应的情况,所以专门补了一句
Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();
如果使用安卓9.0可能会出现错误代码
其实是老生常谈的问题了,适配一下就好
人脸验证
布局
在之前的基础上完成,增加一个按钮即可
代码
增加对应的点击事件、修改onActivityResult和监听器
package com.example.a5_23face;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.iflytek.cloud.FaceRequest;
import com.iflytek.cloud.RequestListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechUtility;
import java.io.ByteArrayOutputStream;
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private static final int REQUESR_CODE_CAPTURE_CAMERA = 0x1;
private static final int REQUESR_CODE_CAPTURE_CAMERA_LOGIN = 0x2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
}
//人脸注册
public void regClick(View view) {
//捕获照片
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//是否返回正确
if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA) {
//即拍照所得的Bitmap
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
//开始请求平台识别
//请求对象
FaceRequest face = new FaceRequest(this);
//设置参数
face.setParameter(SpeechConstant.WFR_SST, "reg");
//唯一ID
face.setParameter(SpeechConstant.AUTH_ID, "test2019");
//把bitmap转换成字节数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
//一定要是JPEG,
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
byte[] imgData = out.toByteArray();
face.sendRequest(imgData, mRequestListener);
} else if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA_LOGIN) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
imageView.setImageBitmap(bitmap);
FaceRequest face = new FaceRequest(this);
face.setParameter(SpeechConstant.MFV_SST, "verify");
face.setParameter(SpeechConstant.AUTH_ID, "test2019");
// 设置验证模式,单一验证模式:sin
face.setParameter(SpeechConstant.MFV_VCM, "sin");
//把bitmap转换成字节数组
ByteArrayOutputStream out = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
byte[] imgData = out.toByteArray();
face.sendRequest(imgData, mRequestListener);
}
}
private RequestListener mRequestListener = new RequestListener() {
@Override
public void onEvent(int i, Bundle bundle) {
}
@Override
public void onBufferReceived(byte[] bytes) {
//获取数据
String json = new String(bytes);
System.out.println(json);
}
@Override
public void onCompleted(SpeechError speechError) {
//完成,存在
if (speechError == null) {
Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
System.out.println("注册成功");
} else {
Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();
}
}
};
//人脸登录
public void loginClick(View view) {
Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA_LOGIN);
}
}
效果
返回一个byte数据,含有一个score,后续可以根据这个来判断是否符合,送佛送到西,顺便补一个简单的参考好了
如下即可拿到分数
@Override
public void onBufferReceived(byte[] bytes) {
//获取数据
System.out.println("test");
String json = new String(bytes);
try {
JSONObject jsonObject = new JSONObject(json);
System.out.println(jsonObject.get("score"));
} catch (JSONException e) {
e.printStackTrace();
}
System.out.println(json);
}