语音输入法

利用设备中的语音输入法,首先先确保设备中有语音输入的方式,若设备中自带的输入法中没有语音输入,可去应用商店中下载如讯飞输入法、百度输入法、搜狗输入法、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,直接输入特定格式语音,即可实现放大、缩小、平移等地图操作。具体语音格式如下:

  1. 缩放地图:
    • 放大/缩小 地图,放大/缩小 一点地图
  2. 平移地图:
    • 上移/下移/左移/右移 地图,上移/下移/左移/右移 一点地图
    • 向上/向下/向左/向右 移动地图,向上/向下/向左/向右 移动一点地图
    • 往上/往下/往左/往右 移动地图,往上/往下/往左/往右 移动一点地图

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);

路径导航

语音辅助路径导航,包括位置定位和导航两部分,具体的语音格式如下:

  1. 位置定位:
    • 定位到(?)
    • (?)在什么位置
    • (?)在哪里
    • 定位到 我的位置/当前的位置/当前位置
    • 我在 哪儿/哪里/什么位置
  2. 路径导航:
    • 我要/我想/怎么 去 (?)
    • 去(?)怎么走/应该怎么走
    • 从(?)到(?) 怎么走/应该怎么走
    • 从(?)到(?)的路线

通过“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) {

    }
});

图层设置

通过语音进行的图层控制操作包括设置编辑图层,设置图层颜色,图层显示和隐藏,地图切换,具体语音格式如下:

  1. 编辑图层:
    • 编辑/选择/选中第(?)个图层

    如:编辑/选择/选中第7个图层。若输入的图层数多于实际的图层数,则提示“图层不存在”。设置图层可编辑后,可以进行数据绘制,绘制完成后,可通过saveEdit()方法,保存数据。

  2. 设置图层颜色:
    • 设置图层风格为(?)色

    如:设置图层风格为蓝色。目前支持的颜色有:红、橙、黄、绿、青、蓝、紫。

    注意事项:

    设置图层颜色操作前,需设置图层可编辑。

  3. 图层显示和隐藏:
    • 隐藏/显示第(?)个图层

    如:隐藏第5个图层。若输入的图层数多于实际的图层数,则提示“图层不存在”。

  4. 地图切换:
    • 关闭/打开第(?)个地图

    如:关闭第2个地图。若输入的个数多于实际的地图个数,则提示“地图不存在”。

    注意事项:

    当输入编辑图层命令后,即进入编辑模式,除设置图层颜色的操作可执行外,其他操作如POI搜索、放大地图、路径导航等,都将不可操作。(语音辅助文字输入功能不受影响)若要进行上述操作,可通过下面两种方式进行模式切换。

m_speechControl.quitEditMode(); //退出图层编辑模式,进入普通语音控制模式

SpeechMode.setSpeechModeType(SpeechMode.SpeechModeType.NORMAL); //设置语音控制模式为普通语音控制模式