下载语音库
若设备中没有自带的语音输入法,可以使用的科大讯飞的语音识别库,在使用前,需要先下载SDK。下载地址:https://www.xfyun.cn/sdk/dispatcher。
第一步:登录或注册
打开下载地址后,出现如下所示登录界面。已有账号的用户,输入手机号进行登录,没有账号的用户,输入手机号,自动注册。
图:登录 |
第二步:选择或创建应用
登录成功后,出现如下所示SDK下载界面。在此界面选择对应的应用。
图:选择应用 |
若没有应用,或者新建应用,点击上图中的“+”,在如下界面创建应用。
图:创建应用 |
应用创建完成,记录“APPID”,开发时需要此ID值。
图:我的应用 |
第三步:SDK下载
在上图所示界面,选择“SDK下载”,进入下载界面,如下图所示。
图:SDK下载 |
选择对应的应用,点击“添加AI能力”按钮,添加“语音听写”能力。
图:添加新服务 |
在如下界面,点击“语音听写”(图标由灰变绿),点击“SDK下载”,完成下载。
图:选择AI能力,完成下载 |
第四步:实名制认证
在下图的实名制认证界面,根据实际情况,进行实名制认证,否则会影响部分功能的使用。
图:实名制认证 |
功能实现
实现语音识别功能,需要以下文件:
iMobile开发库文件:com.supermap.data_v910.jar、com.supermap.mapping_v910.jar、libimb2d_v910.so,pinyin4j-2.5.1.jar(GIS操作时使用,文字输入可不用),存放于产品包libs文件夹下。
科大讯飞开发库文件:Msc.jar、libmsc.so,下载的科大讯飞SDK包中lib文件夹下。
将上述文件加入工程中,如下图所示:
图:将库文件加入工程 |
打开“strings.xml”文件,添加如下代码,其中“your_id”为下载科大讯飞SDK时,获得的APPID。
<string name="app_id"> your_id</string>
打开AndroidManifest.xml文件,添加录音权限。
<uses-permission android:name="android.permission.RECORD_AUDIO" />
- 语音识别操作需在联网环境下进行。
- 以下仅提供功能实现的基本代码,如需语音输入背景框、搜索结果操作等,可参照示例代码(产品包SampleCode/ SampleCode_AndroidStudio/ SpeechCode)编写。
语音辅助文字输入
语音辅助文字输入,主要用到的类是SpeechManager,以及监听接口SpeechControlListener。
通过以下代码,实现对语音SDK的初始化。
//初始化语音SDK组件
SpeechManager.init(MainActivity.this,getString(R.string.app_id));
//获取语音识别类的单例对象(可在需要用时再获取)
m_speechManager = SpeechManager.getInstance(MainActivity.this);
//设置语音前端点静音超时时间(可选设置)
m_speechManager.setVAD_BOS_Time(3000);
//设置语音后端点静音检测时间(可选设置)
m_speechManager.setVAD_EOS_Time(2000);
//设置返回结果有标点,默认有标点(可选设置)
m_speechManager.setIsPunctuation(true);
//设置录音文件保存路径,默认不保存(可选设置),保留最新的一条语音内容
String path = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/SuperMap/Speech.wav";
m_speechManager.setAudioPath(path);
通过以下代码,开启语音听写。
m_speechManager.startListening(mListener);
通过以下监听,获取听写结果。
private IntelligentSpeechListener mListener = new IntelligentSpeechListener() {
@Override
public void onBeginOfSpeech() { //开始说话
}
@Override
public void onEndOfSpeech() { //检测到音频的静音端点
}
@Override
public void onVolumeChanged(int volume) {//当前录音音量变换
}
@Override
public void onError(String error) {//当次会话出现错误
}
@Override
public void onResult(String info, boolean isLast) {//获取结果
String strText = m_txtSpeechInfo.getText().toString();
m_txtSpeechInfo.setText(strText + info);
}
};
语音辅助GIS操作
语音辅助GIS操作主要用到的类是SpeechControl,以及监听接口SpeechControlListener。SpeechControl通过绑定SpeechManager,既可以实现GIS操作,也可以实现文字输入。
通过以下代码,实现对语音SDK的初始化。
//初始化语音SDK组件
SpeechManager.init(MainActivity.this,getString(R.string.app_id));
//得到语音控制单例对象
m_speechControl = SpeechControl.getInstance();
//获取语音识别类的单例对象
m_speechManager = SpeechManager.getInstance(MainActivity.this);
//必须绑定SpeechManager,才能实现语音控制
m_speechControl.setSpeechManager(m_speechManager);
m_speechControl.setContext(MainActivity.this);
//绑定MapView
m_speechControl.setMapView(mMapView);
通过以下代码开始语音识别。
m_speechControl.startListening(mSpeechControlListener);
通过以下监听,获取听写结果,执行GIS操作。
SpeechControlListener mSpeechControlListener = new SpeechControlListener() {
@Override
public void onBeginOfSpeech() {//开始说话
}
@Override
public void onEndOfSpeech() {//检测到音频的静音端点
}
@Override
public void onVolumeChanged(int i) {//当前录音音量变换
}
@Override
public void onError(String s) {//当次会话出现错误
}
@Override
public void onResult(String s, boolean b) {//获取结果
String strText = m_txtSpeechInfo.getText().toString();
m_txtSpeechInfo.setText(strText + s);
}
@Override
public void onPOIShow(ArrayList<POIInfo> arrayList) {//进入POI显示模式
String poiName = "";
int size = arrayList.size();
for (int i = 0 ; i < size ; i++){
String name = arrayList.get(i).getPoiname();
poiName = poiName + name + ";";
}
m_txtSpeechInfo.setText(poiName);
}
@Override
public void onPOIClick(ArrayList<POIInfo> arrayList, POIInfo poiInfo, int i) {//POI点击
}
@Override
public void onSpeechModeState(SpeechMode.SpeechModeType speechModeType) {
}
};
地图操作
利用SpeechControl,直接输入特定格式语音,即可实现放大、缩小、平移等地图操作。具体语音格式如下:
- 缩放地图:
- 放大/缩小 地图,放大/缩小 一点地图
- 平移地图:
- 上移/下移/左移/右移 地图,上移/下移/左移/右移 一点地图
- 向上/向下/向左/向右 移动地图,向上/向下/向左/向右 移动一点地图
- 往上/往下/往左/往右 移动地图,往上/往下/往左/往右 移动一点地图
POI搜索
利用SpeechControl,直接输入特定语音,实现POI周边搜索。具体语音格式如下:
- 搜索/查找/查询 附近/周边 的(?)
如:搜索附近的酒店,查找周边的医院。
- 附近/周边 的(?)
如:附近的餐厅,周边的停车场。
其中,支持的POI类型如下表。使用时,需要在数据中新建属性项(或使用已有属性项),输入POI类型对应的POI编码,然后将属性项的名称通过“setPOIType”接口设置到程序中。
POI类型 | POI编码 | POI类型 | POI编码 |
---|---|---|---|
餐厅、餐馆、美食 | 10 | 银行 | A1 |
咖啡店、咖啡馆、咖啡厅 | 16 | ATM | A199 |
便利店、超市、商场、商店 | 22 | 学校 | A700 |
KTV | 66 | 加油站 | 4081 |
酒吧 | 1500 | 停车场 | 4101 |
茶馆、茶楼 | 1600 | 饭店、酒店 | 5084 |
药店、药房 | 2800 | 宾馆 | 5380 |
医院 | 7200 |
实现POI搜索,还需额外添加如下所示的参数设置代码:
//设置需要查询的数据源别名
m_speechControl.setDatasourceName("clip1");
//设置需要查询的数据集别名
m_speechControl.setDatasetName("POI_All_new");
//设置当前位置(可多次实时更新)
m_speechControl.setGPSData(new Point2D(116.422429, 39.935264));
//设置查询的POI的X坐标属性名称
m_speechControl.setXName("smX");
//设置查询的POI的Y坐标属性名称
m_speechControl.setYName("smY");
//设置查询的POI名称的属性名称
m_speechControl.setPOIName("Name");
//设置查询的POI类型的属性名称
m_speechControl.setPOIType("Kind");
//设置查询的POI的范围
m_speechControl.setPOIRange(500, 1000, 2000);
路径导航
语音辅助路径导航,包括位置定位和导航两部分,具体的语音格式如下:
- 位置定位:
- 定位到(?)
- (?)在什么位置
- (?)在哪里
- 定位到 我的位置/当前的位置/当前位置
- 我在 哪儿/哪里/什么位置
- 路径导航:
- 我要/我想/怎么 去 (?)
- 去(?)怎么走/应该怎么走
- 从(?)到(?) 怎么走/应该怎么走
- 从(?)到(?)的路线
通过“setDatasetName”方法,传入位置点所在的数据集,通过“setGPSData”方法,传入当前位置。
这里以行业导航为例,介绍导航的实现方式,使用前,先将声音文件“voice\resource.mp3”(产品包Resource文件下),加入到assets文件夹下,并加入如下所示的导航设置代码:
//设置需要查询的数据源别名
m_speechControl.setDatasourceName("clip1");
//设置需要查询的出发点、目的地所在数据集别名
m_speechControl.setDatasetName("POI_All_new");
//设置当前位置(可多次实时更新)
m_speechControl.setGPSData(new Point2D(116.422429, 39.935264));
//设置导航起点图标
m_speechControl.setStartPointDrawable(R.drawable.startpoint);
//设置导航终点图标
m_speechControl.setDestPointDrawable(R.drawable.destpoint);
// 获取行业导航控件
m_Navigation2 = m_mapControl.getNavigation2();
// 设置分析所得路径可见
m_Navigation2.setPathVisible(true);
// 设置网络数据集
DatasetVector networkDataset = (DatasetVector) m_wokspace.getDatasources().get("clip1").getDatasets().get("BuildNetwork");
m_Navigation2.setNetworkDataset(networkDataset);
// 加载网络模型
m_Navigation2.loadModel(sdcard + "/SampleData/Beijing/NetworkModel.snm"); m_Navigation2.addNaviInfoListener(new NaviListener() {//导航回调中的代码,可根据实际项目编写
@Override
public void onNaviInfoUpdate(NaviInfo naviInfo) {
}
@Override
public void onStartNavi() {
}
@Override
public void onAarrivedDestination() {
}
@Override
public void onStopNavi() {
}
@Override
public void onAdjustFailure() {
}
@Override
public void onPlayNaviMessage(String s) {
}
});
图层设置
通过语音进行的图层控制操作包括设置编辑图层,设置图层颜色,图层显示和隐藏,地图切换,具体语音格式如下:
- 编辑图层:
- 编辑/选择/选中第(?)个图层
- 设置图层颜色:
- 设置图层风格为(?)色
- 图层显示和隐藏:
- 隐藏/显示第(?)个图层
- 地图切换:
- 关闭/打开第(?)个地图
如:编辑/选择/选中第7个图层。若输入的图层数多于实际的图层数,则提示“图层不存在”。设置图层可编辑后,可以进行数据绘制,绘制完成后,可通过saveEdit()方法,保存数据。
如:设置图层风格为蓝色。目前支持的颜色有:红、橙、黄、绿、青、蓝、紫。
设置图层颜色操作前,需设置图层可编辑。
如:隐藏第5个图层。若输入的图层数多于实际的图层数,则提示“图层不存在”。
如:关闭第2个地图。若输入的个数多于实际的地图个数,则提示“地图不存在”。
当输入编辑图层命令后,即进入编辑模式,除设置图层颜色的操作可执行外,其他操作如POI搜索、放大地图、路径导航等,都将不可操作。(语音辅助文字输入功能不受影响)若要进行上述操作,可通过下面两种方式进行模式切换。
m_speechControl.quitEditMode(); //退出图层编辑模式,进入普通语音控制模式
或
SpeechMode.setSpeechModeType(SpeechMode.SpeechModeType.NORMAL); //设置语音控制模式为普通语音控制模式