讯飞语音库

下载语音库

若设备中没有自带的语音输入法,可以使用的科大讯飞的语音识别库,在使用前,需要先下载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" />
注意事项:
  1. 语音识别操作需在联网环境下进行。
  2. 以下仅提供功能实现的基本代码,如需语音输入背景框、搜索结果操作等,可参照示例代码(产品包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,直接输入特定格式语音,即可实现放大、缩小、平移等地图操作。具体语音格式如下:

  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); //设置语音控制模式为普通语音控制模式