2017-12-01 17:00:49 zhenghongzhi6 阅读数 7849

本文首发于“洪流学堂”公众号。
洪流学堂,让你快人几步

源码地址

https://github.com/zhenghongzhi/WitBaiduAip

功能概述

1 语音识别

  1. 从麦克风录制音频
  2. AudioClip的音频数据转换为百度语音识别的PCM16格式
  3. 百度语音识别Restful接口的封装以及一个测试场景

2 语音合成

  1. 百度语音合成Restful接口的封装以及一个测试场景
  2. mp3格式运行时转为AudioClip进行播放

为什么不使用百度的C# SDK
百度的C# SDK使用了一些Unity不支持的特性,直接导入unity不能用
而且百度C# SDK只是封装了Restful的接口,功能上并没有增多
自己编写更简洁

更新说明

2018-08-22更新

根据百度API的更新,语音合成性能优化,直接使用原生格式,移除第三方插件

2018-03-28更新

加入平台判断,更好的支持android和ios

2018-01-11更新

在工程中加入了语音合成

2018-01-02更新

应广大小伙伴的要求,对工程进行了重构,放出github源码
https://github.com/zhenghongzhi/WitBaiduAip

2017-12-23更新

教程首发


洪流学堂,让你快人几步
欢迎关注“洪流学堂”微信公众号

2017-10-16 16:00:20 dark00800 阅读数 2834

上一篇文章介绍了在Unity3d中使用百度AI人脸识别功能,本文将用一个描绘人脸特征点的程序来讲解对SDK的调用。

首先我们需要搭建一个简单的场景:一个开始测试的按钮,一张供测试和绘制特征点的图片,和显示debug信息的文字框:
场景
列表

然后新建一个叫FaceDetector的脚本,定义变量:

public Text debugInfo;                            // 显示debug信息
public RawImage portrait;                         // 显示图片
public Texture2D texture;                         // 用以描绘特征点的图片

private Face client;                              // 用来调用百度AI接口
private byte[] image;                             // 检测的图像数据
private Dictionary<string, object> options;       // 返回的数据
private JObject result;                           // 接收返回的结果

在Awake方法中初始化数据:

private void Awake()
{
    System.Net.ServicePointManager.ServerCertificateValidationCallback += 
            delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                    System.Security.Cryptography.X509Certificates.X509Chain chain,
                    System.Net.Security.SslPolicyErrors sslPolicyErrors)
                    {
                        return true;           // always accept
                    };

    client = new Face("", "");                 // 此处填写自己申请的key
    var path = Application.dataPath + "/BaiduAI/1.jpg";
    image = File.ReadAllBytes(path);
    options = new Dictionary<string, object>()
    {
        {"face_fields", "beauty,age,expression,gender,landmark" }
    };
}

然后定义一个DetectAndDraw方法,调用百度AI接口并且根据返回的landmark描绘人脸特征点:

public void DetectAndDraw()
{
    result = client.FaceDetect(image, options);                   // 调用API接口
    debugInfo.text = result.ToString();                           // 显示debug信息

    // 复制原图信息
    var width = texture.width;
    var height = texture.height;
    var mask = new Texture2D(width, height);
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
            mask.SetPixel(i, j, texture.GetPixel(i, j));
    }

    // 根据返回的landmark描绘特征点
    var r = result["result"];
    foreach(var value in r)
    {
        var landmarks = value["landmark72"];
        foreach(var lm in landmarks)
        {
            var x = int.Parse(lm["x"].ToString());
            var y = height - int.Parse(lm["y"].ToString());
            // 绘制点为3个像素点单位的正方形
            // 这里其实应该保证绘制的像素点位置在我们检测图片的像素点范围内
            for(int i = x - 1; i <= x + 1; i++)
            {
                for (int j = y - 1; j <= y + 1; j++)
                {
                    mask.SetPixel(i, j, Color.red);
                }
            }
        }
    }
    // 显示描绘特征点之后的图像
    mask.Apply();
    portrait.texture = mask;
}

给Button的OnClick事件添加DetectAndDraw方法,运行并点击Button,就能绘制出人脸特征点了。
运行结果

注意如果要替换检测的图片,需要点击RawImage的Set Native Size确保RawImage的大小与检测图片大小一致,当然也可以在代码中根据两张图的比例来计算确保特征点对应。这里只介绍最简单的方法。

运行程序前请先打开FaceDetector.cs脚本,在Awake方法中的client = new Face(“”, “”)处(line 33)添加自己的key。

工程版本Unity2017.1.0f3。
项目地址:http://pan.baidu.com/s/1kVDtgLx
提取密码:1j5j

By:蒋志杰

2018-10-19 16:07:49 GottaYiWanLiu 阅读数 3188

本文将讲到,如何利用百度ai的人体分析sdk在unity中实现摄像头实时画面的手势识别

工程链接在文末

 

(本人使用的是unity2018,unity2017以上都可以,不然.NET版本不支持)

1.准备工作:首先在百度AI的官网,下载人体分析C# SDK

 

 

 

然后登陆控制台,新建一个人体分析的应用

然后你会获取到该应用的API_KEY和SECRET_KEY,后续开发需要使用

 

 

2.准备工作做完后,新建一个unity工程,在Asset下新建一个文件夹取名Plugins,将第一步下载的SDK中两个DLL文件复制进来

然后就可以编程了

 

 

 

代码很简单,注释也写的很清楚,我只讲下思路:

其实百度AI的SDK是只单纯的识别图片,而我们要做的识别摄像头实时画面中的手势,其实方法很简单

此时我们只需在固定时间截图摄像头画面就可以了,本文设定每两秒截一次图,然后调用SDK识别此图中的手势,就能实现我们所需要的实时画面中的手势

 

代码如下:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Baidu.Aip.BodyAnalysis;
using System.IO;
using UnityEngine.UI;

public class FaceDetect : MonoBehaviour
{
    public string app_id;
    public string api_key;
    public string secret_key;

    Body client;

    private string deviceName;
    private WebCamTexture webTex;

    //百度AI返回的结果数据
    public Text resultMsg;
    //提取其中的手势名称
    public Text detectedGestureMsg;



    void Awake()
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
               {
                   return true; // **** Always accept
               };
    }




    // Use this for initialization
    void Start()
    {
        api_key = "你自己的API_KEY";
        secret_key = "你自己的SECRET_KEY";
        StartCoroutine(CallCamera());
        client = new Body(api_key, secret_key);
        client.Timeout = 60000;  // 修改超时时间
    }

    // Update is called once per frame
    void Update()
    {
        CaptureScreen();
    }

    IEnumerator CallCamera()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            deviceName = devices[0].name;
            //设置摄像机摄像的区域    
            webTex = new WebCamTexture(deviceName, 1024, 768, 20);
            webTex.Play();//开始摄像    
            transform.GetComponent<RawImage>().texture = webTex;
        }
    }


    public float timer = 0;
    //截屏
    void CaptureScreen()
    {
        timer += Time.deltaTime;
        //每隔两秒检测一次
        if (timer > 2)
        {
            //删除上一次检测的图片
            File.Delete(Application.streamingAssetsPath + "/capture.jpg");
            CapturePhoto();
            timer = 0;
        }
    }
    public int width;
    public int height;
    //截图摄像头
    public Camera cameras;
    public string fileName;

    public void CapturePhoto()
    {
        Texture2D screenShot;
        RenderTexture rt = new RenderTexture(width, height, 1);
        cameras.targetTexture = rt;
        cameras.Render();
        RenderTexture.active = rt;
        screenShot = new Texture2D(width, height, TextureFormat.RGB24, false);
        screenShot.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        screenShot.Apply();

        //运行此行代码前,先手动在Asset路径下新建一个StreamingAsset文件夹
        fileName = Application.streamingAssetsPath + "/capture.jpg";
        // byte[] bytes = screenShot.EncodeToJPG();
      
        ScaleTextureCutOut(screenShot, 0, 0, 1024, 768);
        Debug.Log(string.Format("截屏了一张照片: {0}", fileName));
   
    }


    //切图

    byte[] ScaleTextureCutOut(Texture2D originalTexture, int pos_x, int pos_y, float originalWidth, float originalHeight)
    {
        Color[] pixels = new Color[(int)(originalWidth * originalHeight)];
        //要返回的新图
        Texture2D newTexture = new Texture2D(Mathf.CeilToInt(originalWidth), Mathf.CeilToInt(originalHeight));
        //批量获取点像素
        pixels = originalTexture.GetPixels(pos_x, pos_y, (int)originalWidth, (int)originalHeight);
        newTexture.SetPixels(pixels);
        newTexture.anisoLevel = 2;
        newTexture.Apply();
        //这一步把裁剪的新图片存下来
        byte[] jpgData = newTexture.EncodeToJPG();
        System.IO.File.WriteAllBytes(fileName, jpgData);
        GestureDemo(fileName);
        return jpgData;
    }



    public void GestureDemo(string filesPath)
    {
        var image = File.ReadAllBytes(filesPath);
        try
        {
            var result = client.Gesture(image);
            resultMsg.text = result.ToString();
            string[] msgArr = resultMsg.text.Split(',');
            //单独提取classname
            for (int i = 0; i < msgArr.Length; i++)
            {
                if (msgArr[i].Contains("classname"))
                {
                    string[] strArr = msgArr[i].Split(':');
                    detectedGestureMsg.text = strArr[1];
                    break;
                }
            }
        }
        catch (System.Exception)
        {
            throw;
        }
        

    }
}

 

工程结构如下:

 

 

运行前记得填写自己的API_KEY和SECRET_KEY

 

 

工程链接:

链接:https://pan.baidu.com/s/1CbGjzRHHVnt5UZ2rrGdCdQ 
提取码:nu3y

2015-07-18 13:44:20 iteye_13125 阅读数 1458
[size=medium]分享一个unity3d的网盘地址,各个版本挺全的。

unity3d官网的下载速度太慢,打算在这里把百度网盘的unity3d下载地址列一下,不断更新

unity3d 完整版本汇总下载:[url]http://pan.baidu.com/s/1dimzs[/url]
[/size]
2017-10-10 13:04:27 dark00800 阅读数 5294

百度AI开放平台是百度推出的一个人工智能服务平台,该平台提供了很多当下热门技术的解决方案,如人脸识别,语音识别,语音智能等。其中人脸识别的SDK支持很多语言,包括Java,PHP,Python,C#,Node.js,Android和iOS等,使用C#进行脚本语言开发的Unity3d自然也可以很方便的使用这些SKD。

1、下载人脸识别SDK

首先我们需要下载最新版的SDK,打开人脸识别SDK下载页面,选择C# SDK下载:
SKD下载

下载解压后得到一个叫aip-csharp-sdk-3.0.0的文件夹,其中AipSdk.dll提供了我们进行人脸识别开发需要的API,AipSdk.XML是对DLL的注释。thirdparty中包含了sdk的第三方依赖,Demo中是一些使用示例,可以进行参考。
文件目录

2、导入SDK

由于SDK已经被打包成DLL文件,所以我们导入使用起来也十分方便,只需将解压后的文件夹直接导入到工程即可。当然为了方便管理我们可以将SDK导入到Plugins文件夹中,需要注意的是一定要讲第三方依赖一起导入不然会报错。
Plugins目录

导入后可能会有如下错误:
.Net报错
这是由于我们在Player设置中选择的Api Compatibility Level是.Net 2.0 Subset,即.Net 2.0的子集,这里需要改成.Net 2.0。选择Edit->Project Settings->Player,在Other Settings中将Api Compatibility Level更改为.Net 2.0:
.Net2.0

3、创建应用

下面将以人脸检测为示例简单介绍一下SDK的使用。
使用SDK前我们需要先注册一个百度账号,然后登陆百度AI开放平台,创建一个人脸识别应用。
选择控制台并登录:
选择控制台

在控制台已开通服务中选择人脸识别:
人脸识别

然后点击创建应用,输入应用名,应用类型,接口选择(默认创建人脸识别的应用),和应用描述,点击立即创建,创建完毕后点击查看应用详情查看API Key和Secret Key(点击显示查看)
创建应用

完成创建

应用详情

之后可以选择监控报表来查看应用接口调用情况:
监控报表

4、接口调用

百度AI开放平台提供了人脸识别C#版的详细技术文档,下面以实例来进行简单的调用说明。
使用人脸检测功能我们添加Baidu.Aip.Face命名空间,定义一个Face变量用于调用API:

using Baidu.Aip.Face;

private Face client;

client = new Face("API Key", "Secret Key")

实例化Face变量时需要填写我们创建的应用的API Key和Secret Key,可以在应用详情中查看。
进行人脸检测时调用FaceDetect方法:

public JObject FaceDetect(byte[] image, Dictionary<string, object> options = null);

该方法需要传入两个参数,被检测的图片和返回的参数配置,其中可选参数options可以使用默认值null,这时只会返回人脸的位置等基本信息。返回值是一个JObject类型,此类型是第三方依赖中提供的一个json类型。详细调用方法为:

byte[] image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
Dictionary<string, object> options = new Dictionary<string, object>()
{
    {"face_fields", "beauty,age,expression,gender" }
};
client.FaceDetect(image, options);

options中的face_fields为请求的参数,类型是string,多个项以逗号分开,不能加在逗号和后一项之间加空格,否则无效。详细参数如下表:

参数 类型 描述
face_fields string 包括age、beauty、expression、faceshape、gender、gla-sses、landmark、race、qualities信息,逗号分隔,默认只返回人脸框、概率和旋转角度。
max_face_num number 最多处理人脸数目,默认值1
image byte[] 图像数据

方法返回的JObject包含一个或多个人脸的信息,也可以如下调用:

client.FaceDetect(image);

此时将只会返回最基本的信息,包括日志id,人脸数目,人脸位置,人脸置信度,竖直方向转角,三维左右旋转角,三维俯仰角,平面旋转角。
所有返回值见下表:

参数 类型 是否一定输出 描述
log_id number 日志id
result_num number 人脸数目
result array 人脸属性对象的集合
+age number 年龄。face_fields包含age时返回
+beauty number 美丑打分,范围0-1,越大表示越美。face_fields包含beauty时返回
+location array 人脸在图片中的位置
++left number 人脸区域离左边界的距离
++top number 人脸区域离上边界的距离
++width number 人脸区域的宽度
++height number 人脸区域的高度
+face_probability number 人脸置信度,范围0-1
+rotation_angle number 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
+yaw number
+pitch number 三维旋转之俯仰角度[-90(上), 90(下)]
+roll number 平面内旋转角[-180(逆时针), 180(顺时针)]
+expression number 表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回
+expression_probability number 表情置信度,范围0~1。face_fields包含expression时返回
+faceshape array 脸型置信度。face_fields包含faceshape时返回
++type string 脸型:square/triangle/oval/heart/round
++probability number 置信度:0~1
+gender string male、female。face_fields包含gender时返回
+gender_probability number 性别置信度,范围0~1。face_fields包含gender时返回
+glasses number 是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回
+glasses_probability number 眼镜置信度,范围0~1。face_fields包含glasses时返回
+landmark array 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回
++x number x坐标
++y number y坐标
+landmark72 array 72个特征点位置,示例图 。face_fields包含landmark时返回
++x number x坐标
++y number y坐标
+race string yellow、white、black、arabs。face_fields包含race时返回
+race_probability number 人种置信度,范围0~1。face_fields包含race时返回
+qualities array 人脸质量信息。face_fields包含qualities时返回
++occlusion array 人脸各部分遮挡的概率, [0, 1] (待上线)
+++left_eye number 左眼
+++right_eye number 右眼
+++nose number 鼻子
+++mouth number
+++left_cheek number 左脸颊
+++right_cheek number 右脸颊
+++chin number 下巴
++type array 真实人脸/卡通人脸置信度
+++human number 真实人脸置信度,[0, 1]
+++cartoon number 卡通人脸置信度,[0, 1]

运行时可能会报错:
运行报错
这是网页端身份安全验证失败导致的,我们需要在程序运行时手动添加安全证书,在Awake方法中加入:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
                {
                   return true; // **** Always accept
                };

我们可以用Text控件来查看具体的返回值:
TestFace.cs:

using System.Collections.Generic;
using System.IO;
using Baidu.Aip.Face;
using UnityEngine;
using UnityEngine.UI;

public class TestFace : MonoBehaviour
{

    public Text debugInfo;

    private Face client;
    private byte[] image;
    private Dictionary<string, object> options;

    private void Awake()
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback +=
               delegate (object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
                           System.Security.Cryptography.X509Certificates.X509Chain chain,
                           System.Net.Security.SslPolicyErrors sslPolicyErrors)
               {
                   return true; // **** Always accept
            };

        client = new Face("API Key", "Secret Key");
        image = File.ReadAllBytes(Application.streamingAssetsPath + "/1.jpg");
        options = new Dictionary<string, object>()
        {
            {"face_fields", "beauty,age,expression,gender" }
        };
    }

    public void StartDetect()
    {
        var result = client.FaceDetect(image);//, options);
        debugInfo.text = result.ToString();
    }
}

运行结果:
运行结果

By:蒋志杰

Unity 3D百度地图SDK接入经验

博文 来自: virus2014
没有更多推荐了,返回首页