asr_example.cpp
Go to the documentation of this file.
3 #include "common_config.h"
4 #include <iostream>
5 #include <thread>
6 // xunfei asr module
7 // base_path表示到xbot_talker的绝对或者相对路径.
8 const std::string base_path = "../../..";
9 const int ONE_CHANNEL = 1; // 单声道
10 const int TWO_CHANNEL = 2; // 双声道测试只能用于读取已有pcm文件识别
11 
12 typedef enum ASR_MODULE {
15 } ASR_MODULE;
16 
17 typedef enum ASR_MODE {
20 } ASR_MODE;
21 
22 void usage(int& asr_module, int& asr_mode)
23 {
24  std::cout << "--------- xunfei asr demo ------------" << std::endl;
25  std::cout << "这是科大讯飞在线语音识别功能/离线语法识别的示例demo." << std::endl;
26  std::cout << "你可以选择在线语音识别功能或者离线语法识别功能." << std::endl;
27  std::cout << "0:在线语音识别功能;" << std::endl;
28  std::cout << "1:离线语法识别功能." << std::endl;
29  std::cout << "请输入0或1选择不同功能:" << std::endl;
30  std::cout << "asr_module :_\b";
31  std::cin >> asr_module;
32  std::cout << "------------------------------" << std::endl;
33  std::cout << "你可以选择通过已录好的pcm文件或者实时录音进行语音识别测试." << std::endl;
34  std::cout << "0:选择已录好的pcm音频文件进行唤醒测试;" << std::endl;
35  std::cout << "1:通过实时录音进行测试." << std::endl;
36  std::cout << "请输入0或1选择不同方式:" << std::endl;
37  std::cout << "asr_mode :_\b";
38  std::cin >> asr_mode;
39 }
40 
41 // 在线语音识别:选择已录好的pcm音频文件进行ASR
42 void fileToASR(const std::string asr_param, const std::string pcm_file)
43 {
44  XfeiSpeechRecog xfei_sr_online;
45  // 保存语音识别结果
46  std::string xfei_online_result = "none_result";
47  xfei_sr_online.setAsrParams(base_path, pcm_file, asr_param, ONE_CHANNEL);
48  // 科大讯飞识别模块的初始化
49  xfei_sr_online.initAsr();
50  // 获取pcm_file的数据
51  xfei_sr_online.getPcmFileData();
52  // 将全部音频数据循环写入科大讯飞接口进行识别并获取完整的识别结果
53  xfei_online_result = xfei_sr_online.dataLoopRecog();
54  std::cout << "在线语音识别结果:" << xfei_online_result << std::endl;
55  // 一次识别结束后释放资源
56  xfei_sr_online.uninitAsr();
57 }
58 
59 // 在线语音识别:通过实时录音进行测试ASR
60 void recordToASR(const std::string asr_param, const std::string pcm_file)
61 {
62  // pcm数据的内容和数据大小
63  struct DataBuff pcm_buff = { NULL, 0 };
64  XfeiSpeechRecog xfei_sr_online;
65  // 保存语音识别结果
66  char* xfei_online_result = NULL;
67  xfei_sr_online.setAsrParams(base_path, pcm_file, asr_param, ONE_CHANNEL);
68  // 科大讯飞识别模块的初始化
69  xfei_sr_online.initAsr();
70  // record_time 录音时长(s),可修改
71  float record_time = 3.5;
72  // enable_record_save是否将录音保存到pcm文件
73  bool enable_record_save = true;
74  pcm_buff = xfei_sr_online.recordThroughMIC(record_time, enable_record_save);
75  xfei_sr_online.getPCMData(pcm_buff);
76  // 将全部音频数据循环写入科大讯飞接口进行识别并获取完整的识别结果
77  xfei_online_result = xfei_sr_online.dataLoopRecog();
78  std::cout << "在线语音识别结果:" << xfei_online_result << std::endl;
79  // 一次识别结束后释放资源
80  xfei_sr_online.uninitAsr();
81 }
82 
83 // 离线语音识别:选择已录好的pcm音频文件进行ASR
84 void fileToASROffline(const std::string asr_param, const std::string pcm_file)
85 {
86  XfeiSpeechRecog xfei_sr_offline;
87  // 保存语音识别结果json
88  char* recog_result_json = NULL;
89  xfei_sr_offline.setAsrParams(base_path, pcm_file, asr_param, ONE_CHANNEL);
90  // 科大讯飞识别模块的初始化
91  xfei_sr_offline.initAsr();
92  // 获取pcm_file的数据
93  xfei_sr_offline.getPcmFileData();
94  // 将全部音频数据循环写入科大讯飞接口进行识别并获取完整的json识别结果
95  recog_result_json = xfei_sr_offline.dataLoopRecog();
96  // 保存解析出的识别结果和置信度
97  std::vector<std::string> offline_result_vector(2);
98  if (recog_result_json == NULL)
99  {
100  offline_result_vector[0] = "none_result";
101  offline_result_vector[1] = "0";
102  }
103  else
104  {
105  // 在识别结果不为空时,从json结果中解析出需要的结果和置信度
106  offline_result_vector = xfei_sr_offline.resultFromJson();
107  }
108  std::cout << "离线语法识别结果:" << offline_result_vector[0] << " 置信度:" << offline_result_vector[1] << std::endl;
109  // 一次识别结束后释放资源
110  xfei_sr_offline.uninitAsr();
111 }
112 
113 // 离线语音识别:通过实时录音进行测试ASR
114 void recordToASROffline(const std::string asr_param, const std::string pcm_file)
115 {
116  // pcm数据的内容和数据大小
117  struct DataBuff pcm_buff = { NULL, 0 };
118  XfeiSpeechRecog xfei_sr_offline;
119  // 保存语音识别结果json
120  char* recog_result_json = NULL;
121  xfei_sr_offline.setAsrParams(base_path, pcm_file, asr_param, ONE_CHANNEL);
122  // 科大讯飞识别模块的初始化
123  xfei_sr_offline.initAsr();
124  // record_time 录音时长(s),可修改
125  float record_time = 3.5;
126  // enable_record_save是否将录音保存到pcm文件
127  bool enable_record_save = true;
128  // 固定时长录音
129  pcm_buff = xfei_sr_offline.recordThroughMIC(record_time, enable_record_save);
130  xfei_sr_offline.getPCMData(pcm_buff);
131  // 将全部音频数据循环写入科大讯飞接口进行识别并获取完整的json识别结果
132  recog_result_json = xfei_sr_offline.dataLoopRecog();
133  // 保存解析出的识别结果和置信度
134  std::vector<std::string> offline_result_vector(2);
135  if (recog_result_json == NULL)
136  {
137  offline_result_vector[0] = "none_result";
138  offline_result_vector[1] = "0";
139  }
140  else
141  {
142  // 在识别结果不为空时,从json结果中解析出需要的结果和置信度
143  offline_result_vector = xfei_sr_offline.resultFromJson();
144  }
145  std::cout << "离线语法识别结果:" << offline_result_vector[0] << " 置信度:" << offline_result_vector[1] << std::endl;
146  // 一次识别结束后释放资源
147  xfei_sr_offline.uninitAsr();
148 }
149 
150 // 科大讯飞离线语法识别构建语法
152 {
153  // 生成的语法文件储存路径,与用户自定义文件存放在同意文件夹下
154  std::string grammar_file = base_path + "/cache/grammar_config";
155  // 使用制定路径存放 grammar.bnf 文件(默认存放在 xbot_talker/cache/grammar_config/grammar)
156  std::string grammar_build_path = grammar_file + "/grammar";
157  grammar_file = grammar_file + "/grammar.bnf";
159  UserData asr_data;
160  // 讯飞语音sdk参数配置
161  //这个路径前必须加一个fo|,否则就会语法构建不通过
162  string asr_res_path = "fo|res/asr/common.jet";
163  // 调用 build_grammar 函数,生成语法文件
164  build_grammar.buildGrammar(&asr_data, base_path, grammar_build_path, asr_res_path, grammar_file);
165 }
166 
167 int main(int argc, char** argv)
168 {
169  int asr_module;
170  int asr_mode;
171  usage(asr_module, asr_mode);
172  // pcm_file表示用于用于作为输入的音频文件,默认为xbot_talker/defaultconfig/audio/nihao_test.pcm.
173  const std::string default_pcm_file = base_path + "/defaultconfig/audio/nihao_test.pcm";
174  // 科大讯飞asr登录
175  CommonConfig& xunfei_config = CommonConfig::get_instance();
176  xunfei_config.loginToXunfei(base_path);
177 
178  if (asr_module == ASR_ONLINE)
179  { /******************* 在线语音识别功能 ********************/
180 
181  // 设置科大讯飞在线语音识别相关参数
182  std::string xfei_online_asr_params_ = "sub = iat, domain = iat, language = zh_cn, "
183  "accent = mandarin, sample_rate = 16000, "
184  "result_type = plain, result_encoding = utf8";
185 
186  if (asr_mode == READ_PCM_FILE_TO_ASR)
187  {
188  // 选择已录好的pcm音频文件进行测试
189  std::string pcm_file;
190  std::cout << "------------------------------" << std::endl;
191  std::cout << "请输入用于测试的pcm文件,若输入为d,则用默认的文件进行测试:";
192  std::cin >> pcm_file;
193  if (pcm_file == "d")
194  {
195  pcm_file = default_pcm_file;
196  }
197  fileToASR(xfei_online_asr_params_, pcm_file);
198  }
199  else if (asr_mode == RECORDE_TO_ASR)
200  { // 通过实时录音进行测试
201  recordToASR(xfei_online_asr_params_, default_pcm_file);
202  }
203  }
204  else if (asr_module == ASR_OFFLINE)
205  {
206  /******************* 离线语法识别功能 ********************/
207  // 构建语法
208  build_grammar();
209  // 语法参数配置
210  std::string grammar_path = base_path + "/cache/grammar_config";
211  std::string asr_params = xunfei_config.configGramParas(base_path, grammar_path);
212 
213  if (asr_mode == READ_PCM_FILE_TO_ASR)
214  {
215  // 选择已录好的pcm音频文件进行测试
216  std::string pcm_file;
217  std::cout << "------------------------------" << std::endl;
218  std::cout << "请输入用于测试的pcm文件,若输入为d,则用默认的文件进行测试:";
219  std::cin >> pcm_file;
220  if (pcm_file == "d")
221  {
222  pcm_file = base_path + "/defaultconfig/audio/nihao_test.pcm";
223  }
224  fileToASROffline(asr_params, pcm_file);
225  }
226  else if (asr_mode == RECORDE_TO_ASR)
227  {
228  //通过实时录音进行测试
229  recordToASROffline(asr_params, default_pcm_file);
230  }
231  }
232  else
233  {
234  std::cout << "无效的功能模式的选择!!!" << std::endl;
235  exit(1);
236  }
237 }
void fileToASROffline(const std::string asr_param, const std::string pcm_file)
Definition: asr_example.cpp:84
void usage(int &asr_module, int &asr_mode)
Definition: asr_example.cpp:22
void recordToASROffline(const std::string asr_param, const std::string pcm_file)
void initAsr()
科大讯飞识别模块的初始化.
static CommonConfig & get_instance()
void uninitAsr()
一次识别结束后释放资源.
void fileToASR(const std::string asr_param, const std::string pcm_file)
Definition: asr_example.cpp:42
void loginToXunfei(const std::string base_path)
科大讯飞语音识别模块接口头文件. TODO: 还需要添加版权、版本等信息
int main(int argc, char **argv)
void recordToASR(const std::string asr_param, const std::string pcm_file)
Definition: asr_example.cpp:60
char * dataLoopRecog()
将全部音频数据循环写入科大讯飞接口进行识别并获取完整的json识别结果.
void build_grammar()
XfeiSpeechRecog asr_module
struct DataBuff recordThroughMIC(const float record_time, bool enable_audio_save)
录音接口.
const int TWO_CHANNEL
Definition: asr_example.cpp:10
ASR_MODULE
Definition: asr_example.cpp:12
void setAsrParams(const std::string base_path, const std::string pcm_file, const std::string params, const int channel)
设置语音模块需外部传入的路径等参数.
std::string configGramParas(const std::string base_path, const std::string grammar_file)
const std::string base_path
Definition: asr_example.cpp:8
void buildGrammar(UserData *udata, const string base_path, const string grammar_build_path, const string asr_res_path, const string grammar_file)
std::vector< std::string > resultFromJson()
从完整的json语音识别结果中解析出需要的字符串结果和置信度值.
void getPcmFileData()
读取pcm文件里的音频数据,并将数据的内容和数据大小存入pcm_data_.
void getPCMData(struct DataBuff pcm_buff)
获取pcm数据接口.
const int ONE_CHANNEL
Definition: asr_example.cpp:9
ASR_MODE
Definition: asr_example.cpp:17


xbot_talker
Author(s): wangxiaoyun
autogenerated on Sat Oct 10 2020 03:27:53