awaken_offline_example.cpp
Go to the documentation of this file.
2 #include <iostream>
3 #include <thread>
4 // awaken module
6 // base_path表示到xbot_talker的绝对或者相对路径.
7 const std::string base_path = "../../..";
8 const int ONE_CHANNEL = 1; // 单声道
9 const int TWO_CHANNEL = 2; // 双声道测试只能用于读取已有pcm文件识别
10 
11 typedef enum AWAKEN_MODE {
14 
15 } AWAKEN_MODE;
16 
17 void usage(int& awaken_mode)
18 {
19  std::cout << "--------- awaken demo ------------" << std::endl;
20  std::cout << "这是离线唤醒功能的示例demo.\n唤醒词:“小德小德”\n你可以选择通过已录好的pcm文件或者实时录音进行唤醒测试."
21  << std::endl;
22  std::cout << "0:选择已录好的pcm音频文件进行唤醒测试;" << std::endl;
23  std::cout << "1:通过实时录音进行唤醒测试." << std::endl;
24  std::cout << "请输入0或1选择不同方式:" << std::endl;
25  std::cout << "awaken_mode :_\b";
26  std::cin >> awaken_mode;
27 }
28 
30 {
31  while (true)
32  {
33  if (awaken_demo.is_awaken)
34  {
35  // 播放提示音提醒唤醒成功
36  std::string dialogue_prompt_wav = "play " + base_path + "/defaultconfig/audio/wozai.wav";
37  system(dialogue_prompt_wav.c_str());
38  // 唤醒后再切换至为唤醒状态等待下次唤醒
39  awaken_demo.is_awaken = false;
40  break;
41  }
42  else
43  {
44  continue;
45  }
46  }
47 }
48 
50 {
51  while (true)
52  {
53  if (awaken_demo.is_awaken)
54  { // 检测到唤醒后停止录音
55  awaken_demo.stopRecordThroughMIC();
56  // 将录音文件保存到xbot_talker/cache/pcm/目录
57  awaken_demo.saveRecordDataToFile();
58  // 播放提示音提醒唤醒成功
59  std::string dialogue_prompt_wav = "play " + base_path + "/defaultconfig/audio/wozai.wav";
60  system(dialogue_prompt_wav.c_str());
61  // 唤醒后再切换至为唤醒状态等待下次唤醒
62  awaken_demo.is_awaken = false;
63  break;
64  }
65  else
66  {
67  continue;
68  }
69  }
70 }
71 
72 int main(int argc, char** argv)
73 {
74  int awaken_mode;
75  usage(awaken_mode);
76  // pcm_file表示用于用于作为输入的音频文件,默认为xbot_talker/defaultconfig/audio/awaken.pcm.
77  std::string pcm_file = base_path + "/defaultconfig/audio/awaken.pcm";
78  // channel 音频声道数.1表示单声道.
79  int channel = 1;
80 
81  if (awaken_mode == READ_PCM_FILE_TO_ASR)
82  {
83  /*** 选择已录好的pcm音频文件进行唤醒测试 ***/
84  // 启动检测是否已被唤醒的线程
85  std::thread check_0(isWaken_file);
86  std::cout << "请输入用于测试的pcm文件,若输入为d,则用默认的文件进行唤醒测试:";
87  std::cin >> pcm_file;
88  if (pcm_file == "d")
89  {
90  pcm_file = base_path + "/defaultconfig/audio/awaken.pcm";
91  // 科大讯飞离线唤醒登录以及参数设置
92  awaken_demo.loginAndSetParams(base_path, pcm_file, ONE_CHANNEL);
93  }
94  else
95  {
96  // 科大讯飞离线唤醒登录以及参数设置
97  awaken_demo.loginAndSetParams(base_path, pcm_file, ONE_CHANNEL);
98  }
99  // 离线唤醒模块的初始化
100  awaken_demo.awakenInit();
101  // 获取pcm_file的数据
102  awaken_demo.getPcmFileData();
103  // 将pcm数据循环进行唤醒检测
104  awaken_demo.dataLoopAwaken();
105  check_0.join();
106  // 一次离线唤醒结束后释放资源
107  awaken_demo.uninitAsr();
108  }
109  else if (awaken_mode == RECORDE_TO_ASR)
110  {
111  /*** 通过实时录音进行测试 ***/
112  // 启动检测是否已被唤醒的线程
113  std::thread check_1(isWaken_mic);
114  // 科大讯飞离线唤醒登录以及参数设置
115  awaken_demo.loginAndSetParams(base_path, pcm_file, channel);
116  // 离线唤醒模块的初始化
117  awaken_demo.awakenInit();
118  // record_time 录音时长(s),可修改
119  float record_time = 120;
120  // enable_record_save是否将录音保存到pcm文件
121  bool enable_record_save = true;
122  // 录音并进行语音唤醒
123  awaken_demo.recordThroughMIC(record_time, enable_record_save);
124  check_1.join();
125  // 一次离线唤醒结束后释放资源
126  awaken_demo.uninitAsr();
127  }
128  else
129  {
130  std::cout << "无效的awaken_mode模式的选择!!!" << std::endl;
131  exit(1);
132  }
133 }
static bool is_awaken
const int TWO_CHANNEL
const int ONE_CHANNEL
void recordThroughMIC(const float record_time, bool enable_audio_save)
录音并进行语音唤醒.
科大讯飞离线唤醒模块接口定义头文件. TODO: 还需要添加版权、版本等信息
void dataLoopAwaken()
将音频数据循环写入科大讯飞接口进行离线唤醒.
void uninitAsr()
一次离线唤醒结束后释放资源.
void awakenInit()
科大讯飞离线唤醒模块的初始化.
void usage(int &awaken_mode)
const std::string base_path
void getPcmFileData()
读取pcm文件里的音频数据,并将数据的内容和数据大小存入pcm_data_结构体.
void loginAndSetParams(const std::string base_path, const std::string pcm_file, const int channel)
科大讯飞离线唤醒登录以及参数设置.
void saveRecordDataToFile()
把录音数据存入/cache/pcm/目录下的pcm文件里,以次序和时间命名.
void stopRecordThroughMIC()
关闭录音设备.
void isWaken_file()
AwakenOffline awaken_demo
int main(int argc, char **argv)
void isWaken_mic()


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