利用设备中的语音输入法,首先先确保设备中有语音输入的方式,若设备中自带的输入法中没有语音输入,可去应用商店中下载如讯飞输入法、百度输入法、搜狗输入法、QQ输入法等。
实现语音识别功能,需要以下文件:
iMobile开发库文件:com.supermap.data.jar、com.supermap.mapping.jar、com.supermap.navigation.jar、pinyin4j-2.5.1.jar 、libimb2d.so、libAisound.so,存放于产品包libs文件夹下。
将上述文件加入工程中,如下图所示:
图:将库文件加入工程 |
语音辅助GIS操作主要用到的类是SpeechControl,以及监听接口SpeechControlListener。通过以下代码,实现对语音SDK的初始化。
//得到语音控制单例对象
m_speechControl = SpeechControl.getInstance();
//设置所需的上下文
m_speechControl.setContext(MainActivity.this);
//绑定MapView
m_speechControl.setMapView(mMapView);
//设置直接输入文字命令的监听
m_speechControl.starNoSpeechtListening(mSpeechControlListener);
通过以下代码开始语音识别。
//直接可以输入文字命令, strCommand即为文字命令,格式参照下面的说明
m_speechControl.voiceCommand(strCommand);
通过以下监听,操作POI的搜索结果,主要用到onPOIShow和onPOIClick。
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) {//获取结果
}
@Override
public void onPOIShow(ArrayList<POIInfo> arrayList) {//进入POI显示模式
}
@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); //设置语音控制模式为普通语音控制模式