2023年7月7日发(作者:)
Android科⼤讯飞在线和离线语⾳听写效果图:参考资料项⽬⾥要⽤语⾳听写,想到了科⼤讯飞,参考上⾯的资料完成了最简单的在线有UI的语⾳识别,后⾯想要改成离线也可以使⽤。参考下⾯的⽂章下载好语记和离线资源之后,想要改成有UI的RecognizerDialog离线语⾳听写,但是没成功,试了⼀下没有UI的SpeechRecognizer,发现可以,只需在设置参数的时候加上⼀句ameter(_TYPE,_LOCAL);//调⽤语记接⼝就可以使⽤了。可能是RecognizerDialog带有UI界⾯,已经默认写成在线的了吧
下⾯只贴出主活动的代码,其他参考上⾯的资料package ecognition;import ;import patActivity;import ;import ;import ;import ;import ode;import stener;import izerListener;import izerResult;import Constant;import Error;import Recognizer;import Utility;import izerDialog;import izerDialogListener;public class MainActivity extends AppCompatActivity { private Button btn_voiceRec,btn_voiceRecOffline; private RecognizerDialog iatDialog=null; private SpeechRecognizer recognizer=null; @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); Utility(this, "appid=xxx");//替换为实际的appid btn_voiceRec = (Button) findViewById(_voiceRec); btn_lickListener(new kListener() { @Override public void onClick(View view) { if (iatDialog!=null){ (); y(); } startDialogOnline(); } }); btn_voiceRecOffline= (Button) findViewById(_voiceRecOffline); btn_lickListener(new kListener() { @Override public void onClick(View view) {// if (recognizer!=null){// ();// y();// } startNoDialogOffline(); } }); }); } /** * 初始化监听器。 */ private InitListener mInitListener = new InitListener() { @Override public void onInit(int code) { Log.d("tag", "SpeechRecognizer init() code = " + code); if (code != S) { Log.d("tag", "初始化失败,错误码:" + code); } } }; public void startDialogOnline() { //1.创建SpeechRecognizer对象,第⼆个参数:本地听写时传InitListener iatDialog = new RecognizerDialog(this, mInitListener); //2.设置听写参数 ameter(GE, "zh_cn"); ameter(, "mandarin "); //3.设置回调接⼝ tener(new RecognizerDialogListener() { @Override public void onResult(RecognizerResult recognizerResult, boolean b) { if (!b) { String json = ultString(); String str = atResult(json); xt(, str, _SHORT).show(); } } @Override public void onError(SpeechError speechError) { Log.d("error", ng()); } }); //4.开始听写 (); } private void startNoDialogOffline(){ //1.创建SpeechRecognizer对象,第⼆个参数:本地听写时传InitListener recognizer = Recognizer(this,null); //2.设置听写参数 ameter(_TYPE,_LOCAL);//调⽤语记接⼝ ameter(, "iat");//参数设为语⾳听写 ameter(GE, "zh_cn");//中⽂ ameter(, "mandarin ");//普通话 //3.设置回调接⼝ istening(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 isLast) { if (isLast) { String json = ultString(); String str = atResult(json); Log.d("tag",str); xt(, str, _SHORT).show(); } } @Override public void onError(SpeechError speechError) { Log.d("error", ng()); } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }); }}—————————————————————————————————2016.11.2更新离线语⾳做了个简单的UI,效果如图:完整代码如下,改动部分已注释:package ecognition;import ssDialog;import ;import patActivity;import ;import y;import ;import ;import Manager;import ;import ;import ode;import stener;import izerListener;import izerResult;import Constant;import Error;import Recognizer;import Utility;import izerDialog;import izerDialogListener;public class MainActivity extends AppCompatActivity { private Button btn_voiceRec,btn_voiceRecOffline; private RecognizerDialog iatDialog=null; private SpeechRecognizer recognizer=null; //新增对话框和语⾳听写完成标志------------------ private ProgressDialog pDialog=null; private boolean isFinish=false; //----------------------------------- @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); Utility(this, "appid=xxx");//替换为实际的appid btn_voiceRec = (Button) findViewById(_voiceRec); btn_lickListener(new kListener() { @Override public void onClick(View view) { if (iatDialog!=null){ (); y(); } startDialogOnline(); } }); btn_voiceRecOffline= (Button) findViewById(_voiceRecOffline); btn_lickListener(new kListener() { @Override public void onClick(View view) {// if (recognizer!=null){// ();// y();// } startNoDialogOffline(); //显⽰对话框---------------- showProgressDialog(); //---------------------- } }); } //对话框显⽰⽅法----------------------------------- private void showProgressDialog() { pDialog = new ProgressDialog(); gressStyle(_SPINNER); gress(100); sage("请稍等..."); eterminate(false); (); Params lp = dow().getAttributes(); y = ; Window win = dow(); ributes(lp); new Thread(new Runnable() { @Override public void run() { //long startTime = tTimeMillis(); int progress = 0; //while (tTimeMillis() - startTime < 1000) { //语⾳听写完成后,释放对话框 while (!isFinish) { try { progress += 10; gress(progress); (100); } catch (InterruptedException e) { s(); } } s(); isFinish=false; } }).start(); }//-------------------------------------------------------- /** * 初始化监听器。 */ private InitListener mInitListener = new InitListener() { @Override public void onInit(int code) { Log.d("tag", "SpeechRecognizer init() code = " + code); if (code != S) { Log.d("tag", "初始化失败,错误码:" + code); } } }; public void startDialogOnline() { //1.创建SpeechRecognizer对象,第⼆个参数:本地听写时传InitListener iatDialog = new RecognizerDialog(this, mInitListener); //2.设置听写参数 ameter(GE, "zh_cn"); ameter(, "mandarin "); //3.设置回调接⼝ tener(new RecognizerDialogListener() { @Override public void onResult(RecognizerResult recognizerResult, boolean isLast) { if (!isLast) {
String json = ultString(); String json = ultString(); String str = atResult(json); xt(, str, _SHORT).show(); } } @Override public void onError(SpeechError speechError) { Log.d("error", ng()); } }); //4.开始听写 (); } private void startNoDialogOffline(){ //1.创建SpeechRecognizer对象,第⼆个参数:本地听写时传InitListener recognizer = Recognizer(this,null); //2.设置听写参数 ameter(_TYPE,_LOCAL);//调⽤语记接⼝ ameter(, "iat");//参数设为语⾳听写 ameter(GE, "zh_cn");//中⽂ ameter(, "mandarin ");//普通话 //3.设置回调接⼝ istening(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 isLast) { if (isLast) { String json = ultString(); String str = atResult(json); Log.d("tag",str); xt(, str, _SHORT).show(); //语⾳听写完成标志--------------------------- isFinish=true; //------------------------------------------ } } @Override public void onError(SpeechError speechError) { Log.d("error", ng()); } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }); }}注:经过多次测试后发现,第⼀次点击按钮离线语⾳听写⽆法识别,第⼆次点击按钮才可正常实现听写,之后都可以正常听写,这个bug⽬前还没有解决—————————————————————————————————2016.11.6 更新第⼀次离线语⾳听写⽆反应bug的解决办法:在onCreat()⾥先执⾏⼀次,不显⽰UI,这样再点击就是第⼆次了。。。虽然很蠢,但是功能上算是实现了,后⾯有时间再仔细想想更好的办法protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_main); Utility(this, "appid=xxx");//替换为实际的appid btn_voiceRec = (Button) findViewById(_voiceRec); btn_lickListener(new kListener() { @Override public void onClick(View view) { startDialogOnline(); } }); btn_voiceRecOffline = (Button) findViewById(_voiceRecOffline); //先听写⼀次---------------------------- startNoDialogOffline(); //------------------------------------ btn_lickListener(new kListener() { @Override public void onClick(View view) { startNoDialogOffline(); showProgressDialog(); } }); }注:调试过程中⼜发现,在单独使⽤在线的情况下,在线的RecognizerDialogListener的onResult()会调⽤两次,输出两个str,第⼀个是听写内容,第⼆个是标点符号。如果是if (!isLast),那么输出的是听写内容,如果是if (isLast),输出的是标点符号。很显然,需要的是听写内容,这时要⽤if (!isLast)。如果和离线的混⽤,就像上⾯⼀样,在onCreat()⾥先执⾏了⼀次startNoDialogOffline(),那么经测试RecognizerDialogListener的onResult()只会调⽤⼀次,输出⼀个str,听写内容和标点符号连在⼀起的(具体原因不清楚),这时候如果是if (!isLast),就不会有输出了。所以这⾥要⽤if (isLast)。单独使⽤离线的情况下,RecognizerListener的onResult()是只会调⽤⼀次,输出⼀个str。这时候如果是if (!isLast),就不会有输出了。所以这⾥要⽤if (isLast)。所以说在线的要和离线的分开使⽤,本⽂只是个例⼦,实际使⽤过程中也不会同时使⽤。简单来说,在线⽤if (!isLast)判断,离线⽤if(isLast)判断
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688673835a161506.html
评论列表(0条)