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;
}
}
科大语音
最新推荐文章于 2020-11-25 16:37:32 发布
本文详细介绍了一款基于科大讯飞语音识别技术的智能语音助手应用程序的开发过程。包括应用程序的基本结构、语音唤醒、语音识别、语音合成等功能的实现方法,并展示了如何处理语音识别结果进行语义理解和响应。
部署运行你感兴趣的模型镜像
您可能感兴趣的与本文相关的镜像
HunyuanVideo-Foley
语音合成
HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效
6903

被折叠的 条评论
为什么被折叠?



