科大语音

package samton.com.mscphone;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.support.v4.print.PrintHelper;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.google.gson.Gson;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.VoiceWakeuper;
import com.iflytek.cloud.WakeuperListener;
import com.iflytek.cloud.WakeuperResult;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;
import com.iflytek.cloud.util.ResourceUtil;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import samton.com.mscphone.bean.Dst;
import samton.com.mscphone.bean.XFBean;

/**
 * Created by admin on 2018/8/2.
 */

public class MakkActivity extends AppCompatActivity implements View.OnClickListener {
    File s1 = Environment.getExternalStorageDirectory();
    String FFFF="li.png";

    private EditText viewById;
    private SpeechRecognizer mAsr;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.isrdemo);
        into();
        init();
        rouse();

    }

    private void into() {

        // 初始化识别对象
        mAsr = SpeechRecognizer.createRecognizer(this, new InitListener() {
            @Override
            public void onInit(int i) {

            }
        });
    }

    //唤醒
    private void rouse() {
        VoiceWakeuper mIvw = VoiceWakeuper.createWakeuper(this, null);
        //594760d9 唤醒路径
        String resPath = ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets,"ivw/oo.jet");
          Toast.makeText(this,resPath,Toast.LENGTH_SHORT).show();
        // 唤醒资源路径,需下载使用对应的语音唤醒SDK。
        mIvw.setParameter( SpeechConstant.IVW_RES_PATH, resPath );

         // 唤醒类型
        mIvw.setParameter( SpeechConstant.IVW_SST, "wakeup" );

        // 唤醒门限
        String curThresh;
        mIvw.setParameter( SpeechConstant.IVW_THRESHOLD,  "1450" );

// 持续唤醒
        mIvw.setParameter( SpeechConstant.KEEP_ALIVE,  "1" );

        int ret = mIvw.startListening(new WakeuperListener() {
            @Override
            public void onBeginOfSpeech() {

            }

            @Override
            public void onResult(WakeuperResult wakeuperResult) {
                String resultString = wakeuperResult.getResultString();
                Toast.makeText(MakkActivity.this,"LLLLLLLLL"+ resultString, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onError(SpeechError speechError) {

            }

            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {

            }

            @Override
            public void onVolumeChanged(int i) {

            }
        });
    }

    private void init() {
        findViewById(R.id.isr_recognize).setOnClickListener( this);

        findViewById(R.id.isr_grammar).setOnClickListener(this);
        findViewById(R.id.isr_lexcion).setOnClickListener(this);
        viewById = (EditText) findViewById(R.id.isr_text);
        findViewById(R.id.isr_stop).setOnClickListener(this);
        findViewById(R.id.isr_cancel).setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.isr_recognize://开始识别
                  isr();
                break;
            case R.id.isr_grammar://翻译
                ToEnglish();
                break;
            case R.id.isr_lexcion:
                break;
            case R.id.isr_stop://转化语音
                String s = viewById.getText().toString();
                TextToVoice(s);
                break;
            case R.id.isr_cancel:
                mAsr.stopListening();
                break;
        }


    }

    /**
     * 吊起语音
     */
    public void isr() {
        //1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为null
        RecognizerDialog mDialog = new RecognizerDialog(this,null);
        //2.设置accent、language等参数
        mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式
        mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式
          //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
         // mDialog.setParameter("asr_sch", "1");
           //mDialog.setParameter("nlp_version", "2.0");
           //3.设置回调接口,语音识别后,得到数据,做响应的处理.
        mDialog.setListener(new RecognizerDialogListener() {
            //识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1)
            // 参数2 b:等于true时会话结束。方法才不会继续回调
            //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类)
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                if (!b) {

                    //拿到讯飞识别的结果
                    String resultString = recognizerResult.getResultString();
                    System.out.println("讯飞识别的结果 " + resultString);
                    System.out.println("b参数是什么 " + b);
                    Log.d("HHa",resultString);
                    Toast.makeText(MakkActivity.this, resultString, Toast.LENGTH_LONG).show();
                    Log.d("HHa",resultString);
                    parseData(resultString);//解析json
                }
            }
            @Override//识别失败执行 speechError:错误码
            public void onError(SpeechError speechError) {
                Log.d("HHa",speechError.getMessage());
            }
        });
      //4.显示dialog,接收语音输入
        mDialog.show();

    }

    /**
     * 语音解析
     * @param resultString
     * @return
     */
    private String parseData(String resultString) {
        //创建gson对象,记得要关联一下gson.jar包方可以使用.
        Gson gson = new Gson();
        //参数 1.String类型的json数据 参数 2.存放json数据对应的bean类
        XFBean xfBean = gson.fromJson(resultString, XFBean.class);
        //创建一个集合,用来存放bean类里的对象.
        List<XFBean.WsBean> ws = xfBean.getWs();
        //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高
        StringBuilder stringBuilder = new StringBuilder();
        //使用高级for循环,取出特定属性的特有数据,装入StringBuilder中
        for ( XFBean.WsBean w:ws) {
            for (XFBean.WsBean.CwBean cwBean : w.getCw()) {
                String w1 = cwBean.getW();
                stringBuilder.append(w1);
            }
           // String text = w.getCw().get(0).getW();
        }
        viewById.setText(stringBuilder.toString());
        ff(stringBuilder.toString());
        //把容器内的数据转为字符串返回出去.
        return stringBuilder.toString();
    }

    /**
     * 字转换成语音
     * @param text
     */
    public void TextToVoice(String text){
        //1.创建SpeechSynthesizer对象, 第一个参数上下文,第二个参数:本地合成时传InitListener
        SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);
        //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端,这些功能用到讯飞服务器,所以要有网络.
        //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
        //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
        //如果不需要保存合成音频,注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
        //3.开始合成,第一个参数就是转成声音的文字,可以自定义  第二个参数是合成监听器对象.我们不需要对声音有什么特殊处理,就传null
        mTts.startSpeaking(text,null);
    }

    /**
     * 判断
     * @param result
     */
    public void  ff(String result){


//回答对象,在没有匹配到用户说的话,默认输出语句
        String answer="不好意思,没有听清楚";
//这里的result参数,就是我们通过讯飞听写里最终拿到用户说话的结果
        if(result.contains("你好")){
            answer="你好,我是智能语音助手";
        }else if(result.contains("谁是世界上最帅的人")){
            answer="哈哈,当然是您";
        }else if (result.contains("中午吃什么")) {
            String[] anwserList = new String[]{"火锅", "烧烤", "烤鱼", "麻辣烫"};
            int random = (int) (Math.random() * anwserList.length);
            String anwser = anwserList[random];
        } else if (result.contains("打印机")){
            doPhotoPrint();
            answer="以为您,打开打印机";
        }else if (result.contains("通讯录")){
            intentContacts();
        }else if(result.contains("名字")) {
            answer="我叫小明,很高兴认识您";
        }else if (result.contains("你有哪些功能")){
            answer="初步完成,功能不完善";
        }else if (result.contains("你能干什么")){
            answer="现在待定,正在开发中";
        }else if (result.contains("做个自我介绍")){
            answer="您好,我是机器人小明,我貌赛潘安,义超关羽,智胜孔明,上知天文,下晓地理,出口成章,提笔成文,懂阴阳,测八卦,知奇门,晓遁甲的,大豪杰,大英雄,大剑客,大宗师,人称山崩地裂水倒流,赶浪无丝鬼见愁,前无古人,后无来者的,天下第一——“帅”呀";
        }else if(result.contains("开相机 ")){
             //摄像投
            video();

        }

      //调用语音助手说话的方法,把回答对象传进去.
        TextToVoice(answer);
    }
    //摄像头
    private void video() {
        Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(s1, FFFF)));
        startActivityForResult(intentFromCapture, 11);


    }

    /***
     * 通讯录的方法
     */
    private void intentContacts() {
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        Intent intent = new Intent(Intent.ACTION_PICK,uri);
        startActivityForResult(intent,0);
    }

    /**
     * 翻译
     * @param dd
     */
    public void ToEnglish(){
        mAsr = SpeechRecognizer.createRecognizer(this, null);
        //SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);
        mAsr.setParameter( SpeechConstant.ASR_SCH, "1" );//
        mAsr.setParameter( SpeechConstant.ADD_CAP, "translate" );
        mAsr.setParameter( SpeechConstant.TRS_SRC, "its" );
        mAsr.setParameter( SpeechConstant.ORI_LANG, "cn" );
        mAsr.setParameter( SpeechConstant.TRANS_LANG, "en" );
        mAsr.setParameter( SpeechConstant.AUDIO_FORMAT_AUE,"speex-wb");
        //synthesizeToUri(java.lang.String text, java.lang.String uri, SynthesizerListener listener)
        int i = mAsr.startListening(new RecognizerListener() {
            @Override
            public void onVolumeChanged(int i, byte[] bytes) {

            }

            @Override
            public void onBeginOfSpeech() {

            }

            @Override
            public void onEndOfSpeech() {

            }

            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                if (!b) {
                    String resultString = recognizerResult.getResultString();
                    Log.d("HHa","onResult="+resultString);
                    Toast.makeText(MakkActivity.this, resultString, Toast.LENGTH_LONG).show();
                    parseData2(resultString);
                }
            }

            @Override
            public void onError(SpeechError speechError) {
                Toast.makeText(MakkActivity.this, "失败:" + speechError.getMessage(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {

            }
        });
        Toast.makeText(MakkActivity.this, "码:" + i, Toast.LENGTH_LONG).show();
        if (i != ErrorCode.SUCCESS) {
           // showTip("识别失败,错误码: " + ret);
            Toast.makeText(MakkActivity.this, "识别失败,错误码:" + i, Toast.LENGTH_LONG).show();

        }
    }

    /**
     * 翻译解析
     * @param resultString
     * @return
     */
    private String parseData2(String resultString) {
        //创建gson对象,记得要关联一下gson.jar包方可以使用.
        Gson gson = new Gson();
        //参数 1.String类型的json数据 参数 2.存放json数据对应的bean类
        Dst xfBean = gson.fromJson(resultString, Dst.class);
        //创建一个集合,用来存放bean类里的对象.
        String ws = xfBean.getTrans_result().getDst();
        //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高
        StringBuilder stringBuilder = new StringBuilder();
        //使用高级for循环,取出特定属性的特有数据,装入StringBuilder中
            stringBuilder.append(ws);
            viewById.setText(ws);
            ff(ws);
        //把容器内的数据转为字符串返回出去.
        return stringBuilder.toString();
    }











    /**
     * 调取打印机
     */
    private void doPhotoPrint() {
        PrintHelper photoPrinter = new PrintHelper(this);
        photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);//设置填充的类型,填充的类型指的是在A4纸上打印时的填充类型,两种模式
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
        //jpgTestPrint
        photoPrinter.printBitmap("jpgTestPrint", bitmap);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(this,"ggggggg"+resultCode,Toast.LENGTH_SHORT).show();
         if (requestCode==0&&resultCode==Activity.RESULT_OK){
             Toast.makeText(this,"ggggggg",Toast.LENGTH_SHORT).show();
             Uri data1 = data.getData();
             String[] phoneContacts = getPhoneContacts(data1);
             List<String>  userName=new ArrayList<>();
             List<String>  userMobile=new ArrayList<>();
             for (int i = 0; i < phoneContacts.length; i++) {
                 if (i%2==1){
                     userName.add(phoneContacts[i]);
                 }else {
                     userMobile.add(phoneContacts[i]);
                 }
             }
             for (int i = 0; i < userName.size(); i++) {
                 Toast.makeText(this,"姓名:"+userName+"手机号:"+userMobile,Toast.LENGTH_SHORT).show();
             }

         }

    }

    /***
     * 处理通讯录返回的结果
     * @param uri
     * @return
     */
    private String[] getPhoneContacts(Uri uri){
        String[] contact=new String[2];
        //得到ContentResolver对象
        ContentResolver cr = getContentResolver();
        //取得电话本中开始一项的光标
        Cursor cursor=cr.query(uri,null,null,null,null);
        if(cursor!=null){
            cursor.moveToFirst();
            //取得联系人姓名
            int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            contact[0]=cursor.getString(nameFieldColumnIndex);
            //取得电话号码
            String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null);
            if(phone != null){
                phone.moveToFirst();
                contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            }
            phone.close();
            cursor.close();
        }
        else{
            return null;
        }
        return contact;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值