Node.js使用科大讯飞web API实现人脸对比

目录

1.先吧需要的模块引入进来 这里我发送http请求使用的是requset模块

2.对请求进行签名

 3.请求参数

4.发送请求 

附上完整代码吧 


最近无事研究了一下人脸对比,白嫖了一下科大讯飞的人脸对比API,但是文档里只有java和python的demo并没有node的demo,而我又只是个小前端 只会写写node,所以只能自己研究咯

先根据文档所说做好准备工作,注册科大讯飞开发者,获取服务接口认证信息

科大讯飞的API很好获取 先去注册账户再实名认证就可以得到免费的API,每天500次,调试学习够用了

按照文档一步一步来,

1.先吧需要的模块引入进来 这里我发送http请求使用的是requset模块

封装一个方法读取图片base64编码

// 引入服务端http/https请求模块
const request = require("request");
// hmac-sha256算法要使用的模块
const crypto = require("crypto");
// nodejs路径模块
const path = require("path");
// nodejs自带文件读写模块
const fs = require("fs");

// 图片转base64
function parse(file) {
  // 获取原始文件地址
  let filePath = path.resolve(file);
  // 读取文件数据
  let data = fs.readFileSync(filePath);
  // 获取图片base64编码
  data = Buffer.from(data).toString("base64");
  return data;
}

这里重要说一下hmac-sha256算法查了好多资料最后还是使用了node自带的crypto模块

其他的加密出来多多少少有点差异

2.对请求进行签名

在调用业务接口时,请求方需要对请求进行签名,服务端通过签名来校验请求的合法性。 通过在请求地址后面加上鉴权相关参数的方式,参数具体如下: 

https://api.xf-yun.com/v1/private/s67c9c78c?authorization=YXBpX2tleT0iYXBpa2V5WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iSk5od3prMWtLYjUwdUVGbEUxS2xCbk83K09NTjNZUk5LZVFsYzVMYVltTT0i&host=api.xf-yun.com&date=Fri%2C+17+Jul+2020+06%3A26%3A58+GMT

代码如下

注意:signature原始字段由 host,date,request-line三个参数按照格式拼接成,
拼接的格式为(\n为换行符,’:’后面有一个空格)

// 1)获取接口密钥APIKey 和 APISecret。
const apiKey = "xxxxxxxxxxxxxxxxxxxx";
const apiSecret = "xxxxxxxxxxxxxxxxxxxxxx";
const appId = "xxxxxxx";

// 2)参数authorization base64编码前(authorization_origin)的格式如下。
// api_key="$api_key",algorithm="hmac-sha256",headers="host date request-line",signature="$signature"

// 3)signature的原始字段(signature_origin)规则如下。 host: $host\ndate: $date\n$request-line
const date = new Date().toGMTString(); // 获取GMT时间
const signature_origin = `host: api.xf-yun.com\ndate: ${date}\nPOST /v1/private/s67c9c78c HTTP/1.1`;

// 4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。
// signature_sha=hmac-sha256(signature_origin,$apiSecret)
const hmac = crypto.createHmac("sha256", apiSecret);
hmac.update(signature_origin);
const signature_sha = hmac.digest("bytes");

// 5)使用base64编码对signature_sha进行编码获得最终的signature。
const signature = signature_sha.toString("base64");

// 6)根据以上信息拼接authorization base64编码前(authorization_origin)的字符串,示例如下。
const authorization_base64 = `api_key=${apiKey},algorithm="hmac-sha256",headers="host date request-line",signature="${signature}"`;

// 7)最后再对authorization_origin进行base64编码获得最终的authorization参数。
let authorization = new Buffer.from(authorization_base64).toString("base64");

console.log("authorization", authorization);

最终输出结果

YXBpX2tleT0iYXBpa2V5WFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgiLCBhbGdvcml0aG09ImhtYWMtc2hhMjU2IiwgaGVhZGVycz0iaG9zdCBkYXRlIHJlcXVlc3QtbGluZSIsIHNpZ25hdHVyZT0iSk5od3prMWtLYjUwdUVGbEUxS2xCbk83K09NTjNZUk5LZVFsYzVMYVltTT0i

 3.请求参数

注意,请求体http request body必须是json字符串

获取图片base64编码

// 请求体body
let body = {
  header: {
    // 这里使用上方从科大讯飞控制台获取的APPID
    app_id: appId,
    status: 3,
  },
  parameter: {
    s67c9c78c: {
      service_kind: "face_compare",
      face_compare_result: {
        encoding: "utf8",
        compress: "raw",
        format: "json",
      },
    },
  },
  payload: {
    input1: {
      encoding: "jpg",
      status: 3,
        // 图片地址自行替换
      image: parse("public/upload/20221121/A717A672AB4B90AD.jpg"),
    },
    input2: {
      encoding: "jpg",
      status: 3,
        // 图片地址自行替换
      image: parse("public/upload/20221121/A717A672AB4B90AD.jpg"),
    },
  },
};

4.发送请求 


// 发送请求
request(
  {
    url: `https://api.xf-yun.com/v1/private/s67c9c78c?authorization=${authorization}&host=api.xf-yun.com&date=${date}`,
    method: "POST",
    headers: {
      "content-type": "application/json",
    },
    // http request body转JSON字符串
    body: JSON.stringify(body),
  },
  (err, res, body) => {
    if (err) {
      return console.log(err);
    }
    // body返回的是json字符串需要转为json对象
    let text = JSON.parse(body).payload.face_compare_result.text;
    let result = new Buffer.from(text, "base64").toString();
    console.log(result);
    if (result.score > 0.67) {
      console.log("是同一个人");
    } else {
      console.log("好像不是同一个人");
    }
  }
);

最后看下请求结果

text字段base64解码示例

{
	"ret" : 0,
	"score" : 0.99618607759475708
}

text字段参数说明:

参数名类型描述备注
retint内部服务返回值ret=0表示请求成功,否则请参考错误码表
scorefloat人脸相似度最小值:0 最大值:1。
建议高于0.67认为是同一个人。
建议使用仅包含一张人脸的照片进行比对,若照片中含有多张人脸,引擎会选择其中人脸置信度最高的人脸进行比较,可能会影响比对结果。

附上完整代码吧 

// 引入服务端http/https请求模块
const request = require("request");
const crypto = require("crypto");
const path = require("path");
const fs = require("fs");

// 图片转base64
function parse(file) {
  // 获取原始文件地址
  let filePath = path.resolve(file);
  // 读取文件数据
  let data = fs.readFileSync(filePath);
  // 获取图片base64编码
  data = Buffer.from(data).toString("base64");
  return data;
}

// 1)获取接口密钥APIKey 和 APISecret。
const apiKey = "xxxxxxxxxxxxxxxxxxx";
const apiSecret = "xxxxxxxxxxxxxxxxxx";
const appId = "xxxxxxx";

// 2)参数authorization base64编码前(authorization_origin)的格式如下。
// api_key="$api_key",algorithm="hmac-sha256",headers="host date request-line",signature="$signature"

// 3)signature的原始字段(signature_origin)规则如下。 host: $host\ndate: $date\n$request-line
const date = new Date().toGMTString(); // 获取GMT时间
const signature_origin = `host: api.xf-yun.com\ndate: ${date}\nPOST /v1/private/s67c9c78c HTTP/1.1`;

// 4)使用hmac-sha256算法结合apiSecret对signature_origin签名,获得签名后的摘要signature_sha。
// signature_sha=hmac-sha256(signature_origin,$apiSecret)
const hmac = crypto.createHmac("sha256", apiSecret);
hmac.update(signature_origin);
const signature_sha = hmac.digest("bytes");

// 5)使用base64编码对signature_sha进行编码获得最终的signature。
const signature = signature_sha.toString("base64");

// 6)根据以上信息拼接authorization base64编码前(authorization_origin)的字符串,示例如下。
const authorization_base64 = `api_key=${apiKey},algorithm="hmac-sha256",headers="host date request-line",signature="${signature}"`;

// 7)最后再对authorization_origin进行base64编码获得最终的authorization参数。
let authorization = new Buffer.from(authorization_base64).toString("base64");

console.log("authorization", authorization);

// 请求体body
let body = {
  header: {
    app_id: appId,
    status: 3,
  },
  parameter: {
    s67c9c78c: {
      service_kind: "face_compare",
      face_compare_result: {
        encoding: "utf8",
        compress: "raw",
        format: "json",
      },
    },
  },
  payload: {
    input1: {
      encoding: "jpg",
      status: 3,
      image: parse("public/upload/20221121/A717A672AB4B90AD.jpg"),
    },
    input2: {
      encoding: "jpg",
      status: 3,
      image: parse("public/upload/20221121/A717A672AB4B90AD.jpg"),
    },
  },
};
// 发送请求
request(
  {
    url: `https://api.xf-yun.com/v1/private/s67c9c78c?authorization=${authorization}&host=api.xf-yun.com&date=${date}`,
    method: "POST",
    headers: {
      "content-type": "application/json",
    },
    // http request body转JSON字符串
    body: JSON.stringify(body),
  },
  (err, res, body) => {
    if (err) {
      return console.log(err);
    }
    let text = JSON.parse(body).payload.face_compare_result.text;
    let result = new Buffer.from(text, "base64").toString();
    console.log(result);
    if (result.score > 0.67) {
      console.log("是同一个人");
    } else {
      console.log("好像不是同一个人");
    }
  }
);

demo示例到此结束,本文只是写了一个小demo并没有封装成人脸对比的接口,如果需要的话自行封装一下, 

转载请注明出处,谢谢

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Unity是一款跨平台的游戏引擎,它提供了强大的工具和功能,可用于开发各种类型的游戏和应用程序。在Unity中调用讯飞API可以实现语音识别、语音合成等功能。 要在Unity中调用讯飞API,首先需要在讯飞开放平台注册一个开发者账号,并创建一个应用程序。然后,从讯飞开放平台获取API的AppID和密钥。 接下来,可以在Unity中使用C#编写代码来调用讯飞API。首先,需要导入讯飞API的DLL文件,并在代码中引入相应的命名空间。然后,可以创建一个类来封装API调用的逻辑。 在类中,可以使用API提供的接口来进行语音识别和语音合成。例如,可以使用识别接口来发送语音数据并获取识别结果,或者使用合成接口将文本转换为语音。 在调用API之前,需要对语音数据进行编码和解码,以及对文本进行处理。可以使用Unity的音频编解码库来实现这些功能。 调用API后,可以根据返回的结果进行相应的处理。例如,可以将识别结果显示在游戏界面上,或者将语音合成的音频播放出来。 需要注意的是,在使用讯飞API时,需要遵守相关的法律法规和许可协议,确保数据的安全和合法性。此外,还需要关注API使用限制和配额,以免超过使用限制。 总结起来,Unity调用讯飞API可以实现语音识别、语音合成等功能。通过在Unity中编写相应的代码,导入相关的DLL文件,并遵守相关法律法规,可以实现在游戏和应用程序中实现语音交互的功能。 ### 回答2: Unity 是一款跨平台的游戏开发引擎,可以用于开发各种类型的游戏和应用程序。在 Unity 中调用讯飞 API,可以为游戏添加语音识别、语音合成和其他语音相关功能。 要在 Unity 中调用讯飞 API,首先需要拥有讯飞开放平台的账号,并获取相应的 API Key 和 Secret Key。然后,在 Unity 的项目中导入讯飞提供的 SDK,并设置相关的权限和配置。 在 Unity 中调用讯飞 API 主要有以下几个步骤: 1. 在代码中引入讯飞的命名空间和类库。 2. 初始化讯飞 SDK,设置 AppId、API Key 和 Secret Key 等相关配置。 3. 添加语音识别或语音合成的功能代码,根据需要进行文本转语音或语音转文本的操作。 4. 在游戏中添加相应的 UI 控件,例如按钮或输入框,用于触发语音识别或语音合成功能。 5. 编写相应的事件处理代码,当用户点击按钮或完成语音输入时,调用讯飞 API 进行语音识别或语音合成的操作。 6. 根据返回结果,进行相应的逻辑处理或界面展示。 通过调用讯飞 API,可以实现一些有趣和实用的功能,例如在游戏中通过语音输入控制角色或操控游戏进程,或者在应用程序中实现语音交互和提示功能等。 总而言之,Unity 调用讯飞 API 可以为游戏和应用程序添加语音相关的功能,丰富用户体验。通过合理的集成和配置,可以实现对讯飞的语音识别和语音合成等服务的调用,为用户提供更加便捷和智能的应用体验。 ### 回答3: Unity 是一款流行的游戏开发引擎,为了增加游戏的语音识别和语音合成功能,可以调用讯飞 API。 要在 Unity 中调用讯飞 API,首先需要注册讯飞开放平台并获得 API Key 和 API Secret。然后,在 Unity 项目中创建一个新的脚本,用于调用讯飞 API。 在脚本中,我们需要使用讯飞提供的 SDK,将其导入到 Unity 项目中。然后在脚本中,我们可以使用讯飞提供的 API 方法来实现语音识别和语音合成功能。 对于语音识别,我们可以通过调用讯飞 API 的识别方法,传入音频数据或音频文件,并指定识别的语种和识别类型。讯飞 API 将返回识别结果,我们可以根据需求对识别结果进行处理和使用。 对于语音合成,我们可以通过调用讯飞 API 的合成方法,传入需要合成的文字、语言和发音人等参数。讯飞 API 将返回合成的音频文件,我们可以在游戏中播放这个音频文件,实现语音合成的功能。 通过调用讯飞 API,Unity 游戏可以实现语音交互、语音指令等功能,增加游戏的趣味性和用户体验。但需要注意的是,调用讯飞 API 需要进行网络请求,因此需要保证游戏设备有网络连接,并注意隐私和用户授权等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丝网如风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值