转载请注明CSDN博文地址:http://blog.csdn.net/ls0609/article/details/71519203
语音记账demo:http://blog.csdn.net/ls0609/article/details/72765789
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"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.olami.musicdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name="com.olami.musicdemo.OlamiApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!--喜马拉雅听书测试账号app_key-->
<meta-data
android:name="app_key"
android:value="b617866c20482d133d5de66fceb37da3" />
<!--喜马拉雅听书测试账号包名-->
<meta-data
android:name="pack_id"
android:value="com.app.test.android" />
<activity
android:name=".MusicActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--注册olami sdk service-->
<service
android:name=".VoiceSdkService"
android:exported="true" >
</service>
<!--注册喜马拉雅听书service-->
<service
android:name=
"com.ximalaya.ting.android.opensdk.player.service.XmPlayerService"
/>
</application>
</manifest>
2.layout布局文件
layout_musicview.xml
TextView 有两个,tv_name显示听书的名称, tv_totoal_time显示听书的总时间。
ProgressBar 实时刷新显示听书的进度
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<TextView
android:text="name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_centerHorizontal="true"
android:id="@+id/tv_name"/>
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_name"
android:layout_marginTop="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:id="@+id/progressbar_music"/>
<TextView
android:text="total_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/progressbar_music"
android:layout_marginTop="10dp"
android:layout_centerHorizontal="true"
android:id="@+id/tv_total_time"/>
</RelativeLayout>
activity_music.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
tools:context="com.olami.musicdemo.MusicActivity" >
<TextView
android:id="@+id/tv_inputText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="输入:" />
<TextView
android:id="@+id/tv_volume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/tv_inputText"
android:layout_below="@+id/tv_inputText"
android:layout_marginTop="40dp"
android:text="音量:" />
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_volume"
android:layout_marginTop="20dp"
android:maxLines="15"
android:ellipsize="end"
android:text="服务器返回sentence:"
android:visibility="visible" />
<com.olami.musicdemo.MusicView
android:id="@+id/music_view"
android:layout_width="fill_parent"
android:layout_height="80dp"
android:layout_centerInParent="true"
>
</com.olami.musicdemo.MusicView>
<EditText
android:id="@+id/et_content"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_above="@+id/btn_stop"
android:layout_alignLeft="@+id/tv_inputText"