讯飞摩飞语音设备开发实战java版

栏目: IT技术 · 发布时间: 4年前

内容简介:目的语音控制灯等硬件设备,比如开灯,关灯流程

目的

语音控制灯等硬件设备,比如开灯,关灯

流程

语音 - 解析 -讯飞服务器 - 我们的后台 -控制硬件

研究

讯飞平台创建app 上面有appid 和key要推送到摩飞设备

http://aiui.xfyun.cn/apps/

电脑连接摩飞

adb devices 可以看到连接的摩飞设备

不行就是试一下adb kill-server

和 adb reconnect

cd 进入/Users/zhanglilong/Downloads/Morfei评估板开发包/Morfei 目录/tools

修改aiui.cfg文件中appid、key和scene的值,并保存

然后执行推送

adb push aiui.cfg /sdcard/AIUI/cfg/aiui.cfg

然后adb reboot 重启设备

通过adb pull /sdcard/AIUI/cfg/aiui.cfg

查看文件是否修改成功

开始设置讯飞服务器调用的接口,自己定义的接口,每次语音说开灯,讯飞就调用你自己开发的接口,执行真实的开灯的操作

http://111.222.0.111:9000/api/mofei/test2

比如这个链接就是我们处理语音的接口,在 http://aiui.xfyun.cn/apps/

这里找到后处理链接处填写我们的接口。贴一下这里代码吧

路由

GET /api/mofei/test2 thirdparty.MoFei.test

POST /api/mofei/test2 thirdparty.MoFei.xfjson

还有一个语音自定义技能需要添加

语料处可以这么加

{sth}[{dengName}][{jobName}][{sth}]

槽位标示jobName 对应实体@jobnames 实体里面我就设置了一个词条 “灯”

槽位标示 sth 代表通配实体,这样你说话加一点前缀或者后缀都没事了 @IFLYTEK.Wildcard [1,10]

槽位标示dengName 对应实体@dengName 实体里面我设置v6 v3 L这是灯的名称

package controllers.thirdparty;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.io.IOUtils;

import com.jd.open.api.sdk.internal.util.codec.Base64;

import jobs.LightJob;
import jobs.NewTask;
import jobs.SocketJob;
import models.Ams_archives;
import models.Device_manage;
import models.Front_User;
import models.TaskInfo;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import utils.mofei.AESUtils;
import utils.mofei.Sha1EncodeUtils;

public class MoFei extends Application {
	
	//这个我已瞎写的,请自己替换
	private static final String token = "b54db7ffffff83b7";
	private static final String aeskey = "24235c1fffff9cc5";
	
	public static void xfjson(String encrypttype) {
		System.out.println("encrypttype:"+encrypttype);
		// NOTE !!!!
		// AES decrypt and encrypt may mot be used in your server
		// you may debug it again and again to make it.
		// welcome to email me: lmliu@iflytek.com if something wrong with you.
		if (encrypttype.equals("aes")) {
			System.out.println("AES Decrypt Mode.");
			String jsonstr;
			try {
				jsonstr = IOUtils.toString(request.body);
				System.out.println(jsonstr);
		  		JSONObject obj = JSONObject.fromObject(jsonstr);
// String alarm_type_name = obj.getString("alarm_type_name");//报警类型
				
				renderJSON(AESUtils.encrypt(aeskey, aeskey, jsonstr.toString()));
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
// response.setContentType("application/json;charset=utf-8");
// response.getWriter().append(AESUtils.encrypt(aeskey, aeskey, customData.toString()));
		} else {
			//aiui.log(Level.INFO, "Normal Mode.");
			System.out.println("Normal Mode.");
			String jsonstr="";
			try {
				jsonstr = IOUtils.toString(request.body);
				System.out.println(jsonstr);
		  		JSONObject obj = JSONObject.fromObject(jsonstr);
				
				
				JSONObject msgJson = obj.getJSONObject("Msg");
				String content = msgJson.getString("Content");
				content = new String(Base64.decodeBase64(content.getBytes()));
				System.out.println(content);
				
				JSONObject obj1 = JSONObject.fromObject(content);
				System.out.println(obj1);
				JSONObject obj2 = obj1.getJSONObject("intent");
				if(obj2.containsKey("semantic")){ 
					JSONArray semantic = obj2.getJSONArray("semantic");
					JSONObject slots = semantic.getJSONObject(0);
					System.out.println(slots.getString("intent"));
					String action =slots.getString("intent");
					if ("deng".equals(action)) { //开v3 v6 L 灯
						String dengName="";
						JSONArray array = slots.getJSONArray("slots");
						 for(int i=0;i<array.size();i++){
							  JSONObject job = array.getJSONObject(i);   
							  if ("dengName".equals(job.getString("name"))) {
								  dengName = job.getString("normValue");
							  }
						  }
						if ("V3".equals(dengName)) {
							new LightJob("open", "192.168.1.154").now();
						}else if ("V6".equals(dengName)) {
							new LightJob("open", "192.168.1.156").now();
						}else if ("L".equals(dengName)) {
							new LightJob("open", "192.168.1.153").now();
						}else {
							try {
								new LightJob("open", "192.168.1.153").now();
								Thread.sleep(300);
								new LightJob("open", "192.168.1.154").now();
								Thread.sleep(300);
								new LightJob("open", "192.168.1.156").now();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}else if ("closed".equals(action)) { //关v3 v6 L 灯
						String dengName="";
						JSONArray array = slots.getJSONArray("slots");
						 for(int i=0;i<array.size();i++){
							  JSONObject job = array.getJSONObject(i);   
							  if ("dengName".equals(job.getString("name"))) {
								  dengName = job.getString("normValue");
							  }
						  }
						if ("V3".equals(dengName)) {
							new LightJob("close", "192.168.1.154").now();
						}else if ("V6".equals(dengName)) {
							new LightJob("close", "192.168.1.156").now();
						}else if ("L".equals(dengName)) {
							new LightJob("close", "192.168.1.153").now();
						}else {
							try {
								new LightJob("close", "192.168.1.153").now();
								Thread.sleep(300);
								new LightJob("close", "192.168.1.154").now();
								Thread.sleep(300);
								new LightJob("close", "192.168.1.156").now();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
					//JSONArray array = slots.getJSONArray("slots");
					//System.out.println("slots:normValue"+array.getJSONObject(0).getString("normValue"));
				}
				renderJSON(jsonstr.toString());
			} catch (IOException e) {
				e.printStackTrace();
				renderJSON(jsonstr.toString());
			}
		}
	}
	
	
	public static void test(String signature,String timestamp,String rand) {
		if (signature == null || timestamp == null || rand == null) {
			return;
		}
		if (signature.isEmpty() || rand.isEmpty() || timestamp.isEmpty()) {
			return;
		}

		List<String> list = new ArrayList<String>();

		list.add(token);
		list.add(timestamp);
		list.add(rand);
		Collections.sort(list);

		String localSig = "";
		for (int i = 0; i < list.size(); i++) {
			localSig += list.get(i);
		}

		String sigtureSha1 = Sha1EncodeUtils.encode(localSig);
		if (sigtureSha1.equals(signature)) {
			//renderJSON(Sha1EncodeUtils.encode(token));
			renderHtml(Sha1EncodeUtils.encode(token));
		} else {
// renderJSON("check token failed" + sigtureSha1);
			renderHtml("check token failed" + sigtureSha1);
		}
	}

}
package utils.mofei;


import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.security.Security;


public class AESUtils {
    // u8 charset
    protected static final Charset CHARSET_U8     = Charset.forName("utf-8");
    // u8 string
    protected static final String  CHARSET_U8_STR = "utf-8";

    /**
* AES加密
*
* @param serectKey 秘钥
* @param ivKey 向量偏移量
* @param content 要加密的文本
* @return
*/
    public static String encrypt ( String serectKey, String ivKey, String content) {
        String encryptMode = "AES/CBC/PKCS7Padding";
        String encyptedContent = null;
        try {
            String encyptType = encryptMode;
            SecretKeySpec keyspec = new SecretKeySpec(serectKey.getBytes(CHARSET_U8), "AES");
            Cipher cipher = Cipher.getInstance(encyptType,"BC");
            IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes(CHARSET_U8));
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, iv);
            byte[] byte_encode = content.getBytes(CHARSET_U8_STR);
            byte_encode = cipher.doFinal(byte_encode);
            encyptedContent = new String(byte_encode);
        } catch (Exception e) {
           
        }
        return encyptedContent;
    }

    public static String decrypt(String secretKey, String ivKey, byte[] content){
        String encryptMode = "AES/CBC/PKCS7Padding";
        
        byte[] secrecKeyByte = secretKey.getBytes(CHARSET_U8);
       
        String decryptContent = null;
        try {
            Security.addProvider(new BouncyCastleProvider());
            SecretKeySpec keyspec = new SecretKeySpec(secrecKeyByte, "AES");
            Cipher cipher = Cipher.getInstance(encryptMode, "BC");
            
            IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes(CHARSET_U8));
            cipher.init(Cipher.DECRYPT_MODE, keyspec, iv);
            byte[] byte_content = cipher.doFinal(content);

            decryptContent = new String(byte_content, CHARSET_U8_STR);
        } catch (Exception e) {
        	e.printStackTrace();
        }
        return decryptContent;
    }
}
package utils.mofei;

import java.security.MessageDigest;

public class Sha1EncodeUtils {

	private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


	private static String getFormattedText(byte[] bytes) {
		int len = bytes.length;
		StringBuilder buf = new StringBuilder(len * 2);
		// 把密文转换成十六进制的字符串形式
		for (int j = 0; j < len; j++) {
			buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
			buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
		}
		return buf.toString();
	}

	public static String encode(String str) {
		if (str == null) {
			return null;
		}
		try {
			MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
			messageDigest.update(str.getBytes());
			return getFormattedText(messageDigest.digest());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
}

}

以上所述就是小编给大家介绍的《讯飞摩飞语音设备开发实战java版》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Foundations of PEAR

Foundations of PEAR

Good, Nathan A./ Kent, Allan / Springer-Verlag New York Inc / 2006-11 / $ 50.84

PEAR, the PHP Extension and Application Repository, is a bountiful resource for any PHP developer. Within its confines lie the tools that you need to do your job more quickly and efficiently. You need......一起来看看 《Foundations of PEAR》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换