commit 09b6667615fdc7a4aa93e7c081783e71db74b2d7 Author: victor-fa <827542599@qq.com> Date: Wed Jul 25 10:03:54 2018 +0800 初始化讯飞插件 diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c93584 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# cordova-plugin-IFlyspeech-master + +科大讯飞的语音听说读写的cordova插件 + +### Supported Platforms + +- iOS +- android + +## Installation + +cordova plugin add https://github.com/victor-fa/cordova-plugin-IFlyspeech-master.git + diff --git a/package.json b/package.json new file mode 100644 index 0000000..8fd36ce --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "cordova-plugin-xunfeiListenSpeaking", + "version": "0.0.1", + "cordova": { + "id": "cordova-plugin-xunfeiListenSpeaking", + "platforms": [ + "android", + "ios" + ] + }, + "keywords": [ + "ecosystem:cordova", + "cordova-android", + "cordova-ios" + ], + "author": "cc", + "license": "ISC", + "description": "" +} diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..566c76c --- /dev/null +++ b/plugin.xml @@ -0,0 +1,275 @@ + + + cordova-plugin-xunfeiListenSpeaking + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 584e7225 + 本示例为讯飞语音Android平台开发者提供语音听写、语法识别、语义理解和语音合成等代码样例,旨在让用户能够依据该示例快速开发出基于语音接口的应用程序。 + 科大讯飞作为中国最大的智能语音技术提供商,在智能语音技术领域有着长期的研究积累,并在中文语音合成、语音识别、口语评测等多项技术上拥有国际领先的成果。科大讯飞是我国唯一以语音技术为产业化方向的“国家863计划成果产业化基地”… + iFLYTEK is a national key software enterprise dedicated to the research of intelligent speech and language technologies, development of software and chip products, provision of speech information services, and integration of E-government systems. The intelligent speech technology of iFLYTEK, the core technology of the company, represents the top level in the world. + \t上传内容为:\n\t#ABNF 1.0 gb2312;\n\tlanguage zh-CN;\n\tmode voice;\n\troot $main;\n\t$main = $place1 到$place2 ;\n\t$place1 = 北京 | 武汉 | 南京 | 天津 | 东京;\n\t$place2 = 上海 | 合肥; + \t您可以说:\n\t今天的天气怎么样?\n\t北京到上海的火车?\n\t有什么好吃的?\n\t上海外滩有哪些酒店?\n\n\t更多语义请登录:\n\thttp://osp.voicecloud.cn/ \n\t配置您的专属语义吧! + + 请开始说话… + 开始音频流识别 + 上传联系人 + 上传用户词表 + 上传成功 + 词表下载失败或内容为空 + 下载成功 + iat_show + 显示听写界面 + 结果动态修正 + + 取消语音 + + + 本地合成 + 在线合成 + + + local + cloud + + + 小燕—女青、中英、普通话 + 小宇—男青、中英、普通话 + 凯瑟琳—女青、英 + 亨利—男青、英 + 玛丽—女青、英 + 小研—女青、中英、普通话 + 小琪—女青、中英、普通话 + 小峰—男青、中英、普通话 + 小梅—女青、中英、粤语 + 小莉—女青、中英、台湾普通话 + 小蓉—女青、中、四川话 + 小芸—女青、中、东北话 + 小坤—男青、中、河南话 + 小强—男青、中、湖南话 + 小莹—女青、中、陕西话 + 小新—男童、中、普通话 + 楠楠—女童、中、普通话 + 老孙—男老、中、普通话 + + + xiaoyan + xiaoyu + catherine + henry + vimary + vixy + xiaoqi + vixf + xiaomei + xiaolin + xiaorong + xiaoqian + xiaokun + xiaoqiang + vixying + xiaoxin + nannan + vils + + + 正常 + 高兴 + 悲伤 + 生气 + + + neutral + happy + sad + angry + + + 通话 + 系统 + 铃声 + 音乐 + 闹铃 + 通知 + + + 0 + 1 + 2 + 3 + 4 + 5 + + 缓冲进度为%d%%,播放进度为%d%% + + + 普通话 + 粤语 + 河南话 + 英语 + + + mandarin + cantonese + henanese + en_us + + + "[word]\napple\nbanana\norange" + "The quick brown fox jumps over the lazy dog." + "知,痴,是" + "磁铁,率领,脆弱,动手,古筝" + "一座座雪峰插入云霄,峰顶银光闪闪,大大小小的湖泊,像颗颗宝石镶嵌在彩带般的沟谷中。" + + 英语 + 汉语 + + + en_us + zh_cn + + + 单字 + 词语 + 句子 + + + read_syllable + read_word + read_sentence + + + plain + complete + + + + 有标点 + 无标点 + + + 1 + 0 + + + 开启 + 关闭 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/assets/call.bnf b/src/android/assets/call.bnf new file mode 100644 index 0000000..c1cfc60 --- /dev/null +++ b/src/android/assets/call.bnf @@ -0,0 +1,12 @@ +#BNF+IAT 1.0 UTF-8; +!grammar call; +!slot ; +!slot ; +!slot ; +!slot ; +!start ; +:[][]|[][]; +:张海洋; +:我要|我想|我想要; +:打电话; +:给; \ No newline at end of file diff --git a/src/android/assets/grammar_sample.abnf b/src/android/assets/grammar_sample.abnf new file mode 100644 index 0000000..0868c79 --- /dev/null +++ b/src/android/assets/grammar_sample.abnf @@ -0,0 +1,8 @@ +#ABNF 1.0 UTF-8; +language zh-CN; +mode voice; + +root $main; +$main = $place1 到 $place2; +$place1 = 北京|武汉|南京|天津|东京; +$place2 = 上海|合肥; \ No newline at end of file diff --git a/src/android/assets/iattest.wav b/src/android/assets/iattest.wav new file mode 100644 index 0000000..fcee567 Binary files /dev/null and b/src/android/assets/iattest.wav differ diff --git a/src/android/assets/iflytek/recognize.xml b/src/android/assets/iflytek/recognize.xml new file mode 100644 index 0000000..003dccf Binary files /dev/null and b/src/android/assets/iflytek/recognize.xml differ diff --git a/src/android/assets/iflytek/voice_bg.9.png b/src/android/assets/iflytek/voice_bg.9.png new file mode 100644 index 0000000..217f9dc Binary files /dev/null and b/src/android/assets/iflytek/voice_bg.9.png differ diff --git a/src/android/assets/iflytek/voice_empty.png b/src/android/assets/iflytek/voice_empty.png new file mode 100644 index 0000000..08ffc43 Binary files /dev/null and b/src/android/assets/iflytek/voice_empty.png differ diff --git a/src/android/assets/iflytek/voice_full.png b/src/android/assets/iflytek/voice_full.png new file mode 100644 index 0000000..4bf5bbc Binary files /dev/null and b/src/android/assets/iflytek/voice_full.png differ diff --git a/src/android/assets/iflytek/waiting.png b/src/android/assets/iflytek/waiting.png new file mode 100644 index 0000000..d13bb33 Binary files /dev/null and b/src/android/assets/iflytek/waiting.png differ diff --git a/src/android/assets/iflytek/warning.png b/src/android/assets/iflytek/warning.png new file mode 100644 index 0000000..48150ff Binary files /dev/null and b/src/android/assets/iflytek/warning.png differ diff --git a/src/android/assets/keys b/src/android/assets/keys new file mode 100644 index 0000000..34039f1 Binary files /dev/null and b/src/android/assets/keys differ diff --git a/src/android/assets/userwords b/src/android/assets/userwords new file mode 100644 index 0000000..7c107cc --- /dev/null +++ b/src/android/assets/userwords @@ -0,0 +1 @@ +{"userword":[{"name":"我的常用词","words":["佳晨实业","蜀南庭苑","高兰路","复联二"]},{"name":"我的好友","words":["李馨琪","鹿晓雷","张集栋","周家莉","叶震珂","熊泽萌"]}]} \ No newline at end of file diff --git a/src/android/libs/Msc.jar b/src/android/libs/Msc.jar new file mode 100644 index 0000000..3bcdb57 Binary files /dev/null and b/src/android/libs/Msc.jar differ diff --git a/src/android/libs/Sunflower.jar b/src/android/libs/Sunflower.jar new file mode 100644 index 0000000..786d584 Binary files /dev/null and b/src/android/libs/Sunflower.jar differ diff --git a/src/android/libs/arm64-v8a/libmsc.so b/src/android/libs/arm64-v8a/libmsc.so new file mode 100644 index 0000000..02d73a3 Binary files /dev/null and b/src/android/libs/arm64-v8a/libmsc.so differ diff --git a/src/android/libs/armeabi-v7a/libmsc.so b/src/android/libs/armeabi-v7a/libmsc.so new file mode 100644 index 0000000..89b8c27 Binary files /dev/null and b/src/android/libs/armeabi-v7a/libmsc.so differ diff --git a/src/android/libs/armeabi/libmsc.so b/src/android/libs/armeabi/libmsc.so new file mode 100644 index 0000000..89b8c27 Binary files /dev/null and b/src/android/libs/armeabi/libmsc.so differ diff --git a/src/android/res/layout/activity_xunfei_dialog.xml b/src/android/res/layout/activity_xunfei_dialog.xml new file mode 100644 index 0000000..ab8ed1a --- /dev/null +++ b/src/android/res/layout/activity_xunfei_dialog.xml @@ -0,0 +1,7 @@ + + + + diff --git a/src/android/res/values/strings.xml b/src/android/res/values/strings.xml new file mode 100644 index 0000000..c963166 --- /dev/null +++ b/src/android/res/values/strings.xml @@ -0,0 +1,155 @@ + + XunfeiSpeaking + + + 584e7225 + 本示例为讯飞语音Android平台开发者提供语音听写、语法识别、语义理解和语音合成等代码样例,旨在让用户能够依据该示例快速开发出基于语音接口的应用程序。 + 科大讯飞作为中国最大的智能语音技术提供商,在智能语音技术领域有着长期的研究积累,并在中文语音合成、语音识别、口语评测等多项技术上拥有国际领先的成果。科大讯飞是我国唯一以语音技术为产业化方向的“国家863计划成果产业化基地”… + iFLYTEK is a national key software enterprise dedicated to the research of intelligent speech and language technologies, development of software and chip products, provision of speech information services, and integration of E-government systems. The intelligent speech technology of iFLYTEK, the core technology of the company, represents the top level in the world. + \t上传内容为:\n\t#ABNF 1.0 gb2312;\n\tlanguage zh-CN;\n\tmode voice;\n\troot $main;\n\t$main = $place1 到$place2 ;\n\t$place1 = 北京 | 武汉 | 南京 | 天津 | 东京;\n\t$place2 = 上海 | 合肥; + \t您可以说:\n\t今天的天气怎么样?\n\t北京到上海的火车?\n\t有什么好吃的?\n\t上海外滩有哪些酒店?\n\n\t更多语义请登录:\n\thttp://osp.voicecloud.cn/ \n\t配置您的专属语义吧! + + 请开始说话… + 开始音频流识别 + 上传联系人 + 上传用户词表 + 上传成功 + 词表下载失败或内容为空 + 下载成功 + iat_show + 显示听写界面 + 结果动态修正 + + + + 本地合成 + 在线合成 + + + local + cloud + + + 小燕—女青、中英、普通话 + 小宇—男青、中英、普通话 + 凯瑟琳—女青、英 + 亨利—男青、英 + 玛丽—女青、英 + 小研—女青、中英、普通话 + 小琪—女青、中英、普通话 + 小峰—男青、中英、普通话 + 小梅—女青、中英、粤语 + 小莉—女青、中英、台湾普通话 + 小蓉—女青、中、四川话 + 小芸—女青、中、东北话 + 小坤—男青、中、河南话 + 小强—男青、中、湖南话 + 小莹—女青、中、陕西话 + 小新—男童、中、普通话 + 楠楠—女童、中、普通话 + 老孙—男老、中、普通话 + + + xiaoyan + xiaoyu + catherine + henry + vimary + vixy + xiaoqi + vixf + xiaomei + xiaolin + xiaorong + xiaoqian + xiaokun + xiaoqiang + vixying + xiaoxin + nannan + vils + + + 正常 + 高兴 + 悲伤 + 生气 + + + neutral + happy + sad + angry + + + 通话 + 系统 + 铃声 + 音乐 + 闹铃 + 通知 + + + 0 + 1 + 2 + 3 + 4 + 5 + + 缓冲进度为%d%%,播放进度为%d%% + + + 普通话 + 粤语 + 河南话 + 英语 + + + mandarin + cantonese + henanese + en_us + + + "[word]\napple\nbanana\norange" + "The quick brown fox jumps over the lazy dog." + "知,痴,是" + "磁铁,率领,脆弱,动手,古筝" + "一座座雪峰插入云霄,峰顶银光闪闪,大大小小的湖泊,像颗颗宝石镶嵌在彩带般的沟谷中。" + + 英语 + 汉语 + + + en_us + zh_cn + + + 单字 + 词语 + 句子 + + + read_syllable + read_word + read_sentence + + + plain + complete + + + + 有标点 + 无标点 + + + 1 + 0 + + + 开启 + 关闭 + + diff --git a/src/android/res/xml/iat_setting.xml b/src/android/res/xml/iat_setting.xml new file mode 100644 index 0000000..d5a66c7 --- /dev/null +++ b/src/android/res/xml/iat_setting.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + diff --git a/src/android/res/xml/ise_settings.xml b/src/android/res/xml/ise_settings.xml new file mode 100644 index 0000000..473f44a --- /dev/null +++ b/src/android/res/xml/ise_settings.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + diff --git a/src/android/res/xml/tts_setting.xml b/src/android/res/xml/tts_setting.xml new file mode 100644 index 0000000..dc42482 --- /dev/null +++ b/src/android/res/xml/tts_setting.xml @@ -0,0 +1,29 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/android/res/xml/understand_setting.xml b/src/android/res/xml/understand_setting.xml new file mode 100644 index 0000000..fc36110 --- /dev/null +++ b/src/android/res/xml/understand_setting.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/android/src/com/thomas/xunfeilistenspeaking/IatSettings.java b/src/android/src/com/thomas/xunfeilistenspeaking/IatSettings.java new file mode 100644 index 0000000..09536ed --- /dev/null +++ b/src/android/src/com/thomas/xunfeilistenspeaking/IatSettings.java @@ -0,0 +1,39 @@ +package com.thomas.xunfeilistenspeaking; + +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.PreferenceActivity; +import android.view.Window; +import com.thomas.xunfeilistenspeaking.SettingTextWatcher; + +/** + * 听写设置界面 + */ +public class IatSettings extends PreferenceActivity implements OnPreferenceChangeListener { + + public static final String PREFER_NAME = "com.iflytek.setting"; + private EditTextPreference mVadbosPreference; + private EditTextPreference mVadeosPreference; + + @SuppressWarnings("deprecation") + public void onCreate(Bundle savedInstanceState) { + requestWindowFeature(Window.FEATURE_NO_TITLE); + super.onCreate(savedInstanceState); + getPreferenceManager().setSharedPreferencesName(PREFER_NAME); +// addPreferencesFromResource(R.xml.iat_setting); + addPreferencesFromResource(getResources().getIdentifier("iat_setting","xml",getPackageName())); + + mVadbosPreference = (EditTextPreference)findPreference("iat_vadbos_preference"); + mVadbosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this,mVadbosPreference,0,10000)); + + mVadeosPreference = (EditTextPreference)findPreference("iat_vadeos_preference"); + mVadeosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this,mVadeosPreference,0,10000)); + } + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return true; + } + +} diff --git a/src/android/src/com/thomas/xunfeilistenspeaking/JsonParser.java b/src/android/src/com/thomas/xunfeilistenspeaking/JsonParser.java new file mode 100644 index 0000000..5b2a452 --- /dev/null +++ b/src/android/src/com/thomas/xunfeilistenspeaking/JsonParser.java @@ -0,0 +1,95 @@ +package com.thomas.xunfeilistenspeaking; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONTokener; + +/** + * Json结果解析类 + */ +public class JsonParser { + + public static String parseIatResult(String json) { + StringBuffer ret = new StringBuffer(); + try { + JSONTokener tokener = new JSONTokener(json); + JSONObject joResult = new JSONObject(tokener); + + JSONArray words = joResult.getJSONArray("ws"); + for (int i = 0; i < words.length(); i++) { + // 转写结果词,默认使用第一个结果 + JSONArray items = words.getJSONObject(i).getJSONArray("cw"); + JSONObject obj = items.getJSONObject(0); + ret.append(obj.getString("w")); +// 如果需要多候选结果,解析数组其他字段 +// for(int j = 0; j < items.length(); j++) +// { +// JSONObject obj = items.getJSONObject(j); +// ret.append(obj.getString("w")); +// } + } + } catch (Exception e) { + e.printStackTrace(); + } + return ret.toString(); + } + + public static String parseGrammarResult(String json) { + StringBuffer ret = new StringBuffer(); + try { + JSONTokener tokener = new JSONTokener(json); + JSONObject joResult = new JSONObject(tokener); + + JSONArray words = joResult.getJSONArray("ws"); + for (int i = 0; i < words.length(); i++) { + JSONArray items = words.getJSONObject(i).getJSONArray("cw"); + for(int j = 0; j < items.length(); j++) + { + JSONObject obj = items.getJSONObject(j); + if(obj.getString("w").contains("nomatch")) + { + ret.append("没有匹配结果."); + return ret.toString(); + } + ret.append("【结果】" + obj.getString("w")); + ret.append("【置信度】" + obj.getInt("sc")); + ret.append("\n"); + } + } + } catch (Exception e) { + e.printStackTrace(); + ret.append("没有匹配结果."); + } + return ret.toString(); + } + + public static String parseLocalGrammarResult(String json) { + StringBuffer ret = new StringBuffer(); + try { + JSONTokener tokener = new JSONTokener(json); + JSONObject joResult = new JSONObject(tokener); + + JSONArray words = joResult.getJSONArray("ws"); + for (int i = 0; i < words.length(); i++) { + JSONArray items = words.getJSONObject(i).getJSONArray("cw"); + for(int j = 0; j < items.length(); j++) + { + JSONObject obj = items.getJSONObject(j); + if(obj.getString("w").contains("nomatch")) + { + ret.append("没有匹配结果."); + return ret.toString(); + } + ret.append("【结果】" + obj.getString("w")); + ret.append("\n"); + } + } + ret.append("【置信度】" + joResult.optInt("sc")); + + } catch (Exception e) { + e.printStackTrace(); + ret.append("没有匹配结果."); + } + return ret.toString(); + } +} diff --git a/src/android/src/com/thomas/xunfeilistenspeaking/SettingTextWatcher.java b/src/android/src/com/thomas/xunfeilistenspeaking/SettingTextWatcher.java new file mode 100644 index 0000000..420a394 --- /dev/null +++ b/src/android/src/com/thomas/xunfeilistenspeaking/SettingTextWatcher.java @@ -0,0 +1,71 @@ +package com.thomas.xunfeilistenspeaking; + +import android.content.Context; +import android.preference.EditTextPreference; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.widget.Toast; + +import java.util.regex.Pattern; + +/** + * 输入框输入范围控制 + */ +public class SettingTextWatcher implements TextWatcher { + private int editStart ; + private int editCount ; + private EditTextPreference mEditTextPreference; + int minValue;//最小值 + int maxValue;//最大值 + private Context mContext; + + public SettingTextWatcher(Context context, EditTextPreference e, int min, int max) { + mContext = context; + mEditTextPreference = e; + minValue = min; + maxValue = max; + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { +// Log.e("demo", "onTextChanged start:"+start+" count:"+count+" before:"+before); + editStart = start; + editCount = count; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count,int after) { +// Log.e("demo", "beforeTextChanged start:"+start+" count:"+count+" after:"+after); + } + + @Override + public void afterTextChanged(Editable s) { + if (TextUtils.isEmpty(s)) { + return; + } + String content = s.toString(); +// Log.e("demo", "content:"+content); + if (isNumeric(content)) { + int num = Integer.parseInt(content); + if (num > maxValue || num < minValue) { + s.delete(editStart, editStart+editCount); + mEditTextPreference.getEditText().setText(s); + Toast.makeText(mContext, "超出有效值范围", Toast.LENGTH_SHORT).show(); + } + }else { + s.delete(editStart, editStart+editCount); + mEditTextPreference.getEditText().setText(s); + Toast.makeText(mContext, "只能输入数字哦", Toast.LENGTH_SHORT).show(); + } + } + + /** + * 正则表达式-判断是否为数字 + */ + public static boolean isNumeric(String str){ + Pattern pattern = Pattern.compile("[0-9]*"); + return pattern.matcher(str).matches(); + } + +}; diff --git a/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiDialogActivity.java b/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiDialogActivity.java new file mode 100644 index 0000000..78ce2e2 --- /dev/null +++ b/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiDialogActivity.java @@ -0,0 +1,299 @@ +package com.thomas.xunfeilistenspeaking; + +import android.app.Activity; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.util.Log; +import android.widget.Toast; +import com.iflytek.cloud.*; +import com.iflytek.cloud.ui.RecognizerDialog; +import com.iflytek.cloud.ui.RecognizerDialogListener; +import com.iflytek.sunflower.FlowerCollector; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.LinkedHashMap; + +/** + * Created by Thomas.Wang on 2017/2/10. + */ +public class XunfeiDialogActivity extends Activity{ + + private static String TAG = XunfeiDialogActivity.class.getSimpleName(); + // 语音听写对象 + private SpeechRecognizer mIat; + // 语音听写UI + private RecognizerDialog mIatDialog; + // 用HashMap存储听写结果 + private HashMap mIatResults = new LinkedHashMap(); + + // private EditText mResultText; + private Toast mToast; + private SharedPreferences mSharedPreferences; + // 引擎类型 + private String mEngineType = SpeechConstant.TYPE_CLOUD; + + + private Handler mHandler = new Handler(); + private boolean isShowDialog; + private String punc = "1"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getResources().getIdentifier("activity_xunfei_dialog","layout",getPackageName())); + + isShowDialog = getIntent().getBooleanExtra("isShowDialog",false); + punc = getIntent().getStringExtra("punc"); + mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); + mIat = SpeechRecognizer.createRecognizer(this, mInitListener); + + // 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer + // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源 + mIatDialog = new RecognizerDialog(this, mInitListener); + mIatDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + finishThisActivity(RESULT_CANCELED,getString(getId("xunfei_cancel_listen","string"))); + } + }); + mSharedPreferences = getSharedPreferences(IatSettings.PREFER_NAME, + Activity.MODE_PRIVATE); + startListen(); + } + + private void stopListen(){ + if (mIat.isListening()) { + mIat.stopListening(); + } + } + private void startListen() { + if (mIat.isListening()) { + mIat.stopListening(); + } + // 移动数据分析,收集开始听写事件 + FlowerCollector.onEvent(this, "iat_recognize"); + mIatResults.clear(); + // 设置参数 + setParam(); + +// boolean isShowDialog = true; + if (isShowDialog) { + // 显示听写对话框 + mIatDialog.setListener(mRecognizerDialogListener); + mIatDialog.show(); +// showTip(this.getString(getId("text_begin","string"))); + }else { + // 不显示听写对话框 + ret = mIat.startListening(mRecognizerListener); + if (ret != ErrorCode.SUCCESS) { +// showTip("听写失败,错误码:" + ret); + finishThisActivity(RESULT_CANCELED,"听写失败,错误码:" + ret); + } else { +// showTip(this.getString(getId("text_begin","string"))); + } + } + + + } + private int getId(String idName,String type){ + return getResources().getIdentifier(idName, type,getPackageName()); + } + + + private void showTip(final String str) { + mHandler.post(new Runnable() { + @Override + public void run() { + mToast.setText(str); + mToast.show(); + } + }); + } + + int ret = 0; // 函数调用返回值 + /** + * 听写UI监听器 + */ + private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() { + public void onResult(RecognizerResult results, boolean isLast) { + printResult(results,isLast); + } + + /** + * 识别回调错误. + */ + public void onError(SpeechError error) { +// showTip(error.getPlainDescription(true)); + finishThisActivity(RESULT_CANCELED,error.getPlainDescription(true)); + } + }; + + private void finishThisActivity(int type ,String str){ + Intent resultIntent = new Intent(); + Bundle bundle = new Bundle(); + bundle.putString("result", str); + resultIntent.putExtras(bundle); + setResult(type, resultIntent); + finish(); + } + + /** + * 初始化监听器。 + */ + private InitListener mInitListener = new InitListener() { + + @Override + public void onInit(int code) { + Log.d(TAG, "SpeechRecognizer init() code = " + code); + if (code != ErrorCode.SUCCESS) { + showTip("初始化失败,错误码:" + code); + } + } + }; + + /** + * 听写监听器。 + */ + private RecognizerListener mRecognizerListener = new RecognizerListener() { + + @Override + public void onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 +// showTip("开始说话"); + } + + @Override + public void onError(SpeechError error) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。 +// showTip(error.getPlainDescription(true)); + finishThisActivity(RESULT_CANCELED,error.getPlainDescription(true)); + } + + @Override + public void onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 +// showTip("结束说话"); + + } + + @Override + public void onResult(RecognizerResult results, boolean isLast) { + Log.d(TAG, results.getResultString()); + printResult(results,isLast); + + } + + + @Override + public void onVolumeChanged(int volume, byte[] data) { +// showTip("当前正在说话,音量大小:" + volume); +// showTip("当前正在说话..."); +// Log.d(TAG, "返回音频数据:" + data.length); + } + + @Override + public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null +// if (SpeechEvent.EVENT_SESSION_ID == eventType) { +// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); +// Log.d(TAG, "session id =" + sid); +// } + + } + }; + + private void printResult(RecognizerResult results,boolean isLast) { + String text = JsonParser.parseIatResult(results.getResultString()); + String sn = null; + // 读取json结果中的sn字段 + try { + JSONObject resultJson = new JSONObject(results.getResultString()); + sn = resultJson.optString("sn"); + } catch (JSONException e) { + e.printStackTrace(); + } + mIatResults.put(sn, text); + StringBuffer resultBuffer = new StringBuffer(); + for (String key : mIatResults.keySet()) { + resultBuffer.append(mIatResults.get(key)); + } + Log.d(TAG, "音频中文:" + resultBuffer.toString()); +// mResultText.setText(resultBuffer.toString()); +// mResultText.setSelection(mResultText.length()); + if (isLast){ + Intent resultIntent = new Intent(); + Bundle bundle = new Bundle(); + bundle.putString("result", resultBuffer.toString()); + resultIntent.putExtras(bundle); + this.setResult(RESULT_OK, resultIntent); + finish(); + } + + } + + /** + * 参数设置 + * + * @param + * @return + */ + public void setParam() { + // 清空参数 + mIat.setParameter(SpeechConstant.PARAMS, null); + + // 设置听写引擎 + mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType); + // 设置返回结果格式 + mIat.setParameter(SpeechConstant.RESULT_TYPE, "json"); + + String lag = mSharedPreferences.getString("iat_language_preference", + "mandarin"); + if (lag.equals("en_us")) { + // 设置语言 + mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); + } else { + // 设置语言 + mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); + // 设置语言区域 + mIat.setParameter(SpeechConstant.ACCENT, lag); + } + + // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 + mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000")); + + // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音 + mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000")); + + // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 +// mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1")); +// mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", punc)); + mIat.setParameter(SpeechConstant.ASR_PTT, punc); + + // 设置听写结果是否结果动态修正,为“1”则在听写过程中动态递增地返回结果,否则只在听写结束之后返回最终结果 + // 注:该参数暂时只对在线听写有效 +// mIat.setParameter(SpeechConstant.ASR_DWA, mSharedPreferences.getString("iat_dwa_preference", "0")); + + // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 + // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 + mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav"); + mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav"); + } + + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mIatDialog.isShowing()){ + mIatDialog.dismiss(); + } + } +} diff --git a/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiListenSpeaking.java b/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiListenSpeaking.java new file mode 100644 index 0000000..22d9aa1 --- /dev/null +++ b/src/android/src/com/thomas/xunfeilistenspeaking/XunfeiListenSpeaking.java @@ -0,0 +1,399 @@ +package com.thomas.xunfeilistenspeaking; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.util.Log; +import android.widget.Toast; +import com.iflytek.cloud.*; +import com.iflytek.sunflower.FlowerCollector; +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaPlugin; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.LinkedHashMap; + +/** + * Created by Thomas.Wang on 17/2/9. + */ +public class XunfeiListenSpeaking extends CordovaPlugin{ + private static String TAG = XunfeiListenSpeaking.class.getSimpleName(); + private Context context; + private CallbackContext callbackContext; + private Toast mToast; + private Handler mHandler = new Handler(); + + private SpeechSynthesizer mTts; + + // 语音听写对象 + private SpeechRecognizer mIat; + + private SharedPreferences mSharedPreferences; + // 引擎类型 + private String mEngineType = SpeechConstant.TYPE_CLOUD; + // 用HashMap存储听写结果 + private HashMap mIatResults = new LinkedHashMap(); + @Override + protected void pluginInitialize() { + super.pluginInitialize(); + context = cordova.getActivity(); +// SpeechUtility.createUtility(context, SpeechConstant.APPID +"=584e7225"); + SpeechUtility.createUtility(context, SpeechConstant.APPID +"="+context.getString(getId("app_id","string"))); + } + + private int getId(String idName,String type){ + return context.getResources().getIdentifier(idName, type,context.getPackageName()); + } + private static final int DIALOG_ACTIVIT_CODE = 0; + @Override + public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { + + this.callbackContext = callbackContext; + //开始听写 + if (action.equals("startListen")){ +// boolean isShowDialog = args.getBoolean(0); + +// String punc = args.getBoolean(1)?"1":"0"; + boolean isShowDialog ; + try { + isShowDialog = args.getBoolean(0); + }catch (Exception e){ + isShowDialog = true; + } + String punc; + try{ + punc = args.getBoolean(1)?"1":"0"; + }catch (Exception e){ + punc = "1"; + } + if (isShowDialog){ + Intent intent = new Intent(); + intent.setClass(context, XunfeiDialogActivity.class); + intent.putExtra("isShowDialog",isShowDialog); + intent.putExtra("punc",punc); + cordova.startActivityForResult( this,intent, DIALOG_ACTIVIT_CODE); + }else { + startListenWidthNotDialog(punc); + } + + + return true; + } + + //停止听写 + if (action.equals("stopListen")) { + stopListen(); + return true; + } + + + //开始听写 + if (action.equals("startSpeak")){ + mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT); + String speakMessage = args.getString(0).trim(); + startSpeak(speakMessage); + return true; + } + //停止说话 + if (action.equals("stopSpeak")){ + stopSpeak(); + return true; + } + + //暂停 + if (action.equals("pauseSpeaking")){ + pauseSpeaking(); + return true; + } + //继续 + if (action.equals("resumeSpeaking")){ + resumeSpeaking(); + return true; + } + + return false; + } + + + private void stopListen(){ + if (mIat!=null&&mIat.isListening()) { + mIat.stopListening(); + } + } + int ret = 0; // 函数调用返回值 + private void startListenWidthNotDialog(String punc){ + mIat = SpeechRecognizer.createRecognizer(context, mInitListener); + mSharedPreferences = context.getSharedPreferences(IatSettings.PREFER_NAME, + Activity.MODE_PRIVATE); + if (mIat.isListening()) { + mIat.stopListening(); + } + // 移动数据分析,收集开始听写事件 + FlowerCollector.onEvent(context, "iat_recognize"); + mIatResults.clear(); + // 设置参数 + setParam(punc); + + + // 不显示听写对话框 + ret = mIat.startListening(mRecognizerListener); + if (ret != ErrorCode.SUCCESS) { +// showTip("听写失败,错误码:" + ret); +// finishThisActivity(RESULT_CANCELED,"听写失败,错误码:" + ret); + callbackContext.error("听写失败,错误码:" + ret); + + } else { +// showTip(this.getString(getId("text_begin","string"))); + } + + + + } + + /** + * 初始化监听器。 + */ + private InitListener mInitListener = new InitListener() { + + @Override + public void onInit(int code) { + Log.d(TAG, "SpeechRecognizer init() code = " + code); + if (code != ErrorCode.SUCCESS) { + showTip("初始化失败,错误码:" + code); + } + } + }; + + /** + * 听写监听器。 + */ + private RecognizerListener mRecognizerListener = new RecognizerListener() { + + @Override + public void onBeginOfSpeech() { + // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入 +// showTip("开始说话"); + } + + @Override + public void onError(SpeechError error) { + // Tips: + // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。 + // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。 +// showTip(error.getPlainDescription(true)); +// finishThisActivity(RESULT_CANCELED,error.getPlainDescription(true)); + callbackContext.error(error.getPlainDescription(true)); + } + + @Override + public void onEndOfSpeech() { + // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入 +// showTip("结束说话"); + + } + + @Override + public void onResult(RecognizerResult results, boolean isLast) { + Log.d(TAG, results.getResultString()); + + printResult(results,isLast); + + } + + + @Override + public void onVolumeChanged(int volume, byte[] data) { +// showTip("当前正在说话,音量大小:" + volume); +// showTip("当前正在说话..."); +// Log.d(TAG, "返回音频数据:" + data.length); + } + + @Override + public void onEvent(int eventType, int arg1, int arg2, Bundle obj) { + // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因 + // 若使用本地能力,会话id为null +// if (SpeechEvent.EVENT_SESSION_ID == eventType) { +// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID); +// Log.d(TAG, "session id =" + sid); +// } + + } + }; + + private void printResult(RecognizerResult results, boolean isLast) { + String text = JsonParser.parseIatResult(results.getResultString()); + String sn = null; + // 读取json结果中的sn字段 + try { + JSONObject resultJson = new JSONObject(results.getResultString()); + sn = resultJson.optString("sn"); + } catch (JSONException e) { + e.printStackTrace(); + } + mIatResults.put(sn, text); + StringBuffer resultBuffer = new StringBuffer(); + for (String key : mIatResults.keySet()) { + resultBuffer.append(mIatResults.get(key)); + } + Log.d(TAG, "音频中文:" + resultBuffer.toString()); +// mResultText.setText(resultBuffer.toString()); +// mResultText.setSelection(mResultText.length()); +// Intent resultIntent = new Intent(); +// Bundle bundle = new Bundle(); +// bundle.putString("result", resultBuffer.toString()); +// resultIntent.putExtras(bundle); +// this.setResult(RESULT_OK, resultIntent); +// finish(); + if (isLast) + callbackContext.success(resultBuffer.toString()); + } + + /** + * 参数设置 + * + * @param + * @return + */ + public void setParam(String punc) { + // 清空参数 + mIat.setParameter(SpeechConstant.PARAMS, null); + + // 设置听写引擎 + mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType); + // 设置返回结果格式 + mIat.setParameter(SpeechConstant.RESULT_TYPE, "json"); + + String lag = mSharedPreferences.getString("iat_language_preference", + "mandarin"); + if (lag.equals("en_us")) { + // 设置语言 + mIat.setParameter(SpeechConstant.LANGUAGE, "en_us"); + } else { + // 设置语言 + mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); + // 设置语言区域 + mIat.setParameter(SpeechConstant.ACCENT, lag); + } + + // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 + mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000")); + + // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音 + mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000")); + + // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 +// mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1")); +// mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", punc)); + mIat.setParameter(SpeechConstant.ASR_PTT, punc); + + // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限 + // 注:AUDIO_FORMAT参数语记需要更新版本才能生效 + mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav"); + mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav"); + } + + + private void resumeSpeaking(){ + mTts.resumeSpeaking(); + } + private void pauseSpeaking(){ + mTts.pauseSpeaking(); + } + + private void stopSpeak(){ + if(mTts!=null&&mTts.isSpeaking()){ + mTts.stopSpeaking(); + } + } + + private void startSpeak(String speakMessage) { + setSpeakParameter(); + if (mTts.isSpeaking()){ + mTts.stopSpeaking(); + } + mTts.startSpeaking(speakMessage, mSynListener); + + } + + private void setSpeakParameter(){ + if (mTts==null){ + //1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener + mTts = SpeechSynthesizer.createSynthesizer(context, null); + //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类 + mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人 + mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 + mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100 + mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端 + //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm” + //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限 + //如果不需要保存合成音频,注释该行代码 + mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm"); + //3.开始合成 + // mTts.startSpeaking("科大讯飞,让世界聆听我们的声音", mSynListener); + } + } + //合成监听器 + private SynthesizerListener mSynListener = new SynthesizerListener(){ + //会话结束回调接口,没有错误时,error为null + public void onCompleted(SpeechError error) { + if (error == null) { +// showTip("播放完成"); + callbackContext.success("播放完成"); + } else if (error != null) { + showTip(error.getPlainDescription(true)); + callbackContext.error(error.getPlainDescription(true)); + } + } + //缓冲进度回调 + //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。 + public void onBufferProgress(int percent, int beginPos, int endPos, String info) {} + //开始播放 + public void onSpeakBegin() { + +// showTip("开始播放"); + } + //暂停播放 + public void onSpeakPaused() {} + //播放进度回调 + //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置. + public void onSpeakProgress(int percent, int beginPos, int endPos) {} + //恢复播放回调接口 + public void onSpeakResumed() {} + //会话事件回调接口 + public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {} + }; + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case DIALOG_ACTIVIT_CODE: + if(resultCode == Activity.RESULT_OK){ + Bundle bundle = data.getExtras(); + callbackContext.success(bundle.getString("result")); + }else if (resultCode == Activity.RESULT_CANCELED){ + Bundle bundle = data.getExtras(); + callbackContext.error(bundle.getString("result")); + } + break; + } + } + private void showTip(final String str) { + mHandler.post(new Runnable() { + @Override + public void run() { + mToast.setText(str); + mToast.show(); + } + }); + } + + +} diff --git a/src/ios/CDVSpeech.h b/src/ios/CDVSpeech.h new file mode 100644 index 0000000..527587b --- /dev/null +++ b/src/ios/CDVSpeech.h @@ -0,0 +1,36 @@ +// +// CDVSpeech.h +// ZJxunfeiDemo-OC +// +// Created by Edc.zhang on 2017/2/13. +// Copyright © 2017年 Edc.zhang. All rights reserved. +// + +#import + +#import + +//#import "iflyMSC/iflyMSC.h" +#import "iflyMSC.framework/Headers/IFlyMSC.h" + + +@interface CDVSpeech : CDVPlugin { + +} +@property (nonatomic, copy) NSString* appId; +@property (nonatomic, strong) NSString* callbackId; +@property (nonatomic, strong) IFlySpeechRecognizer* recognizer; +@property (nonatomic, strong) IFlySpeechSynthesizer* synthesizer; +@property(nonatomic,strong) IFlyRecognizerView *iflyRecognizerView; + + +- (void)startListening:(CDVInvokedUrlCommand*)command; +- (void)stopListening:(CDVInvokedUrlCommand*)command; +- (void)cancelListening:(CDVInvokedUrlCommand*)command; + +- (void)startSpeaking:(CDVInvokedUrlCommand*)command; +- (void)pauseSpeaking:(CDVInvokedUrlCommand*)command; +- (void)resumeSpeaking:(CDVInvokedUrlCommand*)command; +- (void)stopSpeaking:(CDVInvokedUrlCommand*)command; + +@end diff --git a/src/ios/CDVSpeech.m b/src/ios/CDVSpeech.m new file mode 100644 index 0000000..56146da --- /dev/null +++ b/src/ios/CDVSpeech.m @@ -0,0 +1,343 @@ +// +// CDVSpeech.m +// ZJxunfeiDemo-OC +// +// Created by Edc.zhang on 2017/2/13. +// Copyright © 2017年 Edc.zhang. All rights reserved. +// + + +#import "CDVSpeech.h" + +#define STR_EVENT @"event" +#define STR_CODE @"code" +#define STR_MESSAGE @"message" +#define STR_VOLUME @"volume" +#define STR_RESULTS @"results" +#define STR_PROGRESS @"progress" + +// always replace the appid and the SDK with what you get from voicecloud.cn +#define SPEECH_APP_ID @"589d270d" + + +@interface CDVSpeech() +- (void) fireEvent:(NSString*)event; +@end + +#import "CDVSpeech.h" + +@implementation CDVSpeech +- (void)login:(CDVInvokedUrlCommand*)command +{ + self.callbackId = command.callbackId; + + self.appId = SPEECH_APP_ID; + + NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",self.appId]; + [IFlySpeechUtility createUtility:initString]; + +} + +#pragma mark - 语音录入 +- (void)startListening:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: startListening"); + NSDictionary* options = [command.arguments objectAtIndex:0]; + // withDefault:[NSNull null]]; + //是否有UI弹窗 +// BOOL isShowDialog = [command.arguments objectAtIndex:1]; + NSString *isShowDialog = [NSString stringWithFormat:@"%@",[command.arguments objectAtIndex:1]]; + NSString *isShowPunc = [NSString stringWithFormat:@"%@",[command.arguments objectAtIndex:2]]; + if ([isShowDialog isEqualToString:@"0"]) { + if (!self.recognizer){ + self.recognizer = [IFlySpeechRecognizer sharedInstance]; + self.recognizer.delegate = self; + [self.recognizer setParameter:@"iat" forKey:@"domain"]; + [self.recognizer setParameter:@"16000" forKey:@"sample_rate"]; + [self.recognizer setParameter:@"700" forKey:@"vad_eos"]; + [self.recognizer setParameter:@"0" forKey:@"plain_result"]; + [self.recognizer setParameter:@"asr.pcm" forKey:@"asr_audio_path"]; + //是否显示标点 + if ([isShowPunc isEqualToString:@"0"]) { + [self.recognizer setParameter:@"0" forKey:@"asr_ptt"]; + } + NSLog(@"Speech :: createRecognizer"); + } + if ((NSNull *)options != [NSNull null]) { + NSArray *keys = [options allKeys]; + for (NSString *key in keys) { + NSString *value = [options objectForKey:key]; + [self.recognizer setParameter:value forKey:key]; + } + } + + //判断当前是否正在听 若正在识别则先停止 再开始听 + if ([self.recognizer isListening]) { + [self.recognizer stopListening]; + } + [self.recognizer startListening]; + + }else{ + //初始化语音识别控件 + UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; + self.iflyRecognizerView = [[IFlyRecognizerView alloc] initWithCenter:keyWindow.center]; + self.iflyRecognizerView.delegate = self; + [self.iflyRecognizerView setParameter: @"iat" forKey: [IFlySpeechConstant IFLY_DOMAIN]]; + //asr_audio_path保存录音文件名,如不再需要,设置value为nil表示取消,默认目录是documents + [self.iflyRecognizerView setParameter:@"asrview.pcm " forKey:[IFlySpeechConstant ASR_AUDIO_PATH]]; + if ([isShowPunc isEqualToString:@"0"]) { + [self.iflyRecognizerView setParameter:@"0" forKey:@"asr_ptt"]; + } + [self.iflyRecognizerView start]; + } +} + +- (void)stopListening:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: stopListening"); + [self.recognizer stopListening]; +} + +- (void)cancelListening:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: cancelListening"); + [self.recognizer cancel]; + [self.iflyRecognizerView cancel]; +} + + +#pragma mark - 语音朗读 +- (void)startSpeaking:(CDVInvokedUrlCommand*)command +{ + NSString* text = [command.arguments objectAtIndex:0]; + NSDictionary* options = [command.arguments objectAtIndex:1]; + // withDefault:[NSNull null]]; + NSLog(@"Speech :: startSpeaking - %@", text); + // [self.commandDelegate runInBackground:^{ + if (!self.synthesizer){ + self.synthesizer = [IFlySpeechSynthesizer sharedInstance]; + self.synthesizer.delegate = self; + + [self.synthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];//合成的语速,取值范围 0~100 + [self.synthesizer setParameter:@"80" forKey:[IFlySpeechConstant VOLUME]];//合成的音量;取值范围 0~100 + [self.synthesizer setParameter:@"vixr" forKey:[IFlySpeechConstant VOICE_NAME]];//发音人,默认为”xiaoyan” + + [self.synthesizer setParameter:@"8000" forKey: [IFlySpeechConstant SAMPLE_RATE]];//音频采样率,目前支持的采样率有 16000 和 8000; + [self.synthesizer setParameter:@"tts.pcm" forKey: [IFlySpeechConstant TTS_AUDIO_PATH]]; + + NSLog(@"Speech :: createSynthesizer"); + } + if ((NSNull *)options != [NSNull null]) { + NSArray *keys = [options allKeys]; + for (NSString *key in keys) { + NSString *value = [options objectForKey:key]; + [self.synthesizer setParameter:value forKey:key]; + } + } + + if ([self.synthesizer isSpeaking]) { + [self.synthesizer stopSpeaking]; + } + [self.synthesizer startSpeaking:text]; + // }]; +} + +#pragma mark - 暂停语音朗读 +- (void)pauseSpeaking:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: pauseSpeaking"); + [self.synthesizer pauseSpeaking]; +} + +#pragma mark - 继续语音朗读 +- (void)resumeSpeaking:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: resumeSpeaking"); + [self.synthesizer resumeSpeaking]; +} + +#pragma mark - 停止语音朗读 +- (void)stopSpeaking:(CDVInvokedUrlCommand*)command +{ + NSLog(@"Speech :: stopSpeaking"); + [self.synthesizer stopSpeaking]; +} + + +#pragma mark IFlyRecognizerViewDelegate + + /*! 有UI + * IFlyRecognizerViewDelegate 回调返回识别结果 + * + * @param resultArray 识别结果,NSArray的第一个元素为NSDictionary,NSDictionary的key为识别结果,sc为识别结果的置信度 + * @param isLast -[out] 是否最后一个结果 + */ + - (void)onResult:(NSArray *)resultArray isLast:(BOOL) isLast{ + + NSLog(@"Speech :: onResults - %@", resultArray); + if (self.callbackId) { + NSMutableString *text = [[NSMutableString alloc] init]; + NSDictionary *dic = [resultArray objectAtIndex:0]; + for (NSString *key in dic) { + [text appendFormat:@"%@",key]; + } + NSLog(@"Recognize Result: %@",text); + + // NSString * resultFromJson = [ISRDataHelper stringFromJson:text]; + // + // NSLog(@"---------%@",resultFromJson); + + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"SpeechResults",STR_EVENT,text,STR_RESULTS, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } + } + + +/*! 无UI + * IFlySpeechRecognizerDelegate 识别结果回调 + * 在识别过程中可能会多次回调此函数,你最好不要在此回调函数中进行界面的更改等操作,只需要将回调的结果保存起来。 + * 使用results的示例如下: + *

+ *  - (void) onResults:(NSArray *) results{
+ *     NSMutableString *result = [[NSMutableString alloc] init];
+ *     NSDictionary *dic = [results objectAtIndex:0];
+ *     for (NSString *key in dic){
+ *        [result appendFormat:@"%@",key];//合并结果
+ *     }
+ *   }
+ *  
+ * + * @param results -[out] 识别结果,NSArray的第一个元素为NSDictionary,NSDictionary的key为识别结果,sc为识别结果的置信度。 + * @param isLast -[out] 是否最后一个结果 + */ +- (void) onResults:(NSArray *) results isLast:(BOOL)isLast{ + NSLog(@"Speech :: onResults - %@", results); + if (self.callbackId) { + NSMutableString *text = [[NSMutableString alloc] init]; + NSDictionary *dic = [results objectAtIndex:0]; + for (NSString *key in dic) { + [text appendFormat:@"%@",key]; + } + NSLog(@"Recognize Result: %@",text); + + // NSString * resultFromJson = [ISRDataHelper stringFromJson:text]; + // + // NSLog(@"---------%@",resultFromJson); + + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"SpeechResults",STR_EVENT,text,STR_RESULTS, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + +/*! + * IFlySpeechRecognizerDelegate 音量变化回调 + * 在录音过程中,回调音频的音量。 + * + * @param volume -[out] 音量,范围从0-30 + */ + +- (void) onVolumeChanged:(int)volume +{ + NSLog(@"Speech :: onVolumeChanged - %d", volume); + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"VolumeChanged",STR_EVENT,[NSNumber numberWithInt:volume],STR_VOLUME, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + + + /*! + * 识别结束回调 + * + * @param error 识别结束错误码 + */ + - (void)onError: (IFlySpeechError *) error{ + NSLog(@"Speech :: onError - %d", error.errorCode); + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"11SpeechError",STR_EVENT,[NSNumber numberWithInt:error.errorCode],STR_CODE,error.errorDesc,STR_MESSAGE, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } + } + + +#pragma mark IFlySpeechSynthesizerDelegate +- (void) onCompleted:(IFlySpeechError*)error +{ + NSLog(@"Speech :: onCompleted - %d", error.errorCode); + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"SpeakCompleted",STR_EVENT,[NSNumber numberWithInt:error.errorCode],STR_CODE,error.errorDesc,STR_MESSAGE, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + +- (void) onSpeakBegin +{ + NSLog(@"Speech :: onSpeakBegin"); + [self fireEvent:@"SpeakBegin"]; +} + +- (void) onBufferProgress:(int)progress message:(NSString *)msg +{ + NSLog(@"Speech :: onBufferProgress - %d", progress); + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"BufferProgress",STR_EVENT,[NSNumber numberWithInt:progress],STR_PROGRESS,msg,STR_MESSAGE, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + +- (void) onSpeakProgress:(int)progress +{ + NSLog(@"Speech :: onSpeakProgress - %d", progress); + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:@"SpeakProgress",STR_EVENT,[NSNumber numberWithInt:progress],STR_PROGRESS, nil]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + +- (void) onSpeakPaused +{ + NSLog(@"Speech :: onSpeakPaused"); + [self fireEvent:@"SpeakPaused"]; +} + +- (void) onSpeakResumed +{ + NSLog(@"Speech :: onSpeakResumed"); + [self fireEvent:@"SpeakResumed"]; +} + +- (void) onSpeakCancel +{ + NSLog(@"Speech :: onSpeakCancel"); + [self fireEvent:@"SpeakCancel"]; +} + +- (void) fireEvent:(NSString*)event +{ + if (self.callbackId) { + NSDictionary* info = [NSDictionary dictionaryWithObject:event forKey:STR_EVENT]; + CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:info]; + [result setKeepCallbackAsBool:YES]; + [self.commandDelegate sendPluginResult:result callbackId:self.callbackId]; + } +} + + + + + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyContact.h b/src/ios/iflyMSC.framework/Headers/IFlyContact.h new file mode 100644 index 0000000..22d4878 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyContact.h @@ -0,0 +1,27 @@ +// +// IFlyContact.h +// msc +// +// Created by ypzhao on 13-3-1. +// Copyright (c) 2013年 IFLYTEK. All rights reserved. +// + +#import + +/*! + * 此接口为获取通信录中的联系人 + * 获取联系人是为了在进行语音识别时(sms)能更好的识别出您说的人名,联系人上传是属于个性化的 + * 一部分. + */ +@interface IFlyContact : NSObject + +/*! + * 获取联系人 + * 调用此方法需要添加 AddressBook.framework 到工程中,调用此方法后可以直接将通信录中的联系 + * 人转化为语音云识别的数据结构。您可以将获取的数据通过IFlyDataUploader类,上传到语音云,我们 + * 只获取通信录中的人名 + * + * @return 返回联系人信息 + */ +- (NSString *) contact; +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyDataUploader.h b/src/ios/iflyMSC.framework/Headers/IFlyDataUploader.h new file mode 100644 index 0000000..1ffb6c8 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyDataUploader.h @@ -0,0 +1,54 @@ +// +// IFlyDataUploader.h +// MSC +// +// Created by ypzhao on 13-4-8. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + + +@class IFlySpeechError; + +/*! + * 数据上传类 + */ +@interface IFlyDataUploader : NSObject + +/*! + * 数据名称 + */ +@property(nonatomic,copy) NSString *dataName; +/*! + * 数据 + */ +@property(nonatomic,copy) NSString *data; + +/*! + * 上传完成回调 + * + * @param result 结果 + * @param error 错误码 + */ +typedef void(^IFlyUploadDataCompletionHandler)(NSString* result,IFlySpeechError * error); + +/*! + * 上传数据 + * 此函数用于上传数据,下载的过程是**异步**的。 + * + * @param completionHandler -[in] 上传完成回调 + * @param name -[in] 上传的内容名称,名称最好和你要上传的数据内容相关,不可以为nil + * @param data -[in] 上传的数据,以utf8编码,不可以为nil + */ +- (void) uploadDataWithCompletionHandler:(IFlyUploadDataCompletionHandler)completionHandler name:(NSString *)name data:(NSString *)data; + +/*! + * 设置上传数据参数 + * + * @param parameter 参数值 + * @param key 参数名 + */ +-(void) setParameter:(NSString*) parameter forKey:(NSString*) key; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyDebugLog.h b/src/ios/iflyMSC.framework/Headers/IFlyDebugLog.h new file mode 100644 index 0000000..9cf2987 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyDebugLog.h @@ -0,0 +1,37 @@ +// +// IFlyDebugLog.h +// MSC + +// description: 程序中的log处理类 + +// Created by ypzhao on 12-11-22. +// Copyright (c) 2012年 iflytek. All rights reserved. +// + +#import + +/*! + * 调试信息 + */ +@interface IFlyDebugLog : NSObject + +/*! + * 打印调试信息 + * + * @param format -[in] 要打印的内容格式 + * @param ... -[in] 要打印的内容 + */ ++ (void) showLog:(NSString *)format, ...; + +/*! + * 将log写入文件中 + */ ++ (void) writeLog; + +/*! + * 设置是否显示log + * + * @param showLog YES:显示;NO:不显示 + */ ++ (void) setShowLog:(BOOL) showLog; +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyISVDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlyISVDelegate.h new file mode 100644 index 0000000..a3c4e8c --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyISVDelegate.h @@ -0,0 +1,48 @@ +// +// IFlyISVDelegate.h +// msc_UI +// +// Created by admin on 14-9-15. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + + +#import + +@class IFlySpeechError; + +/** + * 声纹回调协议 + */ +@protocol IFlyISVDelegate + +/** + * 声纹结果回调 + * + * @param dic 结果 + */ +-(void) onResult:(NSDictionary *)dic; + +/** + * 错误码回调 + * + * @param errorCode 错误码 + */ +-(void) onError:(IFlySpeechError *) errorCode; + +@optional + +/** + * 等待结果 + */ +-(void) onRecognition; + +/** + * 音量改变回调 + * + * @param volume 音量值 + */ +-(void) onVolumeChanged: (int)volume; + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlyISVRecognizer.h b/src/ios/iflyMSC.framework/Headers/IFlyISVRecognizer.h new file mode 100644 index 0000000..c7e3bef --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyISVRecognizer.h @@ -0,0 +1,134 @@ +// +// IFlyISVRecognizer.h +// ISV +// +// Created by wangdan on 14-9-6. +// Copyright (c) 2014年 IFlyTEK. All rights reserved. +// + + +#import +#import "IFlyISVDelegate.h" + +/** + * 声纹接口类 + */ +@interface IFlyISVRecognizer : NSObject +{ + +} +@property (assign) id delegate; + + + +/* + * FlyISVRecognizer is a kind of Singleton calss + * the function can be used as below: + IFLyISVRecognizer *recognizer=[IFlyISVRecognizer creteRecognizer: self]; + */ + ++(instancetype) sharedInstance; + + +/* + * genrerate a serial number password + * princeple: + 1.number serial has no 1 in itself; + 2.the nuber serial has no same number("98765432"is right while "99876543" is wrong) + * @length: the serial number's length,length of "98765432" is 8, + generally length is 8 and other value is forbidden + */ + +-(NSString*) generatePassword:(int)length; + + + +/* + * Used to get password from server + * @pwdt: + when pwdt is 1,the function will return chinese text; + while pwdt is 2, the funciton will return number serial + */ + +-(NSArray*) getPasswordList:(int)pwdt; + + +/* + * Used to judge if the engine is running in listenning + * return value: + YES: the engine is listenning; + No : the engine is not listenning + */ +-(BOOL) isListening; + + + +/* + * Used to query or delete the voiceprint model in server + * @cmd: + "del": delete model + "que": query model + * @authid: user id ,can be @"tianxia" or other; + * @pwdt: voiceprint type + 1: fixed txt voiceprint code ,like @"我的地盘我做主" + 2: free voiceprint code , user can speek anything,but 5 times + trainning the speech shall be same + 3: number serial voiceprint code ,like @"98765432" and so on + * @ptxt: voiceprint txt,only fixed voiceprint and number serial have this, + in free voiceprint model this param shall be set nil + * @vid: another voiceprint type model,user can use this to query or delete + model in server can be @"jakillasdfasdjjjlajlsdfhdfdsadff",totally 32 bits; + * NOTES: + when vid is not nil,then the server will judge the vid first + while the vid is nil, server can still query or delete the voiceprint model + by other params + */ +-(BOOL) sendRequest:(NSString*)cmd authid:(NSString *)auth_id pwdt:(int)pwdt ptxt:(NSString *)ptxt vid:(NSString *)vid err:(int *)err; + + +/* + * set the voiceprint params + * @"sst" : @"train" or @"verify" + * @"auth_id" : @"tianxia" or ther + * @"sub" : @"ivp" + * @"ptxt" : + * @"rgn" : @"5" + * @"pwdt" : @"1",or @"2", or @"3" + * @"auf" : @"audio/L16;rate=16000" or @"audio/L16;rate=8000" + * @"vad_enable : @"1" or @"0" + * @"vad_timeout" : @"3000" + * @"vad_speech_tail": @"100" + */ +-(BOOL) setParameter:(NSString *)value forKey:(NSString *)key; + + + +/* + * get the voiceprint params + * used the same as function of setParameter + */ +-(NSString*) getParameter:(NSString *)key; + + +/* + * start recording + */ +-(void) startListening; + + +/* + * stop recording + */ +-(void) stopListening; + + +/* + * cancel recording,like function stopListening + */ +-(void) cancel; /* cancel recognization */ + + + + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlyMSC.h b/src/ios/iflyMSC.framework/Headers/IFlyMSC.h new file mode 100644 index 0000000..65e62be --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyMSC.h @@ -0,0 +1,42 @@ +// +// IFlyMSC.h +// msc +// +// Created by 张剑 on 15/1/14. +// Copyright (c) 2015年 iflytek. All rights reserved. +// + +#ifndef MSC_IFlyMSC_h +#define MSC_IFlyMSC_h + +#import "IFlyContact.h" +#import "IFlyDataUploader.h" +#import "IFlyDebugLog.h" +#import "IFlyISVDelegate.h" +#import "IFlyISVRecognizer.h" +#import "IFlyRecognizerView.h" +#import "IFlyRecognizerViewDelegate.h" +#import "IFlyResourceUtil.h" +#import "IFlySetting.h" +#import "IFlySpeechConstant.h" +#import "IFlySpeechError.h" +#import "IFlySpeechEvaluator.h" +#import "IFlySpeechEvaluatorDelegate.h" +#import "IFlySpeechEvent.h" +#import "IFlySpeechRecognizer.h" +#import "IFlySpeechRecognizerDelegate.h" +#import "IFlySpeechSynthesizer.h" +#import "IFlySpeechSynthesizerDelegate.h" +#import "IFlySpeechUnderstander.h" +#import "IFlySpeechUtility.h" +#import "IFlyTextUnderstander.h" +#import "IFlyUserWords.h" +#import "IFlyPcmRecorder.h" +#import "IFlySpeechEvaluator.h" +#import "IFlySpeechEvaluatorDelegate.h" + +#import "IFlyVoiceWakeuper.h" +#import "IFlyVoiceWakeuperDelegate.h" + + +#endif diff --git a/src/ios/iflyMSC.framework/Headers/IFlyPcmRecorder.h b/src/ios/iflyMSC.framework/Headers/IFlyPcmRecorder.h new file mode 100644 index 0000000..5cb9d64 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyPcmRecorder.h @@ -0,0 +1,104 @@ +// +// IFlyPcmRecorder.h +// MSC + +// description: + +// Created by ypzhao on 12-11-15. +// Copyright (c) 2012年 iflytek. All rights reserved. +// + +#import + +#import +#import +#import +#import +#import + + +@class IFlyPcmRecorder; + +/** + * 录音协议 + */ +@protocol IFlyPcmRecorderDelegate + +/** + * 回调音频数据 + * + * @param buffer 音频数据 + * @param size 表示音频的长度 + */ +- (void) onIFlyRecorderBuffer: (const void *)buffer bufferSize:(int)size; + +/** + * 回调音频的错误码 + * + * @param recoder 录音器 + * @param error 错误码 + */ +- (void) onIFlyRecorderError:(IFlyPcmRecorder*)recoder theError:(int) error; + +@optional + +/** + * 回调录音音量 + * + * @param power 音量值 + */ +- (void) onIFlyRecorderVolumeChanged:(int) power; + +@end + + +/** + * 录音封装 + */ +@interface IFlyPcmRecorder : NSObject + +/** + * 录音委托对象 + */ +@property (assign) id delegate; + +/** + * 单例模式 + * + * @return 返回录音对象单例 + */ ++ (instancetype) sharedInstance; + +/** + * 开始录音 + * + * @return 开启录音成功返回YES,否则返回NO + */ +- (BOOL) start; + +/** + * 停止录音 + */ +- (void) stop; + +/** + * 设置音频采样率 + * + * @param rate -[in] 采样率,8k/16k + */ +- (void) setSample:(NSString *) rate; + +/* + * 设置录音时间间隔参数 + */ +- (void) setPowerCycle:(float) cycle; + +/** + * 保存录音 + * + * @param savePath 音频保存路径 + */ +-(void) setSaveAudioPath:(NSString *)savePath; + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlyRecognizerView.h b/src/ios/iflyMSC.framework/Headers/IFlyRecognizerView.h new file mode 100644 index 0000000..3b67472 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyRecognizerView.h @@ -0,0 +1,137 @@ +// +// IFlyRecognizerView.h +// MSC +// +// Created by admin on 13-4-16. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + + +@protocol IFlyRecognizerViewDelegate ; + +/*! + * 语音识别控件 + * 录音时触摸控件结束录音,开始识别(相当于旧版的停止);触摸其他位置,取消录音,结束会话(取消) + * 出错时触摸控件,重新开启会话(相当于旧版的再说一次);触摸其他位置,取消录音,结束会话(取消) + * + */ +@interface IFlyRecognizerView : UIView + +/*! + * 设置委托对象 + */ +@property(nonatomic,assign)id delegate; + +/*! + * 初始化控件 + * + * @param origin 控件左上角的坐标 + * + * @return IFlyRecognizerView 对象 + */ +- (id)initWithOrigin:(CGPoint)origin; + +/*! + * 初始化控件 + * + * @param center 控件中心的坐标 + * + * @return IFlyRecognizerView 对象 + */ +- (id) initWithCenter:(CGPoint)center; + +/*! + * 设置横竖屏自适应 + * + * @param autoRotate 默认值YES,横竖屏自适应 + */ +- (void) setAutoRotate:(BOOL)autoRotate; + +/* + * | ------------- |----------------------------------------------------------- + * | 参数 | 描述 + * | ------------- |----------------------------------------------------------- + * | domain |应用的领域: 取值为:iat、search、video、poi、music、asr; + * | | iat:普通文本听写; + * | | search:热词搜索; + * | | video:视频音乐搜索; + * | | asr:关键词识别; + * | ------------- |----------------------------------------------------------- + * | vad_bos |前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms; + * | | engine指定iat识别默认值为5000; + * | | 其他情况默认值为 4000,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | vad_eos |后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, + * | | 自动停止录音;单位:ms; + * | | sms 识别默认值为 1800; + * | | 其他默认值为 700,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | sample_rate |采样率:目前支持的采样率设置有 16000 和 8000。 + * | ------------- |----------------------------------------------------------- + * | asr_ptt |标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。 + * | ------------- |----------------------------------------------------------- + * | result_type |返回结果的数据格式: 可设置为json,xml,plain,默认为json。 + * | ------------- |----------------------------------------------------------- + * | grammarID |识别的语法id: 只针对 domain 设置为”asr”的应用。 + * | ------------- |----------------------------------------------------------- + * | asr_audio_path|音频文件名: 设置此参数后,将会自动保存识别的录音文件。 + * | | 路径为Documents/(指定值)。 + * | | 不设置或者设置为nil,则不保存音频。 + * | ------------- |----------------------------------------------------------- + * | params |扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。 + * | ------------- |----------------------------------------------------------- + * + */ + +/*! + * 设置识别引擎的参数 + * 识别的引擎参数(key)取值如下: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
*参数描述
domain应用的领域: 取值为:iat、search、video、poi、music、asr;
iat:普通文本听写;
search:热词搜索;
video:视频音乐搜索;
video:视频音乐搜索;
asr:关键词识别;
vad_bos前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms;
engine指定iat识别默认值为5000;
其他情况默认值为 4000,范围 0-10000。
vad_eos后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入,
自动停止录音;单位:ms;
sms 识别默认值为 1800;
其他默认值为 700,范围 0-10000。
sample_rate采样率:目前支持的采样率设置有 16000 和 8000。
asr_ptt标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。
result_type返回结果的数据格式: 可设置为json,xml,plain,默认为json。
grammarID识别的语法id: 只针对 domain 设置为”asr”的应用。
asr_audio_path音频文件名: 设置此参数后,将会自动保存识别的录音文件。
路径为Documents/(指定值)。
不设置或者设置为nil,则不保存音频。
params扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。
+ * @param value 参数对应的取值 + * @param key 识别引擎参数 + * + * @return 成功返回YES;失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/*! + * 获取识别引擎参数 + * + * @param key 参数key + * + * @return 参数值 + */ +-(NSString*) parameterForKey:(NSString *)key; + +/*! + * 开始识别 + * + * @return 成功返回YES;失败返回NO + */ +- (BOOL)start; + +/*! + * 取消本次识别 + */ +- (void)cancel; + + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyRecognizerViewDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlyRecognizerViewDelegate.h new file mode 100644 index 0000000..07c2035 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyRecognizerViewDelegate.h @@ -0,0 +1,36 @@ +// +// IFlyRecognizerDelegate.h +// MSC +// +// Created by admin on 13-4-16. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + +@class IFlyRecognizerView; +@class IFlySpeechError; + +/*! + * 识别回调委托 + */ +@protocol IFlyRecognizerViewDelegate + +/*! + * 回调返回识别结果 + * + * @param resultArray 识别结果,NSArray的第一个元素为NSDictionary,NSDictionary的key为识别结果,sc为识别结果的置信度 + * @param isLast -[out] 是否最后一个结果 + */ +- (void)onResult:(NSArray *)resultArray isLast:(BOOL) isLast; + +/*! + * 识别结束回调 + * + * @param error 识别结束错误码 + */ +- (void)onError: (IFlySpeechError *) error; + +@optional + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyResourceUtil.h b/src/ios/iflyMSC.framework/Headers/IFlyResourceUtil.h new file mode 100644 index 0000000..c824a63 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyResourceUtil.h @@ -0,0 +1,90 @@ +// +// IFlyResourceUtil.h +// MSCDemo +// +// Created by admin on 14-6-20. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + +#import + +/*! + * 资源工具类 + */ +@interface IFlyResourceUtil : NSObject + +/*! + * 获取通过MSPSetParam,启动引擎的标识 + * + * @return 通过MSPSetParam,启动引擎的标识 + */ ++(NSString*) ENGINE_START; + +/*! + * 获取通过MSPSetParam,销毁引擎的标识 + * + * @return 通过MSPSetParam,销毁引擎的标识 + */ ++(NSString*) ENGINE_DESTROY; + +/*! + * 获取识别引擎的资源目录标识 + * + * @return 识别引擎的资源目录标识 + */ ++(NSString*) ASR_RES_PATH; + +/*! + * 得到语法构建目录 + * + * @return 语法构建目录 + */ ++(NSString*) GRM_BUILD_PATH; + +/*! + * 获取合成引擎的资源目录标识,同时需要先传入voice_name方可生效 + * + * @return 合成引擎的资源目录标识,同时需要先传入voice_name方可生效 + */ ++(NSString*) TTS_RES_PATH; + +/*! + * 获取唤醒资源的资源目录标识 + * + * @return 唤醒资源的资源目录标识 + */ ++(NSString*) IVW_RES_PATH; + +/*! + * 语法类型 + * + * @return 语法类型 + */ ++(NSString*) GRAMMARTYPE; + +/*! + * 语记SDK专用参数,用于设置本地默认资源路径 + * + * @return 本地默认资源路径key字符串 + */ ++(NSString*) PLUS_LOCAL_DEFAULT_RES_PATH; + +#pragma mark - +/*! + * 资源存放路径 + * + * @param path 设置的路径 + * + * @return 资源目录 + */ ++(NSString*) generateResourcePath:(NSString *)path; + +/** + * 获得离线发音人对应的id + * + * @param voiceName 发音人名称 + * + * @return 有,发音人对应的id;无,返回nil + */ ++(NSString*) identifierForVoiceName:(NSString*)voiceName; +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySetting.h b/src/ios/iflyMSC.framework/Headers/IFlySetting.h new file mode 100644 index 0000000..c19f245 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySetting.h @@ -0,0 +1,93 @@ +// +// IFlySetting.h +// MSC +// +// Created by iflytek on 13-4-12. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + +/*! + * 日志打印等级 + */ +typedef NS_OPTIONS(NSInteger, LOG_LEVEL){ + /*! + * 全部打印 + */ + LVL_ALL = -1, + /*! + * 高,异常分析需要的级别 + */ + LVL_DETAIL = 31, + /*! + * 中,打印基本日志信息 + */ + LVL_NORMAL = 15, + /*! + * 低,只打印主要日志信息 + */ + LVL_LOW = 7, + /*! + * 不打印 + */ + LVL_NONE = 0 +}; + +/*! + * 此接口为iflyMSC sdk 配置接口。 + * 可以获取版本号,设置日志打印等级等 + */ +@interface IFlySetting : NSObject + +/*! + * 获取版本号 + * + * @return 版本号 + */ ++ (NSString *) getVersion; + +/*! + * 获取日志等级 + * + * @return 返回日志等级 + */ ++ (LOG_LEVEL) logLvl; + +/*! + * 是否打印控制台log + * 在软件发布时,建议关闭此log。 + * + * @param showLog -[in] YES,打印log;NO,不打印 + */ ++ (void) showLogcat:(BOOL) showLog; + +/*! + * 设置日志msc.log生成路径以及日志等级 + * + * + * + * + * + * + * + * + * + * + * + * + *
*日志打印等级描述
LVL_ALL全部打印
LVL_DETAIL高,异常分析需要的级别
LVL_NORMAL中,打印基本日志信息
LVL_LOW低,只打印主要日志信息
LVL_NONE不打印
+ * + * @param level -[in] 日志打印等级 + */ ++ (void) setLogFile:(LOG_LEVEL) level; + +/*! + * 设置日志文件的路径 + * 日志文件默认存放在Documents目录。 + * + * @param path -[in] 日志文件的全路径 + */ ++ (void) setLogFilePath:(NSString*) path; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechConstant.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechConstant.h new file mode 100644 index 0000000..1507d79 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechConstant.h @@ -0,0 +1,851 @@ +// +// IFlySpeechConstant.h +// MSCDemo +// +// Created by iflytek on 5/9/14. +// Copyright (c) 2014 iflytek. All rights reserved. +// + +#import + +/*! + * 公共常量类 + * 主要定义参数的key value值 + */ +@interface IFlySpeechConstant : NSObject + + +#pragma mark - 通用参数key + +/*! + * 语音应用ID + * 通过开发者网站申请 + * + * @return 语音应用IDkey + */ ++(NSString*)APPID; + + +/*! + * 语言区域。 + * + * @return 语言区域key。 + */ ++(NSString*)ACCENT; + +/*! + * 语言区域。 + * + * @return 普通话value。 + */ ++(NSString*)ACCENT_MANDARIN; + +/*! + * 语言区域。 + * + * @return 河南话value。 + */ ++(NSString*)ACCENT_HENANESE; + +/*! + * 语言区域。 + * + * @return 粤语value。 + */ ++(NSString*)ACCENT_CANTONESE; + +/*! + * 语言 + * 支持:zh_cn,zh_tw,en_us
+ * + * @return 语言key + */ ++(NSString*)LANGUAGE; + +/*! + * 语言 + * + * @return 中文value + */ ++(NSString*)LANGUAGE_CHINESE; + + +/*! + * 语言 + * + * @return 中文台湾value + */ ++(NSString*)LANGUAGE_CHINESE_TW; + +/*! + * 语言 + * + * @return 英文value + */ ++(NSString*)LANGUAGE_ENGLISH; + +/*! + * 返回结果的数据格式, + * 可设置为json,xml,plain,默认为json。 + * + * @return 返回结果的数据格式key + */ ++(NSString*)RESULT_TYPE; + +/*! + * 应用领域。 + * + * @return 应用领域key + */ ++(NSString*)IFLY_DOMAIN; + +/*! + * 个性化数据上传类型 + * + * @return 个性化数据上传类型key + */ ++(NSString*)DATA_TYPE; + +/*! + * 语音输入超时时间 + * 单位:ms,默认30000 + * + * @return 语音输入超时时间key + */ ++(NSString*)SPEECH_TIMEOUT; + +/*! + * 网络连接超时时间 + * 单位:ms,默认20000 + * + * @return 网络连接超时时间key + */ ++(NSString*)NET_TIMEOUT; + +/*! + * 业务类型。 + * + * @return 业务类型key。 + */ ++(NSString*)SUBJECT; + +/*! + * 扩展参数。 + * + * @return 扩展参数key。 + */ ++(NSString*)PARAMS; + +/** + * 加密参数 + * + * 支持类型:ssl 加密 tcp 非加密 默认:tcp + * 建议对安全性要求较高时使用ssl。 + * + * @return 加密参数key + */ ++(NSString*)PROT_TYPE; + +/** + * ssl证书内容 + * + * @return ssl证书内容key + */ ++(NSString*)SSL_CERT; + +/*! + * 录音音量返回时间间隔。 + * + * @return 间隔key。 + */ ++(NSString*)POWER_CYCLE; + +/*! + * 合成、识别、唤醒、评测、声纹等业务采样率。 + * + * @return 合成及识别采样率key。 + */ ++(NSString*)SAMPLE_RATE; + +/*! + * 合成、识别、唤醒、评测、声纹等业务采样率。 + * + * @return 合成及识别采样率8K Value。 + */ ++(NSString*)SAMPLE_RATE_8K; + +/*! + * 合成、识别、唤醒、评测、声纹等业务采样率。 + * + * @return 合成及识别采样率16K Value。 + */ ++(NSString*)SAMPLE_RATE_16K; + +/*! + * 引擎类型。 + * 可选:local,cloud,auto + * 默认:auto + * + * @return 引擎类型key。 + */ ++(NSString*)ENGINE_TYPE; + +/*! + * 本地识别引擎。 + * + * @return 本地识别引擎value。 + */ ++(NSString*)TYPE_LOCAL; + +/*! + * 云端识别引擎。 + * + * @return 云端识别引擎value。 + */ ++(NSString*)TYPE_CLOUD; + +/*! + * 混合识别引擎。 + * + * @return 混合识别引擎value。 + */ ++(NSString*)TYPE_MIX; + +/*! + * 引擎根据当前配置进行选择。 + * + * @return 引擎根据当前配置进行选择value。 + */ ++(NSString*)TYPE_AUTO; + +/*! + * 输入文本编码格式。 + * + * @return 编码格式key。 + */ ++(NSString*)TEXT_ENCODING; + +/*! + * 结果编码格式。 + * + * @return 结果编码格式key。 + */ ++(NSString*)RESULT_ENCODING; + +/** + * 是否初始化播放器 + * SDK内部播放器采用音频队列实现,有部分外部需求需要自定义音频队列,可以通过此开关控制 + * 0:不初始化,非0或者参数为空:初始化,默认初始化 + * @return 是否初始化播放器 参数key + */ ++(NSString*)PLAYER_INIT; + +/** + * 是否初始化录音器 + * SDK内部录音器采用音频队列实现,有部分外部需求需要自定义音频队列,可以通过此开关控制 + * 0:不初始化,非0或者参数为空:初始化,默认初始化 + * @return 是否初始化录音器 参数key + */ ++(NSString*)RECORDER_INIT; + +#pragma mark - 合成相关设置key +/*! + * 语速 + * 范围 (0~100) 默认值:50 + * + * @return 语速key + */ ++(NSString*)SPEED; + +/*! + * 音调 + * 范围(0~100)默认值:50 + * + * @return 音调key + */ ++(NSString*)PITCH; + +/*! + * 合成录音保存路径 + * + * @return 合成录音保存路径key + * @注意 只需要设置文件名则可,会自动拼接到IFlySetting setLogFilePath接口设置的目录后 + */ ++(NSString*)TTS_AUDIO_PATH; + +/** + * 启用VAD功能 + * + * @return 启用VAD功能key + */ ++(NSString*)VAD_ENABLE; + +/*! + * VAD前端点超时 + * 范围:0-10000(单位ms) + * + * @return VAD前端点超时key + */ ++(NSString*)VAD_BOS; + +/*! + * VAD后端点超时 。 + * 可选范围:0-10000(单位ms) + * + * @return VAD后端点超时key + */ ++(NSString*)VAD_EOS; + + +/* + * 云端支持如下发音人: + * 对于网络TTS的发音人角色,不同引擎类型支持的发音人不同,使用中请注意选择。 + * + * |--------|----------------| + * | 发音人 | 参数 | + * |--------|----------------| + * | 小燕 | xiaoyan | + * |--------|----------------| + * | 小宇 | xiaoyu | + * |--------|----------------| + * | 凯瑟琳 | catherine | + * |--------|----------------| + * | 亨利 | henry | + * |--------|----------------| + * | 玛丽 | vimary | + * |--------|----------------| + * | 小研 | vixy | + * |--------|----------------| + * | 小琪 | vixq | + * |--------|----------------| + * | 小峰 | vixf | + * |--------|----------------| + * | 小梅 | vixl | + * |--------|----------------| + * | 小莉 | vixq | + * |--------|----------------| + * | 小蓉 | vixr | + * |--------|----------------| + * | 小芸 | vixyun | + * |--------|----------------| + * | 小坤 | vixk | + * |--------|----------------| + * | 小强 | vixqa | + * |--------|----------------| + * | 小莹 | vixyin | + * |--------|----------------| + * | 小新 | vixx | + * |--------|----------------| + * | 楠楠 | vinn | + * |--------|----------------| + * | 老孙 | vils | + * |--------|----------------| + */ + +/*! + * 发音人 + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
*云端发音人名称参数
小燕xiaoyan
小宇xiaoyu
凯瑟琳catherine
亨利henry
玛丽vimary
小研vixy
小琪vixq
小峰vixf
小梅vixl
小莉vixq
小蓉(四川话)vixr
小芸vixyun
小坤vixk
小强vixqa
小莹vixying
小新vixx
楠楠vinn
老孙vils
+ * + * @return 发音人key + */ ++(NSString*)VOICE_NAME; + +/*! + * 发音人ID key。 + * @return 发音人ID key + */ ++(NSString*)VOICE_ID; + +/*! + * 发音人语种 key。 + * 参数值:0:Auto 1:中文 2英文 ,默认 0. + * @return 发音人ID key + */ ++(NSString*)VOICE_LANG; + +/*! + * 音量 + * 范围(0~100) 默认值:50 + * + * @return 音量key + */ ++(NSString*)VOLUME ; + +/*! + * 合成音频播放缓冲时间 + * 即缓冲多少秒音频后开始播放,如tts_buffer_time=1000; + * 默认缓冲1000ms毫秒后播放。 + * + * @return 合成音频播放缓冲时间缓冲时间key + */ ++(NSString*)TTS_BUFFER_TIME ; + +/** 合成数据即时返回 + */ + +/** + * 合成数据是否即时返回 + * 是否需要数据回调,为1时,当合成一段音频会通过onEvent回调返回,直接合成结束; + * 设置为1为即时返回;0为非即时返回;默认值为0; + * + * @return 成数据即时返回key + */ ++(NSString*)TTS_DATA_NOTIFY; + +/** + * 预合成文本 + * + * @return 预合成文本参数key + */ ++(NSString*)NEXT_TEXT; + +/** + * 是否需要打开MPPlayingInfocenter + * 是否需要初始化MPPlayerCenter的属性;0:需要初始化,1:不初始化 + * + * @return 是否需要打开MPPlayingInfocenter 参数key + */ ++(NSString*)MPPLAYINGINFOCENTER; + +#pragma mark - 识别、听写、语义相关设置key + +/*! + * 录音源 + * 录音时的录音方式,默认为麦克风,设置为1; + * 如果需要外部送入音频,设置为-1,通过WriteAudio接口送入音频。 + * + * @return 录音源key + */ ++(NSString*)AUDIO_SOURCE; + +/*! + * 识别录音保存路径 + * + * @return 识别录音保存路径key + */ ++(NSString*) ASR_AUDIO_PATH; + +/*! + * 设置是否开启语义 + * + * @return 设置是否开启语义key + */ ++(NSString*)ASR_SCH; + +/*! + * 设置是否有标点符号 + * + * @return 设置是否有标点符号key + */ ++(NSString*)ASR_PTT; + +/*! + * ASR_PTT 参数值:设置带标点符号 + * + * @return 设置是有标点符号Value + */ ++(NSString*)ASR_PTT_HAVEDOT; + +/*! + * ASR_PTT 参数值:设置不带标点符号 + * + * @return 设置是无标点符号Value + */ ++(NSString*)ASR_PTT_NODOT; + +/*! + * 本地语法名称。 + * 本地语法名称,对应云端的有CLOUD_GRAMMAR + * + * @return 本地语法名称key。 + */ ++(NSString*)LOCAL_GRAMMAR; + +/*! + * 云端语法ID。 + * 云端编译语法返回的表示,早期版本使用GRAMMAR_ID,仍然兼容,但建议使用新的。 + * + * @return 云端语法ID key。 + */ ++(NSString*)CLOUD_GRAMMAR; + +/*! + * 语法类型 + * + * @return 语法类型key + */ ++(NSString*)GRAMMAR_TYPE; + +/*! + * 语法内容。 + * + * @return 语法内容key。 + */ ++(NSString*)GRAMMAR_CONTENT; + +/*! + * 字典内容。 + * + * @return 字典内容key。 + */ ++(NSString*)LEXICON_CONTENT; + +/*! + * 字典名字。 + * + * @return 字典名字key。 + */ ++(NSString*)LEXICON_NAME; + +/*! + * 语法名称列表。 + * + * @return 语法名称列表key。 + */ ++(NSString*)GRAMMAR_LIST; + +/*! + * 开放语义协议版本号。 + * 如需使用请在http://osp.voicecloud.cn/上进行业务配置 + * + * @return 开放语义协议版本号key。 + */ ++(NSString*)NLP_VERSION; + +#pragma mark - 唤醒相关设置key +/*! + * 唤醒门限值。 + * + * @return 唤醒门限值key。 + */ ++(NSString*)IVW_THRESHOLD; + +/*! + * 唤醒服务类型。 + * + * @return 唤醒服务类型key。 + */ ++(NSString*)IVW_SST; + +/*! + * 唤醒+识别。 + * + * @return 唤醒+识别key。 + */ ++(NSString*)IVW_ONESHOT; + +/*! + * 唤醒工作方式 + * 1:表示唤醒成功后继续录音,0:表示唤醒成功后停止录音。 + * + * @return 唤醒工作方式key + */ ++(NSString*)KEEP_ALIVE; + +#pragma mark - 评测相关设置key +/*! + * 评测类型
+ * 可选值:read_syllable(英文评测不支持):单字;read_word:词语;read_sentence:句子;read_chapter(待开放):篇章。 + * + * @return 评测类型 key + */ ++(NSString*)ISE_CATEGORY; + +/*! + * 评测结果等级
+ * 可选值:complete:完整 ;plain:简单 + * + * @return 评测结果等级 key + */ ++(NSString*)ISE_RESULT_LEVEL; + +/*! + * 评测结果格式 + * 可选值:xml;plain + * + * @return 评测结果格式 key + */ ++(NSString*)ISE_RESULT_TYPE; + +/*! + * 评测录音保存路径 + * + * @return 评测录音保存路径key + */ ++(NSString*) ISE_AUDIO_PATH; + + +/*! + * 朗读跟踪,只对句子和篇章有效
+ * 可选值:enable:开启;disable:关闭。 + * + * @return 朗读跟踪 key + */ ++(NSString*)ISE_AUTO_TRACKING; + +/*! + * 跟踪模式
+ * 可选值:easy:简单;hard:复杂。 + * + * @return 跟踪模式 key + */ ++(NSString*)ISE_TRACK_TYPE; + +#pragma mark - 语记SDK业务key +/** + * 本地所有资源 + * + * @return 本地所有资源key + */ ++ (NSString *)PLUS_LOCAL_ALL; + +/** + * 本地合成资源 + * + * @return 本地合成资源key + */ ++ (NSString *)PLUS_LOCAL_TTS; + +/** + * 本地识别资源 + * + * @return 本地识别资源key + */ ++ (NSString *)PLUS_LOCAL_ASR; + +/** + * 本地唤醒资源 + * + * @return 本地唤醒资源key + */ ++ (NSString *)PLUS_LOCAL_IVW; + +#pragma mark - 身份验证业务key + +/** + * auth_id + * 用于用户注册和登录、查询、删除等业务时标识用户身份 + * + * @return 用户标识 + */ ++ (NSString*)MFV_AUTH_ID; + +/** + * 请求业务类型,可选值:mfv(默认,融合验证),ivp(声纹),ifr(人脸) + * + * @return 请求业务类型key + */ ++ (NSString*)MFV_SUB; + +/** + * 会话类型,不同sub有不同的sst取值。 + * ifr:enroll,verify,identify,reenroll,query,delete + * ivp:enroll(train),verify,reenroll,query,delete,download + * + * @return 会话类型key + */ ++ (NSString*)MFV_SST; + +/** + * 融合验证模式,仅在融合验证场景下使用。可选值:sin(单一生物特征数据验证),mix(混合生物特征数据验证),agi(灵活生物特征数据验证) + * + * @return 融合验证模式key + */ ++ (NSString*)MFV_VCM; + +/** + * 特征场景,用来说明本次验证将涉及的业务。可选值:ivp,ifr,ivp|ifr + * + * @return 特征场景 key + */ ++ (NSString*)MFV_SCENES; + +/** + * 确认周期(affirmance cycle,单位:s),用户设置的确认超时时间(生命周期),仅在灵活融合验证场景下使用 + * + * @return 确认周期key + */ ++ (NSString*)MFV_AFC; + +/** + * 数据保存路径 + * + * @return 数据保存路径key + */ ++ (NSString*)MFV_DATA_PATH; + +/** + * 训练次数:取值2~9.无默认值,必须明确指定。 + * + * @return 训练次数key + */ ++ (NSString*)MFV_RGN; + +/** + * 声纹确认门限值,验证得分>=tsd验证通过,否则验证失败(该参数目前不支持,作为保留参数。)却只范围:0~100. + * + * @return 声纹确认门限值key + */ ++ (NSString*)MFV_TSD; + +/** + * 密码文本。从服务端下载,比如数字密码所需要的数字串。 + * + * @return 密码文本key + */ ++ (NSString*)MFV_PTXT; + +/** + * 密码类型。取值:1(文本密码),2(自由说),3(数字密码). + * + * @return 密码类型key + */ ++ (NSString*)MFV_PWDT; + +/** + * 取消注册。取值:0(不取消,即不生效),1(取消本次注册). + * + * @return 取消注册key + */ ++ (NSString*)MFV_FIN; + +/** + * 等待超时时间:描述客户端等待结果的超时时间 + * + * @return 等待超时时间:key + */ ++ (NSString*)MFV_WTT; + +/** + * 数据格式 + * 声纹为音频采样率支持:16000和8000;人脸为图片格式,支持jpg和gif + * + * @return 数据格式key + */ ++ (NSString*)MFV_DATA_FORMAT; + +/** + * 数据压缩编码 + * 声纹为;人脸支持raw,不对图片压缩 + * + * @return 数据压缩编码key + */ ++ (NSString*)MFV_DATA_ENCODING; + +#pragma mark - 人脸业务key + +//1. sub 取值: wfr 用途: 用于区分业务类型,web访问方式中,nginx配置不用使用,但是在结构化日志和染色日志记录中使用。 +//2. sst 取值: reg、verify、detect、align 用途: 指定本路会话是属于何种性质 +// + 人脸图像注册(reg):上传图像,验证图像的有效性,然后存储起来,作为数据源。 +// + 人脸图像验证(verify):通过与指定源图像比较,验证人脸相似性。 +// + 人脸图像检测(detect):能够检测出不同姿态方位的人脸在图中的位置。 +// + 人脸图像聚焦(align):在给定人脸框下自动标定出两眼、鼻尖、嘴角的坐标。 +//3. aue 取值: raw 用途: 图像压缩格式,现在引擎不支持图像压缩,aue只能取值raw +//4. pset 取值: 整数 用途: 人脸识别验证阈值,取值可以是负数也可以是整数。 +//5. skip 取值: true/false 用途: 后台图片处理是否进行过滤。true表示不过滤,false表示过滤 +//6. gid 取值: *********** 用途: 图像模型id,如:4a6c124ed6b78436ee5aac4563f13eb5 +//7. appid 取值:用户申请的appid 用途: 验证用户 + + +/** sub 默认值:wfr + * 用于区分业务类型,web访问方式中,nginx配置不用使用,但是在结构化日志和染色日志记录中使用。 + */ ++ (NSString*) FACE_SUB; + +/** WFR + * sub参数的默认值 + */ ++ (NSString*) FACE_WFR; + +/** sst + * 指定本路会话是属于何种性质 + */ ++ (NSString*) FACE_SST; + +/** REG + * 人脸图像注册(reg):上传图像,验证图像的有效性,然后存储起来,作为数据源。 + */ ++ (NSString*) FACE_REG; +/** VERIFY + * 人脸图像验证(verify):通过与指定源图像比较,验证人脸相似性。 + */ ++ (NSString*) FACE_VERIFY; +/** DETECT + * 人脸图像检测(detect):能够检测出不同姿态方位的人脸在图中的位置。 + */ ++ (NSString*) FACE_DETECT; +/** ALIGN + * 人脸图像聚焦(align):在给定人脸框下自动标定出两眼、鼻尖、嘴角的坐标。 + */ ++ (NSString*) FACE_ALIGN; + +/** ATTR + * 面部属性识别(attr):对面部属性进行识别:例如秃顶、刘海、大嘴、模糊、眼镜等。 + */ ++ (NSString*) FACE_ATTR; + + +/** AUE + * 图像压缩格式,现在引擎不支持图像压缩,aue只能取值raw + */ ++ (NSString*) FACE_AUE; + +/** RAW + * AUE参数的值 + */ ++ (NSString*) FACE_RAW; + +/** PSET + * 人脸识别验证阈值,取值可以是负数也可以是整数。 + */ ++ (NSString*) FACE_PSET; + +/** SKIP + * 后台图片处理是否进行过滤。true表示不过滤,false表示过滤,传入字符串@“true”或@“false” + */ ++ (NSString*) FACE_SKIP; + +/** GID + * 图像模型id,如:4a6c124ed6b78436ee5aac4563f13eb5 + */ ++ (NSString*) FACE_GID; + +/** + * auth_id + * 用于用户注册和登录、查询、删除等业务时标识用户身份 + * + * @return 用户标识 + */ ++ (NSString*)FACE_AUTH_ID; + +/** DVC + * 用户设备编号,用于验证用户 + */ ++ (NSString*) FACE_DVC; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechError.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechError.h new file mode 100644 index 0000000..7aa8293 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechError.h @@ -0,0 +1,58 @@ +// +// IFlySpeechError.h +// MSC +// +// Created by iflytek on 13-3-19. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#ifndef __IFlySpeechError__ +#define __IFlySpeechError__ + +#import + +/*! + * 错误描述类 + */ +@interface IFlySpeechError : NSObject + +/*! + * 错误码 + */ +@property(nonatomic,assign) int errorCode; + +/*! + * 错误码类 + */ +@property(nonatomic,assign) int errorType; + +/*! + * 错误描述 + */ +@property(nonatomic,retain) NSString* errorDesc; + +/*! + * 初始化 + * + * @param errorCode -[in] 错误码 + * + * @return IFlySpeechError对象 + */ ++ (instancetype) initWithError:(int) errorCode; + +/*! + * 获取错误码 + * + * @return 错误码 + */ +-(int) errorCode; + +/*! + * 获取错误描述 + * + * @return 错误描述 + */ +- (NSString *) errorDesc; + +@end +#endif \ No newline at end of file diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluator.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluator.h new file mode 100644 index 0000000..af43d93 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluator.h @@ -0,0 +1,78 @@ +// +// IFlySpeechEvaluator.h +// msc +// +// Created by jianzhang on 14-1-13 +// Copyright (c) 2013年 iflytek. All rights reserved. +// + + +#import +#import "IFlySpeechEvaluatorDelegate.h" + +/*! + * 语音评测类 + */ +@interface IFlySpeechEvaluator : NSObject + +/*! + * 设置委托对象 + */ +@property (assign) id delegate; + +/*! + * 返回评测对象的单例 + * + * @return 别对象的单例 + */ ++ (instancetype)sharedInstance; + +/*! + * 销毁评测对象。 + * + * @return 成功返回YES,失败返回NO。 + */ +- (BOOL)destroy; + +/*! + * 设置评测引擎的参数 + * + * @param value 评测引擎参数值 + * @param key 评测引擎参数 + * + * @return 设置的参数和取值正确返回YES,失败返回NO + */ +- (BOOL)setParameter:(NSString *)value forKey:(NSString *)key; + + +/*! + * 获得评测引擎的参数 + * + * @param key 评测引擎参数 + * + * @return key对应的参数值 + */ +- (NSString*)parameterForKey:(NSString *)key; + +/*! + * 开始评测 + * 同时只能进行一路会话,这次会话没有结束不能进行下一路会话,否则会报错 + * + * @param data 评测的试题 + * @param params 评测的参数 + */ +- (void)startListening:(NSData *)data params:(NSString *)params; + +/*! + * 停止录音 + * 调用此函数会停止录音,并开始进行语音识别 + */ +- (void)stopListening; + +/*! + * 取消本次会话 + */ +- (void)cancel; + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluatorDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluatorDelegate.h new file mode 100644 index 0000000..cc18a08 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvaluatorDelegate.h @@ -0,0 +1,66 @@ +// +// IFlySpeechEvaluatorDelegate.h +// msc +// +// Created by admin on 13-6-19. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + + +#import + +@class IFlySpeechError; + +/*! + * 评测协议 + */ +@protocol IFlySpeechEvaluatorDelegate + +/*! + * 音量和数据回调 + * + * @param volume 音量 + * @param buffer 音频数据 + */ +- (void)onVolumeChanged:(int)volume buffer:(NSData *)buffer; + +/*! + * 开始录音回调 + * 当调用了`startListening`函数之后,如果没有发生错误则会回调此函数。如果发生错误则回调onError:函数 + */ +- (void)onBeginOfSpeech; + +/*! + * 停止录音回调 + * 当调用了`stopListening`函数或者引擎内部自动检测到断点,如果没有发生错误则回调此函数。 + * 如果发生错误则回调onError:函数 + */ +- (void)onEndOfSpeech; + +/*! + * 正在取消 + */ +- (void)onCancel; + +/*! + * 评测错误回调 + * 在进行语音评测过程中的任何时刻都有可能回调此函数,你可以根据errorCode进行相应的处理. + * 当errorCode没有错误时,表示此次会话正常结束,否则,表示此次会话有错误发生。特别的当调用 + * `cancel`函数时,引擎不会自动结束,需要等到回调此函数,才表示此次会话结束。在没有回调此函 + * 数之前如果重新调用了`startListenging`函数则会报错误。 + * + * @param errorCode 错误描述类 + */ +- (void)onError:(IFlySpeechError *)errorCode; + +/*! + * 评测结果回调 + * 在评测过程中可能会多次回调此函数,你最好不要在此回调函数中进行界面的更改等操作,只需要将回调的结果保存起来。 + * + * @param results -[out] 评测结果。 + * @param isLast -[out] 是否最后一条结果 + */ +- (void)onResults:(NSData *)results isLast:(BOOL)isLast; + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechEvent.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvent.h new file mode 100644 index 0000000..d056a02 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechEvent.h @@ -0,0 +1,171 @@ +// +// IFlySpeechEvent.h +// MSCDemo +// +// Created by admin on 14-8-12. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + +#import + +/*! + * 事件类型 + */ +typedef NS_ENUM(NSUInteger,IFlySpeechEventType){ + /*! + * 网络状态消息 + * 在消息到达时,可通过onEvent的第2个参数arg1,获取当前网络连接状态值 + */ + IFlySpeechEventTypeNetPref = 10001, + /** + * 转写音频文件消息 + * 在录音模式下,成功创建音频文件时返回。可通过onEvent + * 第4个参数data 指定Key为[IFlySpeechConstant IST_AUDIO_PATH],获取音频文件绝对路径. + * 或通过[IFlySpeechTranscripter getParameter:[IFlySpeechConstant IST_AUDIO_PATH]], + * 获取音频文件绝对路径. + */ + IFlySpeechEventTypeISTAudioFile = 10004, + /** + * 转写已上传字节消息 + * 在消息到达时,通过onEvent + * 的第二个参数arg1,获取已确认上传到服务器的字节数. + * 若当前音频源为非写音频模式,还可通过onEvent + * 的第三个参数arg2,获取当前所有音频的字节大小.录音模式时,由于所有音频字节大小会变。 + * 当停止音频输入后(等待录音时间超时 + * [IFlySpeechConstant SPEECH_TIMEOUT] + * ,或调用[IFlySpeechTranscripter stopTranscripting]), + * 且服务器收到所有音频时,第四个参数data,将包含完成标记的布尔值(true),可通过data调用 + * 指定KEY为KCIFlySpeechEventKeyISTUploadComplete获取。 + * 此消息可能多次返回. + */ + IFlySpeechEventTypeISTUploadBytes = 10006, + + /** + * 转写缓存剩余 + * 此消息仅在音频源为-1时需要关注 + * 在调用[IFlySpeechTranscripter writeAudio]写音频时,应该关注此事件。 + * 此事件在调用写音频接口、及音频最后被写入底库库时分别回调一次。当事件回调时,通过onEvent + * 的第二个参数arg1,获取当前剩余的缓存大小,当缓存小于要写入的音频时,应该先暂停写音频数据,直到下次缓存大小大于要写入的音频时. + * 最大缓存为128KByte。 + */ + IFlySpeechEventTypeISTCacheLeft = 10007, + + /** + * 转写结果等待时间消息 + * 在消息到达时,通过 onEvent + * 的第二个参数arg1,获取当前结果需要的时间. + * 此消息可能多次返回,返回时间不定,且不一定会返回. + */ + IFlySpeechEventTypeISTResultTime= 10008, + + /** + * 转写转写音频同步ID消息 + * 在消息到达时,通过 onEvent + * 的第二个参数arg1,获取当前写音频同步ID. + * 此消息可能多次返回. + */ + IFlySpeechEventTypeISTSyncID= 10009, + + /** + * 会话开始消息 + * 在会话开始成功后返回 + */ + IFlySpeechEventTypeSessionBegin = 10010, + + /** + * 会话结束消息 + * 在会话结束前返回 + */ + IFlySpeechEventTypeSessionEnd = 10011, + + /** + * 音量消息,在得到音量时抛出,暂时只有身份验证的声纹业务用到 + */ + IFlySpeechEventTypeVolume = 10012, + + /** + * VAD后端点消息,在检测到VAD后端点时抛出,暂时只有身份验证的声纹业务用到 + */ + IFlySpeechEventTypeVadEOS = 10013, + + /*! + * 服务端会话id + * 在消息到达时,可通过onEvent的第4个参数data(字典类型), + * 指定key KCIFlySpeechEventKeySessionID,获取服务端会话id. + */ + IFlySpeechEventTypeSessionID = 20001, + + /*! + * TTS合成数据消息 + * -(void)onEvent:(int)eventType arg0:(int)arg0 arg1:(int)arg1 data:(NSData *)eventData + * 其中eventData中包含数据 + * + */ + IFlySpeechEventTypeTTSBuffer = 21001, + + /*! + * 通知cancel方法被调用的回调 + * + */ + IFlySpeechEventTypeTTSCancel = 21002, + + /*! + * IVW onshot 听写 or 识别结果 + * 在消息到达时,第2个参数arg1包含是否为最后一个结果:1为是,0为否; + * 第4个参数data中包含数据,通过指定KEY为KCIFlySpeechEventKeyIVWResult获取. + */ + IFlySpeechEventTypeIVWResult = 22001, + + /*! + * 开始处理录音数据 + * + */ + IFlySpeechEventTypeSpeechStart= 22002, + + /*! + * 录音停止 + * + */ + IFlySpeechEventTypeRecordStop= 22003, + + /*! + * 服务端音频url + * 在消息到达时, + * 第4个参数data,包含数据,通过 + * 指定KEY为KCIFlySpeechEventKeyAudioUrl获取. + */ + IFlySpeechEventTypeAudioUrl = 23001, + + /*! + * 变声数据结果返回 + * + * 设置voice_change参数获取结果. + */ + IFlySpeechEventTypeVoiceChangeResult = 24001 + +}; + +#pragma mark - keys for event data + +/** + * 转写是否已上传完标记key + */ +extern NSString* const KCIFlySpeechEventKeyISTUploadComplete; + +/** + * 服务端会话key + */ +extern NSString* const KCIFlySpeechEventKeySessionID; +/** + * TTS取音频数据key + */ +extern NSString* const KCIFlySpeechEventKeyTTSBuffer; +/** + * IVW oneshot 听写 or 识别结果 key + */ +extern NSString* const KCIFlySpeechEventKeyIVWResult; +/** + * 服务端音频url key + */ +extern NSString* const KCIFlySpeechEventKeyAudioUrl; + diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizer.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizer.h new file mode 100644 index 0000000..6c43c55 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizer.h @@ -0,0 +1,174 @@ +// +// IFlySpeechRecognizer.h +// MSC +// +// Created by iflytek on 13-3-19. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + +#import "IFlySpeechRecognizerDelegate.h" + +#define IFLY_AUDIO_SOURCE_MIC @"1" +#define IFLY_AUDIO_SOURCE_STREAM @"-1" + +/*! + * 语音识别类 + * 此类现在设计为单例,你在使用中只需要创建此对象,不能调用release/dealloc函数去释放此对象。所有关于语音识别的操作都在此类中。 + */ +@interface IFlySpeechRecognizer : NSObject + +/** 设置委托对象 */ +@property(nonatomic,assign) id delegate ; + +/*! + * 返回识别对象的单例 + * + * @return 识别对象的单例 + */ ++ (instancetype) sharedInstance; + +/*! + * 销毁识别对象。 + * + * @return 成功返回YES,失败返回NO + */ +- (BOOL) destroy; + +/* + * | ------------- |----------------------------------------------------------- + * | 参数 | 描述 + * | ------------- |----------------------------------------------------------- + * | domain |应用的领域: 取值为:iat、search、video、poi、music、asr; + * | | iat:普通文本听写; + * | | search:热词搜索; + * | | video:视频音乐搜索; + * | | asr:关键词识别; + * | ------------- |----------------------------------------------------------- + * | vad_bos |前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms; + * | | engine指定iat识别默认值为5000; + * | | 其他情况默认值为 4000,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | vad_eos |后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, + * | | 自动停止录音;单位:ms; + * | | sms 识别默认值为 1800; + * | | 其他默认值为 700,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | sample_rate |采样率:目前支持的采样率设置有 16000 和 8000。 + * | ------------- |----------------------------------------------------------- + * | asr_ptt |标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。 + * | ------------- |----------------------------------------------------------- + * | result_type |返回结果的数据格式: 可设置为json,xml,plain,默认为json。 + * | ------------- |----------------------------------------------------------- + * | grammarID |识别的语法id: 只针对 domain 设置为”asr”的应用。 + * | ------------- |----------------------------------------------------------- + * | asr_audio_path|音频文件名: 设置此参数后,将会自动保存识别的录音文件。 + * | | 路径为Documents/(指定值)。 + * | | 不设置或者设置为nil,则不保存音频。 + * | ------------- |----------------------------------------------------------- + * | params |扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。 + * | ------------- |----------------------------------------------------------- + * + */ + +/*! + * 设置识别引擎的参数 + * 识别的引擎参数(key)取值如下: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
*参数描述
domain应用的领域: 取值为:iat、search、video、poi、music、asr;
iat:普通文本听写;
search:热词搜索;
video:视频音乐搜索;
video:视频音乐搜索;
asr:关键词识别;
vad_bos前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms;
engine指定iat识别默认值为5000;
其他情况默认值为 4000,范围 0-10000。
vad_eos后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入,
自动停止录音;单位:ms;
sms 识别默认值为 1800;
其他默认值为 700,范围 0-10000。
sample_rate采样率:目前支持的采样率设置有 16000 和 8000。
asr_ptt标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。
result_type返回结果的数据格式: 可设置为json,xml,plain,默认为json。
grammarID识别的语法id: 只针对 domain 设置为”asr”的应用。
asr_audio_path音频文件名: 设置此参数后,将会自动保存识别的录音文件。
路径为Documents/(指定值)。
不设置或者设置为nil,则不保存音频。
params扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。
+ * @param value 参数对应的取值 + * @param key 识别引擎参数 + * + * @return 成功返回YES;失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/*! + * 获取识别引擎参数 + * + * @param key 参数key + * + * @return 参数值 + */ +-(NSString*) parameterForKey:(NSString *)key; + +/*! + * 开始识别 + * 同时只能进行一路会话,这次会话没有结束不能进行下一路会话,否则会报错。若有需要多次回话, + * 请在onError回调返回后请求下一路回话。 + * + * @return 成功返回YES;失败返回NO + */ +- (BOOL) startListening; + +/*! + * 停止录音 + * 调用此函数会停止录音,并开始进行语音识别 + */ +- (void) stopListening; + +/*! + * 取消本次会话 + */ +- (void) cancel; + +/*! + * 上传语法 + * + * @param completionHandler 上传语法完成回调 + * @param grammarType 语法类型 + * @param grammarContent 语法内容 + * + * @return 错误码 + */ +- (int) buildGrammarCompletionHandler:(IFlyOnBuildFinishCompletionHandler)completionHandler + grammarType:(NSString *)grammarType + grammarContent:(NSString *)grammarContent; + +/** 是否正在识别 + */ +@property (nonatomic, readonly) BOOL isListening; + +@end + +/*! + * 音频流识别 + * 音频流识别可以将文件分段写入 + */ +@interface IFlySpeechRecognizer(IFlyStreamRecognizer) + +/*! +* 写入音频流 +* 此方法的使用示例如下: +*
[_iFlySpeechRecognizer setParameter:@"audio_source" value:@"-1"];
+* [_iFlySpeechRecognizer startListening];
+* [_iFlySpeechRecognizer writeAudio:audioData1];
+* [_iFlySpeechRecognizer writeAudio:audioData2];
+* ...
+* [_iFlySpeechRecognizer stopListening];
+* 
+* +* @param audioData 音频数据 +* +* @return 写入成功返回YES,写入失败返回NO +*/ +- (BOOL) writeAudio:(NSData *) audioData; + +@end + diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizerDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizerDelegate.h new file mode 100644 index 0000000..b565f1a --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechRecognizerDelegate.h @@ -0,0 +1,112 @@ +// +// IFlySpeechRecognizerDelegate.h +// MSC +// +// Created by ypzhao on 13-3-27. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + +@class IFlySpeechError; + +/*! + * 构建语法结束回调 + * + * @param grammarId 语法id + * @param error 错误描述 + */ +typedef void(^IFlyOnBuildFinishCompletionHandler)(NSString* grammarId,IFlySpeechError * error); + + +/*! + * 语音识别协议 + * 在使用语音识别时,需要实现这个协议中的方法. + */ +@protocol IFlySpeechRecognizerDelegate + +@required + +/*! + * 识别结果回调 + * 在进行语音识别过程中的任何时刻都有可能回调此函数,你可以根据errorCode进行相应的处理, + * 当errorCode没有错误时,表示此次会话正常结束;否则,表示此次会话有错误发生。特别的当调用 + * `cancel`函数时,引擎不会自动结束,需要等到回调此函数,才表示此次会话结束。在没有回调此函数 + * 之前如果重新调用了`startListenging`函数则会报错误。 + * + * @param errorCode 错误描述 + */ +- (void) onError:(IFlySpeechError *) errorCode; + +/*! + * 识别结果回调 + * 在识别过程中可能会多次回调此函数,你最好不要在此回调函数中进行界面的更改等操作,只需要将回调的结果保存起来。 + * 使用results的示例如下: + *

+ *  - (void) onResults:(NSArray *) results{
+ *     NSMutableString *result = [[NSMutableString alloc] init];
+ *     NSDictionary *dic = [results objectAtIndex:0];
+ *     for (NSString *key in dic){
+ *        [result appendFormat:@"%@",key];//合并结果
+ *     }
+ *   }
+ *  
+ * + * @param results -[out] 识别结果,NSArray的第一个元素为NSDictionary,NSDictionary的key为识别结果,sc为识别结果的置信度。 + * @param isLast -[out] 是否最后一个结果 + */ +- (void) onResults:(NSArray *) results isLast:(BOOL)isLast; + +@optional + +/*! + * 音量变化回调 + * 在录音过程中,回调音频的音量。 + * + * @param volume -[out] 音量,范围从0-30 + */ +- (void) onVolumeChanged: (int)volume; + +/*! + * 开始录音回调 + * 当调用了`startListening`函数之后,如果没有发生错误则会回调此函数。 + * 如果发生错误则回调onError:函数 + */ +- (void) onBeginOfSpeech; + +/*! + * 停止录音回调 + * 当调用了`stopListening`函数或者引擎内部自动检测到断点,如果没有发生错误则回调此函数。 + * 如果发生错误则回调onError:函数 + */ +- (void) onEndOfSpeech; + +/*! + * 取消识别回调 + * 当调用了`cancel`函数之后,会回调此函数,在调用了cancel函数和回调onError之前会有一个 + * 短暂时间,您可以在此函数中实现对这段时间的界面显示。 + */ +- (void) onCancel; + +#ifdef _EDUCATION_ +/** + * 返回音频Key + * + * @param key 音频Key + */ +- (void) getAudioKey:(NSString *)key; + +#endif + +/** + * 扩展事件回调 + * 根据事件类型返回额外的数据 + * + * @param eventType 事件类型,具体参见IFlySpeechEventType的IFlySpeechEventTypeVoiceChangeResult枚举。 + * @param arg0 arg0 + * @param arg1 arg1 + * @param eventData 事件数据 + */ +- (void) onEvent:(int)eventType arg0:(int)arg0 arg1:(int)arg1 data:(NSData *)eventData; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizer.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizer.h new file mode 100644 index 0000000..040f4a5 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizer.h @@ -0,0 +1,128 @@ +// +// IFlySpeechSynthesizer.h +// MSC +// +// Created by 侯效林 on 16-4-22. +// Copyright (c) 2016年 iflytek. All rights reserved. +// + +#import +#import "IFlySpeechSynthesizerDelegate.h" + + +/*! + * 语音合成 + */ +@interface IFlySpeechSynthesizer : NSObject + +/*! + * 设置识别的委托对象 + */ +@property(nonatomic,assign) id delegate; + +/*! + * 返回合成对象的单例 + * + * @return 合成对象 + */ ++ (instancetype) sharedInstance; + +/*! + * 销毁合成对象。 + * + * @return 成功返回YES,失败返回NO. + */ ++ (BOOL) destroy; + +/* + * | ------------- |----------------------------------------------------------- + * | 参数 | 描述 + * | ------------- |----------------------------------------------------------- + * | speed |合成语速,取值范围 0~100 + * | ------------- |----------------------------------------------------------- + * | volume |合成的音量,取值范围 0~100 + * | ------------- |----------------------------------------------------------- + * | voice_name |默认为”xiaoyan”;可以设置的参数列表可参考个性化发音人列表 + * | ------------- |----------------------------------------------------------- + * | sample_rate |采样率:目前支持的采样率设置有 16000 和 8000。 + * | ------------- |----------------------------------------------------------- + * | tts_audio_path|音频文件名 设置此参数后,将会自动保存合成的音频文件。 + * | |路径为Documents/(指定值)。不设置或者设置为nil,则不保存音频。 + * | ------------- |----------------------------------------------------------- + * | params |扩展参数: 对于一些特殊的参数可在此设置。 + * | ------------- |----------------------------------------------------------- + * + */ + +/*! + * 设置合成参数 + * + * + * + * + * + * + * + * + * + * + * + * + * + *
参数描述
speed合成语速,取值范围 0~100
volume合成的音量,取值范围 0~100
voice_name默认为”xiaoyan”;可以设置的参数列表可参考个性化发音人列表
sample_rate采样率:目前支持的采样率设置有 16000 和 8000。
tts_audio_path音频文件名 设置此参数后,将会自动保存合成的音频文件。
路径为Documents/(指定值)。不设置或者设置为nil,则不保存音频。
params扩展参数: 对于一些特殊的参数可在此设置。
+ * + * @param value 参数取值 + * @param key 合成参数 + * + * @return 设置成功返回YES,失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/*! + * 获取合成参数 + * + * @param key 参数key + * + * @return 参数值 + */ +-(NSString*) parameterForKey:(NSString *)key; + +/*! + * 开始合成(播放) + * 调用此函数进行合成,如果发生错误会回调错误`onCompleted` + * + * @param text 合成的文本,最大的字节数为1k + */ +- (void) startSpeaking:(NSString *)text; + +/*! + * 开始合成(不播放) + * 调用此函数进行合成,如果发生错误会回调错误`onCompleted` + * + * @param text 合成的文本,最大的字节数为1k + * @param uri 合成后,保存再本地的音频路径 + */ +-(void)synthesize:(NSString *)text toUri:(NSString*)uri; + +/*! + * 暂停播放 + * 暂停播放之后,合成不会暂停,仍会继续,如果发生错误则会回调错误`onCompleted` + */ +- (void) pauseSpeaking; + +/*! + * 恢复播放 + */ +- (void) resumeSpeaking; + +/*! + * 停止播放并停止合成 + */ +- (void) stopSpeaking; + +/*! + * 是否正在播放 + */ +@property (nonatomic, readonly) BOOL isSpeaking; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizerDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizerDelegate.h new file mode 100644 index 0000000..d54f70b --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechSynthesizerDelegate.h @@ -0,0 +1,80 @@ +// +// IFlySpeechSynthesizerDelegate.h +// MSC +// +// Created by ypzhao on 13-3-20. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import +#import "IFlySpeechEvent.h" + +@class IFlySpeechError; + +/** + * 语音合成回调 + */ +@protocol IFlySpeechSynthesizerDelegate + +@required + +/** + * 结束回调 + * 当整个合成结束之后会回调此函数 + * + * @param error 错误码 + */ +- (void) onCompleted:(IFlySpeechError*) error; + +@optional + +/** + * 开始合成回调 + */ +- (void) onSpeakBegin; + +/** + * 缓冲进度回调 + * + * @param progress 缓冲进度,0-100 + * @param msg 附件信息,此版本为nil + */ +- (void) onBufferProgress:(int) progress message:(NSString *)msg; + +/** + * 播放进度回调 + * + * @param progress 当前播放进度,0-100 + * @param beginPos 当前播放文本的起始位置,0-100 + * @param endPos 当前播放文本的结束位置,0-100 + */ +- (void) onSpeakProgress:(int) progress beginPos:(int)beginPos endPos:(int)endPos; + +/** + * 暂停播放回调 + */ +- (void) onSpeakPaused; + +/** + * 恢复播放回调 + */ +- (void) onSpeakResumed; + +/** + * 正在取消回调 + * 当调用`cancel`之后会回调此函数 + */ +- (void) onSpeakCancel; + +/** + * 扩展事件回调 + * 根据事件类型返回额外的数据 + * + * @param eventType 事件类型,具体参见IFlySpeechEventType枚举。目前只支持EVENT_TTS_BUFFER也就是实时返回合成音频。 + * @param arg0 arg0 + * @param arg1 arg1 + * @param eventData 事件数据 + */ +- (void) onEvent:(int)eventType arg0:(int)arg0 arg1:(int)arg1 data:(NSData *)eventData; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechUnderstander.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechUnderstander.h new file mode 100644 index 0000000..39e71fe --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechUnderstander.h @@ -0,0 +1,134 @@ +// +// IFlySpeechUnderstander.h +// MSC +// +// Created by iflytek on 2014-03-12. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + +#import + +@class IFlySpeechError; +@protocol IFlySpeechRecognizerDelegate; + +/*! + * 语义理解接口 + */ +@interface IFlySpeechUnderstander : NSObject + +/*! + * 是否正在语义理解 + */ +@property (readonly) BOOL isUnderstanding; + +/*! + * 设置委托对象 + */ +@property(nonatomic,retain) id delegate ; + +/*! + * 创建语义理解对象的单例 + * + * @return 语义理解对象 + */ ++(instancetype) sharedInstance; + +/*! + * 开始义理解 + * 同时只能进行一路会话,这次会话没有结束不能进行下一路会话,否则会报错。若有需要多次回话,请在onError回调返回后请求下一路回话。 + * + * @return 成功返回YES,失败返回NO + */ +- (BOOL) startListening; + +/*! + * 停止录音 + * 调用此函数会停止录音,并开始进行语义理解 + */ +- (void) stopListening; + +/*! + * 取消本次会话 + */ +- (void) cancel; + +/* + * | ------------- |----------------------------------------------------------- + * | 参数 | 描述 + * | ------------- |----------------------------------------------------------- + * | domain |应用的领域: 取值为:iat、search、video、poi、music、asr; + * | | iat:普通文本听写; + * | | search:热词搜索; + * | | video:视频音乐搜索; + * | | asr:关键词识别; + * | ------------- |----------------------------------------------------------- + * | vad_bos |前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms; + * | | engine指定iat识别默认值为5000; + * | | 其他情况默认值为 4000,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | vad_eos |后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, + * | | 自动停止录音;单位:ms; + * | | sms 识别默认值为 1800; + * | | 其他默认值为 700,范围 0-10000。 + * | ------------- |----------------------------------------------------------- + * | sample_rate |采样率:目前支持的采样率设置有 16000 和 8000。 + * | ------------- |----------------------------------------------------------- + * | asr_ptt |标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。 + * | ------------- |----------------------------------------------------------- + * | result_type |返回结果的数据格式: 可设置为json,xml,plain,默认为json。 + * | ------------- |----------------------------------------------------------- + * | grammarID |识别的语法id: 只针对 domain 设置为”asr”的应用。 + * | ------------- |----------------------------------------------------------- + * | asr_audio_path|音频文件名: 设置此参数后,将会自动保存识别的录音文件。 + * | | 路径为Documents/(指定值)。 + * | | 不设置或者设置为nil,则不保存音频。 + * | ------------- |----------------------------------------------------------- + * | params |扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。 + * | ------------- |----------------------------------------------------------- + * + */ + +/*! + * 设置语义理解引擎的参数 + * 语义理解的引擎参数(key)取值如下: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
*参数描述
domain应用的领域: 取值为:iat、search、video、poi、music、asr;
iat:普通文本听写;
search:热词搜索;
video:视频音乐搜索;
video:视频音乐搜索;
asr:关键词识别;
vad_bos前端点检测: 静音超时时间,即用户多长时间不说话则当做超时处理; 单位:ms;
engine指定iat识别默认值为5000;
其他情况默认值为 4000,范围 0-10000。
vad_eos后断点检测: 后端点静音检测时间,即用户停止说话多长时间内即认为不再输入,
自动停止录音;单位:ms;
sms 识别默认值为 1800;
其他默认值为 700,范围 0-10000。
sample_rate采样率:目前支持的采样率设置有 16000 和 8000。
asr_ptt标点符号设置: 默认为 1,当设置为 0 时,将返回无标点符号文本。
result_type返回结果的数据格式: 可设置为json,xml,plain,默认为json。
grammarID识别的语法id: 只针对 domain 设置为”asr”的应用。
asr_audio_path音频文件名: 设置此参数后,将会自动保存识别的录音文件。
路径为Documents/(指定值)。
不设置或者设置为nil,则不保存音频。
params扩展参数: 对于一些特殊的参数可在此设置,一般用于设置语义。
+ * @param value 参数对应的取值 + * @param key 语义理解引擎参数 + * + * @return 成功返回YES;失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/*! + * 写入音频流 + * + * @param audioData 音频数据 + * + * @return 写入成功返回YES,写入失败返回NO + */ +- (BOOL) writeAudio:(NSData *) audioData; + +/*! + * 销毁语义理解对象。 + * + * @return 成功返回YES;失败返回NO + */ +- (BOOL) destroy; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlySpeechUtility.h b/src/ios/iflyMSC.framework/Headers/IFlySpeechUtility.h new file mode 100644 index 0000000..6bb6736 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlySpeechUtility.h @@ -0,0 +1,184 @@ +// +// IFlySpeechUtility.h +// MSCDemo +// +// Created by admin on 14-5-7. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + +#import + +#define iOS_EXCLUSIVE //iOS平台独占API + +@class IFlySpeechError; + +/** + * 引擎模式 + */ +typedef NS_ENUM(NSUInteger,IFlyEngineMode){ + /** + * 云端使用MSC,本地优先使用语记 + */ + IFlyEngineModeAuto = 0, + /** + * 只使用MSC + */ + IFlyEngineModeMsc, + /** + * 本地只使用语记(受平台限制,云端无法使用语记) + */ + IFlyEngineModePlus, +}; + + +/** + * 服务类型 + */ +typedef NS_ENUM(NSUInteger,IFlySpeechPlusServiceType){ + /** + * 打开语记主界面 + */ + IFlySpeechPlusServiceTypeNone=0, + /** + * 获取合成资源 + */ + IFlySpeechPlusServiceTypeTTS, + /** + * 获取识别资源(未开放) + */ + IFlySpeechPlusServiceTypeISR, + /** + * 获取唤醒资源(未开放) + */ + IFlySpeechPlusServiceTypeIVW, +} ; + +/** 语记返回回调 + */ +@protocol IFlySpeechplusDelegate + +/** + * 发生错误 + * + * @param errorCode 错误码 + */ +- (void)onError:(int)errorCode; + +/** + * 服务正常结束 + */ +- (void)onCompleted; + +@end + +/** + * 用户配置 + */ +@interface IFlySpeechUtility : NSObject + +/*! + * 创建用户语音配置 + * 注册应用请前往语音云开发者网站。
+ * 网站:http://www.xfyun.cn + * + * @param params 启动参数,必须保证appid参数传入,示例:appid=123456 + * + * @return 语音配置对象 + */ ++ (IFlySpeechUtility*) createUtility:(NSString *) params; + +/*! + * 销毁用户配置对象 + * + * @return 成功返回YES,失败返回NO + */ ++(BOOL) destroy; + +/*! + * 获取用户配置对象 + * + * @return 用户配置对象 + */ ++(IFlySpeechUtility *) getUtility; + +/*! + * 设置MSC引擎的状态参数 + * + * @param value 参数值 + * @param key 参数名称 + * + * @return 成功返回YES,失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/** + * 获取MSC引擎状态参数 + * + * @param key 参数名 + * + * @return 参数值 + */ +- (NSString *)parameterForKey:(NSString *)key; + +/** + * 引擎类型 + */ +@property (nonatomic, readonly) IFlyEngineMode engineMode; + +/** + * 语记协议委托 + */ +@property (nonatomic, assign) id delegate; + +@end + +/** + * 讯飞语记类别 + */ +@interface IFlySpeechUtility (SpeechPlus) + +/** + * 检查讯飞语记是否安装 + * + * @return 已安装返回YES,否则返回NO + */ ++ (BOOL)checkServiceInstalled; + +/** + * 获取讯飞语记下载地址进行下载,安装完成后即可使用服务。 + * 下载地址需要通过[[UIApplication sharedApplication] openUrl:]打开 + * + * @return 讯飞语记在App Store下载地址 + */ ++ (NSString *)componentUrl; + + +/** + * 注意:此接口废弃,不再需要使用 + * 处理语记使用URL启动第三方应用程序时传递的数据 + * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 + * + * @param url 语记启动第三方应用程序时传递过来的URL + * + * @return 成功返回YES,失败返回NO。 + */ +- (BOOL)handleOpenURL:(NSURL *)url iOS_EXCLUSIVE; + +/** + * 打开讯飞语记获取相应类型服务,0表示打开主界面 + * + * @param serviceType 服务类型 + * + * @return 成功打开返回YES,否则返回NO + */ +- (BOOL)openSpeechPlus:(IFlySpeechPlusServiceType)serviceType iOS_EXCLUSIVE; + +@end + + + + + + + + diff --git a/src/ios/iflyMSC.framework/Headers/IFlyTextUnderstander.h b/src/ios/iflyMSC.framework/Headers/IFlyTextUnderstander.h new file mode 100644 index 0000000..5e78ea5 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyTextUnderstander.h @@ -0,0 +1,57 @@ +// +// TextUnderstand.h +// MSCDemo +// +// Created by iflytek on 4/24/14. +// Copyright (c) 2014 iflytek. All rights reserved. +// + +#import + +@class IFlySpeechError; + +/*! + * 文本转语义完成回调函数 + * + * @param result 成功,返回文本语义理解结果 + * @param error 错误描述 + */ +typedef void(^IFlyUnderstandTextCompletionHandler)(NSString* result, IFlySpeechError * error); + +/*! + * 文本转语义类 + */ +@interface IFlyTextUnderstander : NSObject + +/*! + * 是否正在文本转语义 + */ +@property (readonly, atomic) __block BOOL isUnderstanding; + +/*! + * 文本转语义接口 + * 输入文本内容,获取语义理解结果 + * + * @param text 输入的文本内容 + * @param completionHandler 文本转语义完成回调函数 + * + * @return 错误码 + */ +-(int) understandText:(NSString*)text withCompletionHandler:(IFlyUnderstandTextCompletionHandler) completionHandler; + +/*! + * 设置文本转语义参数 + * + * @param value 参数对应的取值 + * @param key 文本转语义参数参数 + * + * @return 成功返回YES,失败返回NO + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/*! + * 取消本次会话 + */ +-(void)cancel; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyUserWords.h b/src/ios/iflyMSC.framework/Headers/IFlyUserWords.h new file mode 100644 index 0000000..7c56a3b --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyUserWords.h @@ -0,0 +1,73 @@ +// +// IFlyUserWords.h +// MSC +// +// Created by ypzhao on 13-2-26. +// Copyright (c) 2013年 iflytek. All rights reserved. +// + +#import + +/*! + * 用户词表类 + * 获取用户词表是为了更好的语音识别(iat),用户词表也属于个性化的一部分. + */ +@interface IFlyUserWords : NSObject + +/*! + * 初始化对象 + * 在进行初始化时,需要传入的格式如下: + *
{\"userword\":[{\"name\":\"iflytek\",\"words\":[\"科大讯飞\",
+ *  \"云平台\",\"用户词条\",\"开始上传词条\"]}]}
+ * + * @param json 初始化时传入的数据 + * + * @return IFlyUserWords对象 + */ +- (id) initWithJson:(NSString *)json; + +/*! + * 将数据转化为上传的数据格式 + * + * @return 没有数据或者格式不对时返回nil + */ +- (NSString *) toString; + +/*! + * 返回key对应的数据 + * + * @param key 在putword:value中设置的key + * + * @return key对应的数组 + */ +- (NSArray *) getWords: (NSString *) key; + +/*! + * 添加一条用户词数据 + * + * @param key 用户词对应的key + * @param value 上传的用户词数据 + * + * @return 成功返回YES,失败返回NO + */ +- (BOOL) putWord: (NSString *) key value:(NSString *)value; + +/*! + * 添加一组数据 + * + * @param key 用户词对应的key + * @param words 上传的用户词数据 + * + * @return 成功返回YES,失败返回NO + */ +- (BOOL) putwords: (NSString *) key words:(NSArray *)words; + +/*! + * 是否包含key对应的用户词数据 + * + * @param key 用户词对应的key + * + * @return 成功返回YES,失败返回NO + */ +- (BOOL) containsKey: (NSString *) key; +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuper.h b/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuper.h new file mode 100644 index 0000000..6a43695 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuper.h @@ -0,0 +1,179 @@ +// +// IFlyVoiceWakeuper.h +// wakeup +// +// Created by admin on 14-3-18. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + + +#import +#import "IFlyVoiceWakeuperDelegate.h" + +/** + + 版本描述:唤醒1.0.0.1 + + 语音唤醒资源占用(iPhone5s实测) + 内存占用:3M + CPU占用:< 12% + + + 唤醒服务接口时序描述 + + sharedInstance 创建唤醒实例 + setParameter 设置服务参数 + + 例:[_voiceWakeuper setParameter:@"wake" forKey:@"sst"]; + sst 表示服务类型,wake是唤醒,enroll是注册 + + 例:[_voiceWakeuper setParameter:@"m_wakeupResPath" forKey:@"ivw_wake_list"]; + ivw_wake_list 表示唤醒资源的路径 + + 例:[_voiceWakeuper setParameter:@"holdValue" forKey:@"ivw_threshold"]; + ivw_threshold 表示唤醒资源的阀值,holdValue形式: + ID:20;15;30 + 每个数字代表对应资源的阀值,15表示资源1阀值,20表示资源2阀值,30表示资源3阀值 + 本demo只有一个资源设置为ID:20 则可 + + startListening启动服务 + stopListening 取消服务,但是不释放内部资源 + cancel 终止服务,并释放内部资源 + + + *参数定义 + + * 服务设置参数 + sst=wake表示唤醒 + sst=enroll表示注册 + SESSION_TYPE @"sst" //服务类型 + + WAKEUP @"wake" //唤醒 + ENROLL @"enroll" //注册 + + * 唤醒时,表示资源对应的阀值,为输入值,参数类型为:ID:20;20;3 + 已ID为起始,中间用“;”隔开,表示公三个资源,各自阀值对应为20,20和3 + IVW_THRESHOLD @"ivw_threshold" //唤醒词对应的门限 + + + * 传入参数 + 主要是没有定义的参数,依赖params传入 + PARAM @"params" + + + * 训练,合并生成的资源路径 + + 例:ivw_word_path=/abc/123/newpath.irf + IVW_WORD_PATH @"ivw_word_path" + + + + * 业务成功后的会话持续状态 + keep_alive 0:唤醒一次就结束,1:唤醒后继续 + KEEP_ALIVE @"keep_alive" + + + * focus_type注册和唤醒的返回参数 + wake 唤醒 + enroll 注册 + FOCUS_TYPE @"focus_type" //服务类型 + + + * 服务状态 + status=success 服务正常 + status=failed 服务失败 + status=done 注册完成 + STATUS @"status" //服务状态 + SUCESS @"success" //服务成功 + FAILED @"failed" //服务失败 + DONE @"done" //训练完成 + + + * 唤醒结果的位置 + ID @"id" //唤醒结果的id + + + * 唤醒资源的阀值 + 注册时返回,表示注册资源对应的阀值,为输出值 + THRESHOLD @"threshold" //训练资源的阀值 + + + * 服务结果的可信度 + SCORE @"score" //服务结果可信度 + + + * 为注册时返回,表示已经注册成功的次数 + NUM @"num" //已训练成功次数 + + + * 表示服务传入音频对应的起始点和结束点 + BOS @"bos" //前端点 + EOS @"eos" //后端点 + + + * 录音方式,如果是外部数据,设置为-1,通过WriteAudio送入音频 + 注意:目前紧紧支持唤醒服务,注册业务尚不支持 + AUDIO_SOURCE @"audio_source" + + + * 表示资源合并操作 + MERGE_RES_ACTION @"merge" + +*/ + + +@interface IFlyVoiceWakeuper : NSObject +{ + +} + +@property(assign) id delegate; + +/** + 创建唤醒实例,采用单例模式 + */ ++ (instancetype) sharedInstance; + + +/** + 启动唤醒 + 返回值:YES 成功,NO:失败 + */ +-(BOOL) startListening; + +/** + 取消唤醒会话 + 注意与cancel的区别,紧紧停止服务,并不释放资源 + */ +-(BOOL) stopListening; + +/** + 获取工作参数 + */ +-(NSString*) getParameter:(NSString *)key; + +/** + 设置工作参数 + 注意服务正在运行中,不能设置参数 + */ +-(BOOL) setParameter:(NSString *) value forKey:(NSString*)key; + +/** + 取消唤醒会话,并释放内部资源 + */ +-(BOOL) cancel; + +/** + 唤醒业务更新,目前支持合并资源操作 + */ +//+(int) updateWords:(NSString *)action params:(NSString*) params; + +/** + 写入录音数据 + 暂时紧紧支持唤醒的写入,注册服务尚不支持 + */ +//-(int) writeAudio:(const void*)buffer offset:(int)offset length:(int)length; + +@property (readonly) BOOL isListening; + +@end diff --git a/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuperDelegate.h b/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuperDelegate.h new file mode 100644 index 0000000..326d032 --- /dev/null +++ b/src/ios/iflyMSC.framework/Headers/IFlyVoiceWakeuperDelegate.h @@ -0,0 +1,84 @@ + +// +// IFlyVoiceWakeuperDel.h +// wakeup +// +// Created by admin on 14-3-18. +// Copyright (c) 2014年 iflytek. All rights reserved. +// + + + +#import + +@class IFlySpeechError; + +/** + * 代理返回时序描述 + + onError 为唤醒会话错误反馈 + onBeginOfSpeech 表示录音开始 + onVolumeChanged 录音音量大小 + onEndOfSpeech 录音结束,当服务终止时返回onEndOfSpeech + onResult 服务结果反馈,内容定义如下 + + * 唤醒服务 + + 例: + focus_type = wake 唤醒会话 + wakeup_result_id = 0 唤醒词位置 + wakeup_result_Score = 60 唤醒词可信度 + + * 注册服务 + + 例: + focus_type = enroll 注册会话 + enroll_success_num = 1 当前注册成功次数 + current_enroll_status = success/failed 当前会话是否成功 + wakeup_result_Score = 60 注册结果可信度 + threshold = 10 当注册达到3次后,反馈对应资源的阀值 + */ +@protocol IFlyVoiceWakeuperDelegate + +@optional + +/** + 录音开始 + */ +-(void) onBeginOfSpeech; + +/** + 录音结束 + */ +-(void) onEndOfSpeech; + +/** + 会话错误 + @param errorCode 错误描述类, +*/ +- (void) onError:(IFlySpeechError *) error; + +/** + 唤醒 + resultID:唤醒词位置 + */ +-(void) onResult:(NSMutableDictionary *)resultArray; + +/** + 音量反馈,返回频率与录音数据返回回调频率一致 + volume:音量值 + */ +- (void) onVolumeChanged: (int)volume; + + +/** 扩展事件回调 + + 根据事件类型返回额外的数据 + + @param eventType 事件类型,具体参见IFlySpeechEvent枚举。 + + */ +- (void) onEvent:(int)eventType isLast:(BOOL)isLast arg1:(int)arg1 data:(NSMutableDictionary *)eventData; + +@end + diff --git a/src/ios/iflyMSC.framework/iflyMSC b/src/ios/iflyMSC.framework/iflyMSC new file mode 100644 index 0000000..77aad7b Binary files /dev/null and b/src/ios/iflyMSC.framework/iflyMSC differ diff --git a/www/Speech.js b/www/Speech.js new file mode 100644 index 0000000..564a575 --- /dev/null +++ b/www/Speech.js @@ -0,0 +1,137 @@ +/** + * Created by Edc.zhang on 2017/2/13. + */ +var cordova = require('cordova'), + channel = require('cordova/channel'), + exec = require('cordova/exec'); + +var Speech = function() { + this.channels = { + 'SyncContact': channel.create('SyncContact'), + 'UpdateUserWord': channel.create('UpdateUserWord'), + 'SpeechError': channel.create('SpeechError'), + 'SpeechResults': channel.create('SpeechResults'), + 'VolumeChanged': channel.create('VolumeChanged'), + 'SpeechBegin': channel.create('SpeechBegin'), + 'SpeechEnd': channel.create('SpeechEnd'), + 'SpeechCancel': channel.create('SpeechCancel'), + 'SpeakCompleted': channel.create('SpeakCompleted'), + 'SpeakBegin': channel.create('SpeakBegin'), + 'SpeakProgress': channel.create('SpeakProgress'), + 'SpeakPaused': channel.create('SpeakPaused'), + 'SpeakResumed': channel.create('SpeakResumed'), + 'SpeakCancel': channel.create('SpeakCancel'), + 'BufferProgress': channel.create('BufferProgress') + }; + this.voice_names = { + 'xiaoyan' : '小燕', + 'xiaoyu' : '小宇', + 'vixy' : '小研', + 'vixq' : '小琪', + 'vixf' : '小峰', + 'vixm' : '香港小梅', + 'vixl' : '台湾小莉', + 'vixr' : '四川妹纸', + 'vixyun' : '东北小芸', + 'vixk' : '河南小坤', + 'vixqa' : '湖南小强', + 'vixying' : '陕西小莹', + 'vixx' : '蜡笔小新', + 'vinn' : '楠楠', + 'vils' : '孙大爷', + 'Catherine' : '美国Catherine', + 'henry' : '美国Henry', + 'vimary' : '英国Mary', + 'Mariane' : '法国Mariane', + 'Guli' : '维族Guli', + 'Allabent' : '俄国Allabent', + 'Gabriela' : '西班牙Gabriela', + 'Abha' : '印度Abha', + 'XiaoYun' : '越南XiaoYun' + }; + this.login(); + this.msg = ""; +}; + +Speech.prototype = { + + _eventHandler: function(info) { + if (info.event in this.channels) { + this.channels[info.event].fire(info); + } + }, + + addEventListener: function(event, f, c) { + if (event in this.channels) { + this.channels[event].subscribe(f, c || this); + } + }, + + removeEventListener: function(event, f) { + if (event in this.channels) { + this.channels[event].unsubscribe(f); + } + }, + + login: function() { + // closure variable for local function to use + var speech = this; + + // the callback will be saved in the session for later use + var callback = function(info) { + speech._eventHandler(info); + }; + exec(callback, callback, 'Speech', 'login', []); + + function parseResults( e ) { + var data = JSON.parse( e.results ); + if(data.sn == 1) speech.msg = ""; + var ws = data.ws; + for( var i=0; i