前言
  现在软件设计越来越人性化、智能化。一些常见的输入都慢慢向语音听写方向发展,一些常见的消息提示都向语音播报发展。所以语音合成和语音听写是手机软件开发必不可少的功能。目前国内这方面做的比较好的应该是科大讯飞。很多搜索引擎,语音助手都有用到。本人也是第一次用初步研究了一下,和大家一起分享学习。
 
声明
  欢迎转载,但请保留文章原始出处:) 
    总有刁民想害朕&:http://www.cnblogs.com/wangshuaiandroid
 
正文
  一、注册开放者账号、创建应用、下载SDK 

    讯飞开放平台

  二、集成SDK

    2.1  将开发工具包中libs目录下的Msc.jar和armeabi复制到Android工程的libs目录(如果工程无libs目录,请自行创建)

    2.2  添加用户权限

  1. <!--连接网络权限,用于执行云端语音能力 -->
  2. <uses-permission android:name="android.permission.INTERNET"/>
  3. <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
  4. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  5. <!--读取网络信息状态 -->
  6. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  7. <!--获取当前wifi状态 -->
  8. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  9. <!--允许程序改变网络连接状态 -->
  10. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  11. <!--读取手机信息权限 -->
  12. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
  13. <!--读取联系人权限,上传联系人需要用到此权限 -->
  14. <uses-permission android:name="android.permission.READ_CONTACTS"/>

    2.3   初始化

       初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

  1. // 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cn
  2. SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

注意:  此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请使用参数:SpeechConstant.APPID +"=12345678," + SpeechConstant.FORCE_LOGIN +"=true"。

    2.4   语音听写

      听写主要指将连续语音快速识别为文字的过程,科大讯飞语音听写能识别通用常见的语句、词汇,而且不限制说法。语音听写的调用方法如下:

      

  1. //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
  2. SpeechRecognizer mIat= SpeechRecognizer.createRecognizer(context, null);
  3. //2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
  4. mIat.setParameter(SpeechConstant.DOMAIN, "iat");
  5. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
  6. mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
  7. //3.开始听写 mIat.startListening(mRecoListener);
  8. //听写监听器
  9. private RecognizerListener mRecoListener = new RecognizerListener(){
  10. //听写结果回调接口(返回Json格式结果,用户可参见附录12.1);
  11. //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
  12. //关于解析Json的代码可参见MscDemo中JsonParser类;
  13. //isLast等于true时会话结束。
  14. public void onResult(RecognizerResult results, boolean isLast) {
  15. Log.d("Result:",results.getResultString ());}
  16. //会话发生错误回调接口
  17. public void onError(SpeechError error) {
  18. error.getPlainDescription(true) //获取错误码描述}
  19. //开始录音
  20. public void onBeginOfSpeech() {}
  21. //音量值0~30
  22. public void onVolumeChanged(int volume){}
  23. //结束录音
  24. public void onEndOfSpeech() {}
  25. //扩展用接口
  26. public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {}
  27. };

    2.5 语音交互动画

     为了便于快速开发,SDK还提供了一套默认的语音交互动画以及调用接口,如需使用请将SDK资源包assets路径下的资源文件拷贝至Android工程asstes目录下,然后通过以下代码使用交互动画:

  1. //1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
  2. RecognizerDialog iatDialog = new RecognizerDialog(this,mInitListener);
  3. //2.设置听写参数,同上节
  4. //3.设置回调接口
  5. iatDialog.setListener(recognizerDialogListener);
  6. //4.开始听写
  7. iatDialog.show();  

  三、语音合成

与语音听写相反,合成是将文字信息转化为可听的声音信息,让机器像人一样开口说话。合成的调用方法如下:

  1. //1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
  2. SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(context, null);
  3. //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
  4. mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
  5. mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
  6. mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100
  7. mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
  8. //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
  9. //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
  10. //如果不需要保存合成音频,注释该行代码
  11. mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
  12. //3.开始合成
  13. mTts.startSpeaking("科大讯飞,让世界聆听我们的声音", mSynListener);
  14. //合成监听器
  15. private SynthesizerListener mSynListener = new SynthesizerListener(){
  16. //会话结束回调接口,没有错误时,error为null
  17. public void onCompleted(SpeechError error) {}
  18. //缓冲进度回调
  19. //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
  20. public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}
  21. //开始播放
  22. public void onSpeakBegin() {}
  23. //暂停播放
  24. public void onSpeakPaused() {}
  25. //播放进度回调
  26. //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
  27. public void onSpeakProgress(int percent, int beginPos, int endPos) {}
  28. //恢复播放回调接口
  29. public void onSpeakResumed() {}
  30. //会话事件回调接口
  31. public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {} };

  四、代码整理

    上面只是按照官方文档把主要方法介绍一下。下面我自己整理了这两个功能。贴出源码供大家学习:

  1. import java.util.HashMap;
  2. import java.util.LinkedHashMap;
  3.  
  4. import org.json.JSONException;
  5. import org.json.JSONObject;
  6.  
  7. import com.iflytek.cloud.ErrorCode;
  8. import com.iflytek.cloud.InitListener;
  9. import com.iflytek.cloud.RecognizerListener;
  10. import com.iflytek.cloud.RecognizerResult;
  11. import com.iflytek.cloud.SpeechConstant;
  12. import com.iflytek.cloud.SpeechError;
  13. import com.iflytek.cloud.SpeechRecognizer;
  14. import com.iflytek.cloud.SpeechSynthesizer;
  15. import com.iflytek.cloud.SpeechUtility;
  16. import com.iflytek.cloud.SynthesizerListener;
  17. import com.iflytek.cloud.ui.RecognizerDialog;
  18. import com.iflytek.cloud.ui.RecognizerDialogListener;
  19. import com.iflytek.isvdemo.R;
  20. import android.annotation.SuppressLint;
  21. import android.app.Activity;
  22. import android.os.Bundle;
  23. import android.util.Log;
  24. import android.view.View;
  25. import android.view.View.OnClickListener;
  26. import android.widget.Button;
  27. import android.widget.EditText;
  28. import android.widget.Toast;
  29.  
  30. @SuppressLint("ShowToast")
  31. public class YuTestActivity extends Activity implements OnClickListener {
  32. private static String TAG = YuTestActivity.class.getSimpleName();
  33. // 用HashMap存储听写结果
  34. private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
  35. private EditText et_content;
  36. private Button bt_speech;
  37. private SpeechSynthesizer mTts;// 语音合成
  38. private SpeechRecognizer mIat;// 语音听写
  39. private Button bt_write;
  40. private RecognizerDialog iatDialog;//听写动画
  41. // 0 小燕 青年女声 中英文(普通话) xiaoyan
  42. // 1 默认 小宇 青年男声 中英文(普通话) xiaoyu
  43. // 2 凯瑟琳 青年女声 英文 catherine
  44. // 3 亨利 青年男声 英文 henry
  45. // 4 玛丽 青年女声 英文 vimary
  46. // 5 小研 青年女声 中英文(普通话) vixy
  47. // 6 小琪 青年女声 中英文(普通话) vixq xiaoqi
  48. // 7 小峰 青年男声 中英文(普通话) vixf
  49. // 8 小梅 青年女声 中英文(粤语) vixm xiaomei
  50. // 9 小莉 青年女声 中英文(台湾普通话) vixl xiaolin
  51. // 10 小蓉 青年女声 汉语(四川话) vixr xiaorong
  52. // 11 小芸 青年女声 汉语(东北话) vixyun xiaoqian
  53. // 12 小坤 青年男声 汉语(河南话) vixk xiaokun
  54. // 13 小强 青年男声 汉语(湖南话) vixqa xiaoqiang
  55. // 14 小莹 青年女声 汉语(陕西话) vixying
  56. // 15 小新 童年男声 汉语(普通话) vixx xiaoxin
  57. // 16 楠楠 童年女声 汉语(普通话) vinn nannan
  58. // 17 老孙 老年男声 汉语(普通话)
  59. private String[] voiceName = { "xiaoyan", "xiaoyu", "catherine", "henry",
  60. "vimary", "vixy", "xiaoqi", "vixf", "xiaomei", "xiaolin",
  61. "xiaorong", "xiaoqian", "xiaokun", "xiaoqiang", "vixying",
  62. "xiaoxin", "nannan", "vils" };
  63.  
  64. @Override
  65. protected void onCreate(Bundle savedInstanceState) {
  66. // TODO Auto-generated method stub
  67. super.onCreate(savedInstanceState);
  68. setContentView(R.layout.yuyin);
  69. et_content = (EditText) findViewById(R.id.et_content);
  70. bt_speech = (Button) findViewById(R.id.bt_speech);
  71. bt_write = (Button) findViewById(R.id.bt_write);
  72. bt_speech.setOnClickListener(this);
  73. bt_write.setOnClickListener(this);
  74. // 初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务
  75. SpeechUtility.createUtility(this, SpeechConstant.APPID + "=56f25de3");
  76. // 语音合成 1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
  77. mTts = SpeechSynthesizer.createSynthesizer(YuTestActivity.this,
  78. mTtsInitListener);
  79. // 语音听写1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
  80. mIat = SpeechRecognizer.createRecognizer(this, mTtsInitListener);
  81. // 1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
  82. iatDialog = new RecognizerDialog(this,
  83. mTtsInitListener);
  84.  
  85. }
  86.  
  87. /**
  88. * 初始化语音合成相关数据
  89. *
  90. * @Description:
  91. */
  92. public void starSpeech() {
  93. String content = et_content.getText().toString().trim();
  94.  
  95. // 2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
  96. mTts.setParameter(SpeechConstant.VOICE_NAME, voiceName[5]);// 设置发音人
  97. mTts.setParameter(SpeechConstant.SPEED, "50");// 设置语速
  98. mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围0~100
  99. mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置云端
  100. // 设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
  101. // 保存在SD卡需要在AndroidManifest.xml添加写SD卡权限
  102. // 如果不需要保存合成音频,注释该行代码
  103. mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
  104. // 3.开始合成
  105. mTts.startSpeaking(content, mSynListener);
  106. // 合成监听器
  107. //
  108.  
  109. }
  110.  
  111. /**
  112. * 初始化参数开始听写
  113. *
  114. * @Description:
  115. */
  116. private void starWrite() {
  117. // 2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类
  118. // 语音识别应用领域(:iat,search,video,poi,music)
  119. mIat.setParameter(SpeechConstant.DOMAIN, "iat");
  120. // 接收语言中文
  121. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
  122. // 接受的语言是普通话
  123. mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
  124. // 设置听写引擎(云端)
  125. mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
  126. iatDialog.setListener(mRecognizerDialogListener);
  127. iatDialog.show();
  128. Toast.makeText(getApplication(), "请开始说话…", Toast.LENGTH_SHORT).show();
  129. // 3.开始听写
  130. //mIat.startListening(mRecoListener);
  131. // 听写监听器
  132.  
  133. }
  134.  
  135. /**
  136. * 语音听写监听
  137. */
  138. private RecognizerListener mRecoListener = new RecognizerListener() {
  139. // 听写结果回调接口(返回Json格式结果,用户可参见附录12.1);
  140. // 一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;
  141. // 关于解析Json的代码可参见MscDemo中JsonParser类;
  142. // isLast等于true时会话结束。
  143. public void onResult(RecognizerResult results, boolean isLast) {
  144. Log.d(TAG, results.getResultString());
  145. printResult(results);
  146. }
  147.  
  148. // 会话发生错误回调接口
  149. public void onError(SpeechError error) {
  150. // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
  151. if(error.getErrorCode()==10118){
  152. Toast.makeText(getApplicationContext(), "你好像没有说话哦",
  153. Toast.LENGTH_SHORT).show();
  154. }
  155. Toast.makeText(getApplicationContext(), error.getPlainDescription(true),
  156. Toast.LENGTH_SHORT).show();
  157.  
  158. }// 获取错误码描述}
  159.  
  160. // 开始录音
  161. public void onBeginOfSpeech() {
  162. Log.d(TAG, "开始说话");
  163. Toast.makeText(getApplicationContext(), "开始说话",
  164. Toast.LENGTH_SHORT).show();
  165. }
  166.  
  167. // 结束录音
  168. public void onEndOfSpeech() {
  169. Log.d(TAG, "说话结束");
  170. Toast.makeText(getApplicationContext(), "说话结束",
  171. Toast.LENGTH_SHORT).show();
  172. }
  173.  
  174. // 扩展用接口
  175. public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
  176. }
  177.  
  178. //音量
  179. @Override
  180. public void onVolumeChanged(int volume, byte[] data) {
  181. // TODO Auto-generated method stub
  182. Log.d(TAG, "当前说话音量大小"+volume);
  183.  
  184. }
  185.  
  186. };
  187.  
  188. /**
  189. * 听写UI监听器
  190. */
  191. private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
  192. public void onResult(RecognizerResult results, boolean isLast) {
  193. printResult(results);
  194. }
  195.  
  196. /**
  197. * 识别回调错误.
  198. */
  199. public void onError(SpeechError error) {
  200. Toast.makeText(getApplication(), error.getPlainDescription(true), Toast.LENGTH_SHORT).show();
  201. }
  202.  
  203. };
  204. /**
  205. * 语音合成监听
  206. */
  207. private SynthesizerListener mSynListener = new SynthesizerListener() {
  208. // 会话结束回调接口,没有错误时,error为null
  209. public void onCompleted(SpeechError error) {
  210. if (error != null) {
  211. Log.d("mySynthesiezer complete code:", error.getErrorCode()
  212. + "");
  213. } else {
  214. Log.d("mySynthesiezer complete code:", "0");
  215. }
  216. }
  217.  
  218. // 缓冲进度回调
  219. // percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
  220. public void onBufferProgress(int percent, int beginPos, int endPos,
  221. String info) {
  222. }
  223.  
  224. // 开始播放
  225. public void onSpeakBegin() {
  226. }
  227.  
  228. // 暂停播放
  229. public void onSpeakPaused() {
  230. }
  231.  
  232. // 播放进度回调
  233. // percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
  234. public void onSpeakProgress(int percent, int beginPos, int endPos) {
  235. }
  236.  
  237. // 恢复播放回调接口
  238. public void onSpeakResumed() {
  239. }
  240.  
  241. // 会话事件回调接口
  242. public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
  243. }
  244. };
  245.  
  246. /**
  247. * 初始化语音合成监听。
  248. */
  249. private InitListener mTtsInitListener = new InitListener() {
  250. @SuppressLint("ShowToast")
  251. @Override
  252. public void onInit(int code) {
  253. Log.d(TAG, "InitListener init() code = " + code);
  254. if (code != ErrorCode.SUCCESS) {
  255. // showTip("初始化失败,错误码:" + code);
  256. Toast.makeText(getApplicationContext(), "初始化失败,错误码:" + code,
  257. Toast.LENGTH_SHORT).show();
  258. } else {
  259. // 初始化成功,之后可以调用startSpeaking方法
  260. // 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
  261. // 正确的做法是将onCreate中的startSpeaking调用移至这里
  262. }
  263. }
  264. };
  265.  
  266. @Override
  267. public void onClick(View v) {
  268. // TODO Auto-generated method stub
  269. switch (v.getId()) {
  270. case R.id.bt_speech:
  271. starSpeech();
  272. break;
  273. case R.id.bt_write:
  274. et_content.setText(null);
  275. mIatResults.clear();
  276. starWrite();
  277. break;
  278. default:
  279. break;
  280. }
  281.  
  282. }
  283.  
  284. private void printResult(RecognizerResult results) {
  285. String text = JsonParser.parseIatResult(results.getResultString());
  286.  
  287. String sn = null;
  288. // 读取json结果中的sn字段
  289. try {
  290. JSONObject resultJson = new JSONObject(results.getResultString());
  291. sn = resultJson.optString("sn");
  292. } catch (JSONException e) {
  293. e.printStackTrace();
  294. }
  295.  
  296. mIatResults.put(sn, text);
  297.  
  298. StringBuffer resultBuffer = new StringBuffer();
  299. for (String key : mIatResults.keySet()) {
  300. resultBuffer.append(mIatResults.get(key));
  301. }
  302.  
  303. et_content.setText(resultBuffer.toString());
  304. et_content.setSelection(et_content.length());
  305. }
  306.  
  307. }

xml文件就一个EditText和两个button就不贴了还有一个JsonParser类sdk文档中sample中有

结束

  讯飞语音还有很多好玩的功能,比如人脸识别、声纹识别、语音唤醒等大家看看文档都很好实现的

Android集成科大讯飞SDK语音听写及语音合成功能实现的更多相关文章

  1. UI进阶 科大讯飞(1) 语音听写(语音转换成文字)

    一.科大讯飞开放平台: http://www.xfyun.cn/ 注册.登录之后创建新应用. 因为本项目只实现了语音听写,所以在SDK下载中心勾选语音听写单项SDK就可以了 开发平台选择iOS,应用选 ...

  2. Android集成讯飞语音、百度语音、阿里语音识别

    项目实践:https://blog.csdn.net/Jsagacity/article/details/80094164 demo下载地址:https://fir.im/jy28 demo源码:ht ...

  3. 科大讯飞sdk语音合成工具类

    注:主要是dll文件的配置 A:Java SDK 使用了 JNI 形式,在初始化 SDK 时,SDK 将加载共享库(Windows下为msc32.dll或msc64.dll文件,Linux下libms ...

  4. Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)

    1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...

  5. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  6. 集成Android免费语音合成功能(在线、离线、离在线融合)

    集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离线)集成Android免费语音合成功能(在线.离线.离在线融合),有这一篇文章就够了(离在线融合) 转眼间,大半年没 ...

  7. Unity3D集成腾讯语音GVoice SDK

    友情提示:最近发现腾讯GVoice有另一个官网,叫做腾讯游戏服务,经过对比发现这个网站才是最新的,下面我介绍的那个估计是已经废弃的,但不知道为啥老的网站没有直接链接到新网址而是仍然保留了.不过新官网的 ...

  8. AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能

    在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...

  9. 大叔也说Xamarin~Android篇~支付宝SDK的集成

    回到目录 首先做为支付宝SDK它提供了多种平台,网页版,wap版,IOS版,android版等等,今天主要说一下在xamarin里使用android平台的sdk的方法,在网上介绍这块的文章不多,大叔本 ...

随机推荐

  1. WebApplication和WebSite的区别

    不同点 1. 创建方式不同 一个是FILE->NEW->PROJECT->ASP.NET WEB APPLICATION 另外一个是 FILE->NEW->WEBSITE ...

  2. 《JavaScript 闯关记》之 DOM(上)

    DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API.DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 节点层次 DOM 可以将任何 HTML 或 XM ...

  3. jquery 图片比例不变,全屏居中

    <!DOCTYPE html> <html> <head> <meta charset="gb2312"> <title> ...

  4. ASP.NET MVC:自定义 Route 生成小写 Url(转)

    先给出本文中测试用的 controller: public class PersonsController : Controller { public ActionResult Query(strin ...

  5. Android-------设置TextView同时显示图片和文本,并控制图片大小

    //获取资源图片     Drawable leftDrawable = getResources().getDrawable(R.drawable.comment_parise);     //设置 ...

  6. sqlserver2012一直显示正在还原(Restoring)和从单用户转换成多用户模式(单用户连接中)

    如果不需要还原,则使用: restore database test with recovery如果只需要还原,则使用: restore database test with norecovery U ...

  7. poj1200Crazy Search (哈希)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Crazy Search Time Limit: 1000MS   Memory ...

  8. UVALive 4119 Always an integer (差分数列,模拟)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Always an integer Time Limit:3000MS     M ...

  9. discuz x2 个人资料项排序问题解决方法、添加自定义字段、修改栏目名称和介绍

    第一次写文章,希望与人提供方便同时,别误人子弟,自己研究的,大家看不懂只改文件就可以了,如果发现不对的地方请回复或直接通知我,谢谢,本来想在discuz论坛上发的,不懂版规也没时间看版规,怕发错,隔小 ...

  10. solr源码导入eclipse

    转载自:http://blog.csdn.net/vltic/article/details/19917377 (1)相应的开发环境准备          (1)jdk1.6+的安装和环境变量配置(命 ...