博客> 语音识别,语义理解一站式解决(android平台&olami sdk)
语音识别,语义理解一站式解决(android平台&olami sdk)
2017-08-18 08:57 评论:0 阅读:54 ls0609
Android 语音识别 语义理解 olami

用olami sdk语音识别语义理解做在线听书 olami sdk实现了把录音或者文字转化为用户可以理解的json字符串,本文使用olami sdk做了一个在线听书的demo,用的是喜马拉雅的在线听书sdk.基于eclipse开发环境,libs目录下jar和so文件如下: olami-android-sdk.jar //olami sdk 的jar afinal_0.5.1_bin.jar litepal.jar gson-2.2.4.jar okhttp-2.4.0.jar okhttp-urlconnection-2.2.0.jar okio-1.4.0.jar opensdk.jar //上面这几个都是喜马拉雅需要的jar libspeex.so //olami sdk 需要用到speex压缩功能 libxmediaplayer.so // 喜马拉雅so libxmediaplayer_x.so // 喜马拉雅so

概述: VoiceSdkService中定义了OlamiVoiceRecognizer语音识别引擎,通过点击MusicActivity的开始button启动录音,录音结果在VoiceSdkService中的onResult()回调中拿到识别的Json字符串,在processServiceMessage()函数中处理后找到要听书的名称,然后进入BookUtil进行搜索,搜索到结果后通知VoiceSdkService进行播放,并通知MusicActivity更新播放进度等信息。

1. AndroidManifest.xml配置

<?xml version="1.0" encoding="utf-8"?>

<!--喜马拉雅听书测试账号app_key--> <meta-data android:name="app_key" android:value="b617866c20482d133d5de66fceb37da3" /> <!--喜马拉雅听书测试账号包名--> <meta-data android:name="pack_id" android:value="com.app.test.android" /> <!--注册olami sdk service--> <!--注册喜马拉雅听书service-->

2. layout布局文件

layout_musicview.xml

TextView 有两个,tv_name显示听书的名称, tv_totoal_time显示听书的总时间。 ProgressBar 实时刷新显示听书的进度

 progressbar.jpg

activity_music.xml

 activity_music1.jpg

 activity_music2.jpg

自定义MusicView比较简单,代码如下:

public class MusicView extends RelativeLayout{ private Context mContext; private Handler mHandler; private TextView mTextViewName; private TextView mTextViewTotalTime; private ProgressBar mProgressBar; public MusicView(Context context,AttributeSet attrs) { super(context,attrs); LayoutInflater inflater =(LayoutInflater) context.getSystemService( context.LAYOUT_INFLATER_SERVICE); RelativeLayout view = (RelativeLayout) inflater.inflate (R.layout.layout_musicview, this,true); mTextViewName = (TextView) view.findViewById(R.id.tv_name); mTextViewTotalTime = (TextView) view.findViewById(R.id.tv_total_time); mProgressBar = (ProgressBar)view.findViewById(R.id.progressbar_music);

}

public void initMusicView(Context context,Handler handler)
{
    mContext = context;
    mHandler = handler;
}

public void setMusicName(String name)
{//设置播放名称
    mTextViewName.setText(name);
}

public void setProgress(int progress)
{//设置播放进度
    mProgressBar.setProgress(progress);
}

public void setTotalTime(String time)
{//设置播放总时间
    mTextViewTotalTime.setText(time);
}

} 布局效果图如下:

 musicdemo.jpg

3.MusicActivity和VoiceSdkService通信

本文没有用bind service的方式实现activity和service的消息通信。 MusicAcitity 和 VoiceSdkService中分别实现了一个CommunicationAssist的接口

public interface CommunicationAssist { public void callBack(int what, int arg1, int arg2,Bundle data, Object obj); } 然后把他们分别实现CommunicationAssist接口的变量注册到OlamiApplication,这样通过OlamiApplication实现了MusicAcitity 和 VoiceSdkService桥接。

  • 3.1OlamiApplication 1) 注册MusicActivity到VoiceSdkService的回调 public void setActivityToServiceListener(CommunicationAssist listener) { ActivityToServiceListener = listener; } 这个是在VoiceSdkService中调用setActivityToServiceListener(),把VoiceSdkService中的VoiceSdkComAssist注册到application中,MusicActivity中可以通过getActivityToServiceListener 这个函数回调向VoiceSdkService发送消息。

2) 注册 VoiceSdkService到MusicActivity回调 public void setServiceToActivityListener(CommunicationAssist listener) { mServiceToActivityListener = listener; }

这个是在MusicAcitivity中调用setServiceToActivityListener(),这样在VoiceSdkService中就可以通过getServiceToActivityListener()获得回调向MusciActivity发送消息。

3.2 MusicActivity public class MusicActivity extends Activity { private Handler mHandler; private Handler mInComingHandler; private ActivityComAssist mActivityComAssist; private Button mBtnStart; private Button mBtnStop; private Button mBtnCancel; private Button mBtnSend; private EditText mEditText; private TextView mTextView; private TextView mInputTextView; private TextView mTextViewVolume; private BookUtil mBookUtil = null; private MusicView mMusicView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_music);
    initHandler();//初始化handler用于内部消息处理
    initInComingHandler();//用于处理来自VoiceSdkService的消息
    initCommunicationAssist();//向application注册消息回调,VoiceSdkSerive可以
            //通过getServiceToActivityListener()获得回调向MusicActivity发送消息
    initView();//初始化view控件
    Intent intent = new Intent();
    intent.setClass(MusicActivity.this, VoiceSdkService.class);
    startService(intent);//启动后台服务

}

private void initView()
{
    mBtnStart = (Button) findViewById(R.id.btn_start);
    mBtnStop = (Button) findViewById(R.id.btn_stop);
    mBtnCancel = (Button) findViewById(R.id.btn_cancel);
    mBtnSend = (Button) findViewById(R.id.btn_send);
    mInputTextView = (TextView) findViewById(R.id.tv_inputText);
    mEditText = (EditText) findViewById(R.id.et_content);
    mTextView = (TextView) findViewById(R.id.tv_result);
    mTextViewVolume = (TextView) findViewById(R.id.tv_volume);

    mBtnStart.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            sendMessageToService(MessageConst.CLIENT_ACTION_START_RECORED,0,0,null,null);
        }           
    });

    mBtnStop.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            sendMessageToService(MessageConst.CLIENT_ACTION_STOP_RECORED,0,0,null,null);
            mBtnStart.setText("开始");
            Log.i("led","MusicActivity mBtnStop onclick 开始");
        }           
    });

    mBtnCancel.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            sendMessageToService(MessageConst.CLIENT_ACTION_CANCEL_RECORED,0,0,null,null);
        }           
    });

    mBtnSend.setOnClickListener(new OnClickListener(){

        @Override
            public void onClick(View v) {
        sendMessageToService(
        MessageConst.CLIENT_ACTION_SENT_TEXT,0,0,null,mEditText.getText());
            mInputTextView.setText("文字: "+mEditText.getText());
        }           
    });

    mMusicView = (MusicView) findViewById(R.id.music_view);
    //if(mMusicView != null)
        //mMusicView.initMusicView(MusicActivity.this,mHandler);

}

private void initHandler()
{
    mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what){
            case MessageConst.CLIENT_ACTION_START_RECORED:
                break;
            default:
                break;  
            }
        }
    };
}
//InComingHandler 收到来自VoiceSdkService的消息用于更新界面,
//包括开始录音,结束录音,播放的书的名称和进度,音量等信息。
private void initInComingHandler()
{
    mInComingHandler = new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what){
            case MessageConst.CLIENT_ACTION_START_RECORED:
                mBtnStart.setText("录音中");
                Log.i("led","MusicActivity 录音中");
                break;
            case MessageConst.CLIENT_ACTION_STOP_RECORED:
                mBtnStart.setText("识别中");
                Log.i("led","MusicActivity 识别中");
                break;
            case MessageConst.CLIENT_ACTION_CANCEL_RECORED:
                mBtnStart.setText("开始");
                mTextView.setText("已取消");
                break;
            case MessageConst.CLIENT_ACTION_ON_ERROR:
                mTextView.setText("错误代码:"+msg.arg1);
                mBtnStart.setText("开始");
                break;
            case MessageConst.CLIENT_ACTION_UPDATA_VOLUME:
                mTextViewVolume.setText("音量: "+msg.arg1);
                break;
            case MessageConst.SERVER_ACTION_RETURN_RESULT:
                //mTextView.setText(msg.obj.toString());
                mBtnStart.setText("开始");
                break;
            case MessageConst.CLIENT_ACTION_PLAY_BOOK_AFTER_SEARCH:
                mBtnStart.setText("开始");
                mBookUtil = BookUtil.getInstance();
                mBookUtil.play(msg.arg1);
                break;
            case MessageConst.CLIENT_ACTION_UPDATA_PLAYING_BOOK_NAME:
                mMusicView.setMusicName(msg.obj.toString());
                break;
            case MessageConst.CLIENT_ACTION_UPDATE_BOOK_PROGRESS:
                int current = msg.arg1;
                int duration = msg.arg2;
                mMusicView.setProgress(current*100/duration);
                float time = duration/1000/60;
                mMusicView.setTotalTime("总时间:"+time);
                break;
            case MessageConst.CLIENT_ACTION_UPDATA_INPUT_TEXT:
                if(msg.obj != null)
                   mInputTextView.setText("文字: "+msg.obj.toString());
                break;
            case MessageConst.CLIENT_ACTION_UPDATA_SERVER_MESSAGE:
                if(msg.obj != null)
                    mTextView.setText("服务器返回sentence: "+msg.obj.toString());
                break;
            default:
                break;
            }
        }
    };
}

private void initCommunicationAssist()
{//向Application注册VoiceSdkService到MusicActivity的回调
    mActivityComAssist = new ActivityComAssist();
    OlamiApplication.getInstance().setServiceToActivityListener(mActivityComAssist);
}

private void sendMessageToService(int what, int arg1, int arg2, Bundle data, Object obj)
{//向VoiceSdkService发送消息
    if(OlamiApplication.getInstance().getActivityToServiceListener() != null)
        OlamiApplication.getInstance().getActivityToServiceListener().callBack
        (what, arg1, arg2, data, obj);
}

private class ActivityComAssist implements CommunicationAssist{
//实现CommunicationAssist借口,用于回调VoiceSdkService发送过来的消息
    @Override
    public void callBack(int what, int arg1, int arg2, Bundle data,Object obj) {
        Message msg = Message.obtain(null, what);
        msg.arg1 = arg1;
        msg.arg2 = arg2;
        if (data != null)
            msg.setData(data);
        if (obj != null)
            msg.obj = obj;
        mInComingHandler.sendMessage(msg);
    }       
}

@Override
public void onDestroy() {
    //退出应用,停止VoiceSdkService,会进行资源的释放
    super.onDestroy();
    Intent intent = new Intent();
    intent.setClass(MusicActivity.this, VoiceSdkService.class);
    stopService(intent);
}

} 3.3 VoiceSdkService @Override public void onCreate() { initHandler();//用于内部消息处理 initInComingHandler();//用于处理来自MusicActivity的消息 initCommunicationAssist();//向application注册消息回调,这样MusicActivity可 //以通过getActivityToServiceListener()回调向VoiceSdkService发送消息 initViaVoiceRecognizerListener();//初始化录音识别回调listener init();//olami录音识别引擎初始化 initXmly();//喜马拉雅初始化 }

public void init() { initHandler(); mOlamiVoiceRecognizer = new OlamiVoiceRecognizer(VoiceSdkService.this); TelephonyManager telephonyManager=(TelephonyManager) this.getSystemService( (this.getBaseContext().TELEPHONY_SERVICE); String imei=telephonyManager.getDeviceId(); mOlamiVoiceRecognizer.init(imei);//设置身份标识,可以填null

mOlamiVoiceRecognizer.setListener(mOlamiVoiceRecognizerListener);//设置识别结果回调listener
mOlamiVoiceRecognizer.setLocalization(
OlamiVoiceRecognizer.LANGUAGE_SIMPLIFIED_CHINESE);//设置支持的语音类型,优先选择中文简体
mOlamiVoiceRecognizer.setAuthorization("51a4bb56ba954655a4fc834bfdc46af1",
                        "asr","68bff251789b426896e70e888f919a6d","nli");  
//注册Appkey,在olami官网注册应用后生成的appkey
//注册api,请直接填写“asr”,标识语音识别类型
//注册secret,在olami官网注册应用后生成的secret
//注册seq ,请填写“nli”

mOlamiVoiceRecognizer.setVADTailTimeout(2000);//录音时尾音结束时间,建议填//2000ms
//设置经纬度信息,不愿上传位置信息,可以填0 
mOlamiVoiceRecognizer.setLatitudeAndLongitude(31.155364678184498,121.34882432933009); 

}

定义OlamiVoiceRecognizerListener onError(int errCode)//出错回调,可以对比官方文档错误码看是什么错误 onEndOfSpeech()//录音结束 onBeginningOfSpeech()//录音开始 onResult(String result, int type)//result是识别结果JSON字符串 onCancel()//取消识别,不会再返回识别结果 onUpdateVolume(int volume)//录音时的音量,1-12个级别大小音量 下面是VoiceSdkService完整代码:

public class VoiceSdkService extends Service{

private Handler mHandler;
private Handler mInComingHandler;
private VoiceSdkComAssist mVoiceSdkComAssist;
private OlamiVoiceRecognizer mOlamiVoiceRecognizer;
private OlamiVoiceRecognizerListener mOlamiVoiceRecognizerListener;
private BookUtil mBookUtil = null;
private boolean mIsRecordPause = false;

@Override
public void onCreate() {
    initHandler();
    initInComingHandler();
    initCommunicationAssist();
    initViaVoiceRecognizerListener();
    init();
    initXmly();
}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

public void init()
{
    initHandler();
    mOlamiVoiceRecognizer = new OlamiVoiceRecognizer(VoiceSdkService.this);
    TelephonyManager telephonyManager=(TelephonyManager) this.getSystemService(
    this.getBaseContext().TELEPHONY_SERVICE);
    String imei=telephonyManager.getDeviceId();
    mOlamiVoiceRecognizer.init(imei);//set null if you do not want to notify olami server.

    mOlamiVoiceRecognizer.setListener(mOlamiVoiceRecognizerListener);
    mOlamiVoiceRecognizer.setLocalization(
                                     OlamiVoiceRecognizer.LANGUAGE_SIMPLIFIED_CHINESE);
    mOlamiVoiceRecognizer.setAuthorization(
        "51a4bb56ba954655a4fc834bfdc46af1",
        "asr","68bff251789b426896e70e888f919a6d","nli");        
    mOlamiVoiceRecognizer.setVADTailTimeout(2000);
    mOlamiVoiceRecognizer.setLatitudeAndLongitude(31.155364678184498,121.34882432933009); 
}

private void initHandler()
{
    mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what){
            case MessageConst.CLIENT_ACTION_START_RECORED:
                sendMessageToActivity(MessageConst.CLIENT_ACTION_START_RECORED,0,0,null,null);
                break;
            case MessageConst.CLIENT_ACTION_STOP_RECORED:
                sendMessageToActivity(MessageConst.CLIENT_ACTION_STOP_RECORED,0,0,null,null);
                break;
            case MessageConst.CLIENT_ACTION_ON_ERROR:
                sendMessageToActivity(MessageConst.CLIENT_ACTION_ON_ERROR,msg.arg1,0,null,null);
                break;
            case MessageConst.CLIENT_ACTION_PLAY_BOOK_AFTER_SEARCH:
                sendMessageToActivity(MessageConst.
                CLIENT_ACTION_PLAY_BOOK_AFTER_SEARCH, msg.arg1, 0, null, msg.obj);
                break;
            case MessageConst.CLIENT_ACTION_UPDATA_PLAYING_BOOK_NAME:
                sendMessageToActivity(MessageConst.
                CLIENT_ACTION_UPDATA_PLAYING_BOOK_NAME, msg.arg1, 0, null, msg.obj);
                break;
            case MessageConst.CLIENT_ACTION_UPDATE_BOOK_PROGRESS:
                sendMessageToActivity(MessageConst.
                CLIENT_ACTION_UPDATE_BOOK_PROGRESS, msg.arg1, msg.arg2, null, null);
                break;
            case MessageConst.CLIENT_ACTION_CANCEL_RECORED:
                sendMessageToActivity(MessageConst.
                CLIENT_ACTION_CANCEL_RECORED, msg.arg1, msg.arg2, null, null);
                break;
            default:
                break;
            }
        }
    };
}

private void initInComingHandler()
{
    mInComingHandler = new Handler(){
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what){
            case MessageConst.CLIENT_ACTION_START_RECORED:
                if(mOlamiVoiceRecognizer != null)
                    mOlamiVoiceRecognizer.start();  
                break;
            case MessageConst.CLIENT_ACTION_STOP_RECORED:
                if(mOlamiVoiceRecognizer != null)
                    mOlamiVoiceRecognizer.stop();   
                break;
            case MessageConst.CLIENT_ACTION_CANCEL_RECORED:
                if(mOlamiVoiceRecognizer != null)
                    mOlamiVoiceRecognizer.cancel(); 
                break;
            case MessageConst.CLIENT_ACTION_SENT_TEXT:
                if(mOlamiVoiceRecognizer != null)
                    mOlamiVoiceRecognizer.sendText(msg.obj.toString());                 
                break;
            }
        }
    };
}

private void initViaVoiceRecognizerListener()
{
    mOlamiVoiceRecognizerListener = new OlamiVoiceRecognizerListener();
}

private class OlamiVoiceRecognizerListener implements IOlamiVoiceRecognizerListener{

    @Override
    public void onError(int errCode) {
        mHandler.sendMessage(mHandler.obtainMessage(
        MessageConst.CLIENT_ACTION_ON_ERROR,errCode,0));

    }

    @Override
    public void onEndOfSpeech() {
        mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_STOP_RECORED);
        if(mIsRecordPause)
        {
            mIsRecordPause = false;
            mBookUtil.resumePlay();
        }

    }

    @Override
    public void onBeginningOfSpeech() {
        if(mBookUtil.isPlaying())
        {
            mBookUtil.pause();
            mIsRecordPause = true;
        }
        mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_START_RECORED);

    }

    @Override
    public void onResult(String result, int type) {     
        sendMessageToActivity(MessageConst.SERVER_ACTION_RETURN_RESULT,type,0,null,result);
        processServiceMessage(result);
    }

    @Override
    public void onCancel() {
        mHandler.sendEmptyMessage(MessageConst.CLIENT_ACTION_CANCEL_RECORED);

    }

    @Override
    public void onUpdateVolume(int volume) {

    sendMessageToActivity(MessageConst.CLIENT_ACTION_UPDATA_VOLUME,volume,0,null,null);

    }

}

private void initCommunicationAssist()
{
    mVoiceSdkComAssist = new VoiceSdkComAssist();
    OlamiApplication.getInstance().setActivityToServiceListener(mVoiceSdkComAssist);
}

private void initXmly()
{
    if(mBookUtil == null)
    {
        mBookUtil = BookUtil.getInstance();
        mBookUtil.init(VoiceSdkService.this);
        mBookUtil.setHandler(mHandler);
    }
}

private void processServiceMessage(String message)
{
    String input = null;
    String serverMessage = null;
    try{
        JSONObject jsonObject = new JSONObject(message);
        JSONArray jArrayNli = jsonObject.optJSONObject("data").optJSONArray("nli");
        JSONObject jObj = jArrayNli.optJSONObject(0);
        JSONArray jArraySemantic = null;
        if(message.contains("semantic"))
          jArraySemantic = jObj.getJSONArray("semantic");
        else{
            input = jsonObject.optJSONObject("data").optJSONObject("asr").
            optString("result");
            sendMessageToActivity(MessageConst.
                                 CLIENT_ACTION_UPDATA_INPUT_TEXT, 0, 0, null, input);
            serverMessage = jObj.optJSONObject("desc_obj").opt("result").toString();
            sendMessageToActivity(MessageConst.
                    CLIENT_ACTION_UPDATA_SERVER_MESSAGE, 0, 0, null, serverMessage);
            return;
        }
        JSONObject jObjSemantic;
        JSONArray jArraySlots;
        JSONArray jArrayModifier;
        String type = null;
        String songName = null;
        String singer = null;

        if(jObj != null) {
            type = jObj.optString("type");
            if("musiccontrol".equals(type))
            {
                jObjSemantic = jArraySemantic.optJSONObject(0);
                input = jObjSemantic.optString("input");
                jArraySlots = jObjSemantic.optJSONArray("slots");
                jArrayModifier = jObjSemantic.optJSONArray("modifier");
                String modifier = (String)jArrayModifier.opt(0);
                if((jArrayModifier != null) && ("play".equals(modifier)))
                {
                    if(jArraySlots != null)
                       for(int i=0,k=jArraySlots.length(); i<k xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed i=0,k xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed xss=removed> param = new HashMap<String>();
param.put(DTransferConstants.SEARCH_KEY, bookName);
param.put(DTransferConstants.CATEGORY_ID, "" + 3);//此处3代表搜索的是听书
//param.put(DTransferConstants.PAGE, "" + mPageId);
param.put(DTransferConstants.SORT, "asc");//返回列表的排序是正序还是逆序
param.put(DTransferConstants.PAGE_SIZE, "" + PAGE_SIZE);//每页能返回多少个查询结果
mPage = (index/PAGE_SIZE)+1;//当前在第几页

mPlayerManager = XmPlayerManager.getInstance(mContext);//喜马拉雅初始化部分
mPlayerManager.init(mNotificationId, null);
mPlayerManager.addPlayerStatusListener(mPlayerStatusListener);
mPlayerManager.addAdsStatusListener(mAdsListener);

CommonRequest.getSearchedAlbums(param, new IDataCallBack<SearchAlbumList>()
{

    @Override
    public void onSuccess(SearchAlbumList object)   
    {                   
        if (object != null && object.getAlbums() != null
                && object.getAlbums().size() != 0)
        {
            if (mSearchAlbumList == null)
            {
                mSearchAlbumList = object;
            }
            else
            {
                mSearchAlbumList.getAlbums().addAll(object.getAlbums());
            }
            //mTrackAdapter.notifyDataSetChanged();

            Map<String> map = new HashMap<String>();

            map.put(
            DTransferConstants.ALBUM_ID, ""+object.getAlbums().get(0).getId());
            map.put(DTransferConstants.SORT, "asc");
            map.put(DTransferConstants.PAGE, "" + mPage);
            map.put(DTransferConstants.PAGE_SIZE,  "" + PAGE_SIZE);

            CommonRequest.getTracks(map, new IDataCallBack<TrackList>()
            {

                    @Override
                    public void onSuccess(TrackList object)
                    {
                        mTrackList = object;
                        mTotalCount = mTrackList.getTotalCount();
                        if(mTrackList.getTracks().size() <= 0)
                            return;
                        String str = "专辑:"+mTrackList.getAlbumTitle()+
                                        get(0).getTrackTitle().toString();
                        if(isNeedPlay)
                        {
                            mPosition = index % PAGE_SIZE;
                            mHandler.sendMessage(mHandler.obtainMessage                                MessageConst.CLIENT_ACTION_PLAY_BOOK_AFTER_SEARCH, 
                         index % PAGE_SIZE,0));//此处mTrackList中已经查询出结果
                            //向VoiceSdkService发送消息进行播放
                        }
                        else
                            sendBookInfoToServer();                                 
                    }
                    @Override
                    public void onError(int code, String message)
                    {
                        Log.i("ppp","error: "+message);
                        sendBookInfoToServer();
                    }
            });

        }
    }

    @Override
    public void onError(int code, String message)
    {
          Log.i("ppp","error: "+message);
          sendBookInfoToServer();
    }
});

}

5.demo中支持的说法

我想听西游记 我要听西游记 播放西游记 听西游记 我想听西游记这本书 上一首 上一回 下一首 下一回 暂停/暂停播放 继续/继续播放 声音大一点 声音小一点 关闭/关闭播放 用的是喜马拉雅测试账号,只支持听书的功能,查找歌曲的结果返回为空。

6.源码下载链接

https://github.com/ls0609/olami_musicdemo

7.相关博客

语音识别语义理解一站式解决(android平台&olami sdk) http://blog.csdn.net/ls0609/article/details/71519203

olami开放平台语法编写简介:http://blog.csdn.net/ls0609/article/details/71624340 olami开放平台语法官方介绍:https://cn.olami.ai/wiki/?mp=nli&content=nli2.html csdn博文:http://blog.csdn.net/ls0609/article/details/71519203

收藏
0
sina weixin mail 回到顶部