From 09957d455d283b6f9007043d426cea8c5b40fae5 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 16 Mar 2023 17:07:04 +0800 Subject: [PATCH] update --- CMakeLists.txt | 8 ++++++-- dep/zlinuxcomponents | 2 +- env/speaker_control.sh | 14 +++++++++----- sh/packet.sh | 2 +- src/main.cpp | 4 ++-- src/service/main_control_service.cpp | 15 +++++++++++---- src/service/main_control_service.hpp | 5 +++++ src/service/voiceprocess/audio_logging_service.cpp | 2 +- .../voiceprocess/beforewakeup_voiceprocesser.cpp | 15 ++++++++++++++- .../voiceprocess/beforewakeup_voiceprocesser.hpp | 5 +++++ src/service/voiceprocess/wakeup_processer.cpp | 17 ++++++++++++++--- src/service/voiceprocess/wakeup_processer.hpp | 5 ++++- 12 files changed, 73 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86bfb4c..62d5b30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -101,7 +101,11 @@ zadd_executable_simple( ) zadd_executable_simple(TARGET alsaplayer_main.out SRC - dep/zlinuxcomponents/alsaplayer/alsaplayer_main.cpp) + dep/zlinuxcomponents/alsaplayer/test_alsaplayer_main.cpp) zadd_executable_simple(TARGET audio_recorder_main.out SRC dep/zlinuxcomponents/audio/audio_recorder_main.cpp) -zadd_executable_simple(TARGET test_asr_main.out SRC dep/zlinuxcomponents/aiui_ws/aiui_main.c) +zadd_executable_simple(TARGET test_asr_main.out SRC + dep/zlinuxcomponents/aiui_ws/aiui_main.c) +zadd_executable_simple( + TARGET test_smart_soundbox_player.out SRC + dep/zlinuxcomponents/alsaplayer/test_smart_soundbox_player.cpp) diff --git a/dep/zlinuxcomponents b/dep/zlinuxcomponents index 12989cd..7712be1 160000 --- a/dep/zlinuxcomponents +++ b/dep/zlinuxcomponents @@ -1 +1 @@ -Subproject commit 12989cdd5a45d6279ead3278aac7f4dd97af0824 +Subproject commit 7712be17e4276764ca5d76281b69b457be7ca379 diff --git a/env/speaker_control.sh b/env/speaker_control.sh index 22f0a09..2b0271e 100644 --- a/env/speaker_control.sh +++ b/env/speaker_control.sh @@ -1,12 +1,16 @@ #!/bin/bash # -# 引脚编号:GPIO2-A3 +# 引脚编号:GPIO2-A3 # Linux中对应的编号: 32*2 + (A-A)*8 + 3 = GPIO67 # - # 配置GPIO1_D4 -echo 60 > /sys/class/gpio/export -echo out > /sys/class/gpio/gpio60/direction -echo 1 > /sys/class/gpio/gpio60/value +if [ ! -d /sys/class/gpio/gpio60 ]; then + echo 60 >/sys/class/gpio/export +fi +echo out >/sys/class/gpio/gpio60/direction +# 复位下芯片 +echo 0 >/sys/class/gpio/gpio60/value +sleep 1 +echo 1 >/sys/class/gpio/gpio60/value diff --git a/sh/packet.sh b/sh/packet.sh index 3467477..1ae8bf2 100755 --- a/sh/packet.sh +++ b/sh/packet.sh @@ -55,7 +55,7 @@ cd $PROJECT_PATH/env/ && cp --path -rf ./* $PACKET_DIR/ ########################打包自定义的东西############################## #################################################################### # 下载唤醒词模型 -wget_and_unzip xiaomaoxiaomao ftp://zftpuser:zftpzwsd@192.168.1.2/zwsd/manufacturer_mycroft/hotworld/xiaomaoxiaomao/xiaomaoxiaomao_module_20220519.tar.gz +wget_and_unzip xiaomaoxiaomao ftp://zftpuser:zftpzwsd@192.168.1.2/zwsd/manufacturer_mycroft/hotworld/xiaomaoxiaomao/xiaomaoxiaomao_module_20220609.tar.gz # 下载唤醒词引擎 wget_and_unzip precise 192.168.1.2:8021/manufacturer_mycroft/mycroft-precise-release/precise-all_0.3.0_aarch64.tar.gz # 下载唤醒词语音 diff --git a/src/main.cpp b/src/main.cpp index 1e2eee3..0c3a6d7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -150,7 +150,7 @@ void Main::buildVoiceProcessService() { // WakeupProcesser BUILD_AND_REG_SERRVICE(WakeupProcesser); - GET_SERVICE(WakeupProcesser)->initialize("./precise/precise-engine", "xiaomaoxiaomao/xiaomaoxiaomao.pb"); + GET_SERVICE(WakeupProcesser)->initialize("./precise/precise-engine", "xiaomaoxiaomao/xiaomaoxiaomao.pb", "1600"); // AsrProcesser const char *appid = "5938b7c7"; // 应用ID,在AIUI开放平台创建并设置 @@ -175,7 +175,7 @@ int Main::main(int argc, char *argv[]) { // 播放器-SmartSoundBoxPlayer BUILD_AND_REG_SERRVICE(SmartSoundBoxPlayer); - GET_SERVICE(SmartSoundBoxPlayer)->initialize(80); + GET_SERVICE(SmartSoundBoxPlayer)->initialize(50, 50); /** * @brief 其他服务 */ diff --git a/src/service/main_control_service.cpp b/src/service/main_control_service.cpp index 0b2a0b7..e644f00 100644 --- a/src/service/main_control_service.cpp +++ b/src/service/main_control_service.cpp @@ -28,6 +28,7 @@ void MainControlService::initialize() { GET_TO_SERVICE(m_wakeupProcesser); GET_TO_SERVICE(m_audioRecoderService); GET_TO_SERVICE(m_audioLoggingService); + GET_TO_SERVICE(m_smartSoundboxPlayer); // 监听从webservice来的websocket消息 m_zwebService->startWork([this](const json& command, json& receipt) { @@ -40,16 +41,20 @@ void MainControlService::initialize() { } }); + m_beforeWakeupVoiceProcesser->setAmplifyDB(20); + + m_wakeupProcesser->onWakeupSignal.connect([this](float wakeup_score) { + logger->info("onWakeupSignal wakeup_score {}", wakeup_score); + m_smartSoundboxPlayer->triggerWakeup(); + }); + m_audioRecoderService->onRecordData.connect([this](shared_ptr audioClip) { if (!audioClip) { logger->error("onRecordData audioClip is null"); return; } - logger->info("onRecordData {}", audioClip->size()); - // 1. 保存此阶段语音到文件中 m_audioLoggingService->loggerMICVoice(audioClip); - // voice -> before wakeup m_beforeWakeupVoiceProcesser->writeVoice(audioClip); }); @@ -60,7 +65,9 @@ void MainControlService::initialize() { return; } m_audioLoggingService->loggerBeforeWakeupVoice(audioClip); - logger->info("onAfterProcessVoice {}", audioClip->size()); + // voice -> wakeup + // logger->info("before wakeup voice processer process voice size {}", audioClip->size()); + m_wakeupProcesser->processVoice(audioClip->data(), audioClip->size()); }); m_audioRecoderService->startRecord(); diff --git a/src/service/main_control_service.hpp b/src/service/main_control_service.hpp index b0a2211..872c943 100644 --- a/src/service/main_control_service.hpp +++ b/src/service/main_control_service.hpp @@ -26,6 +26,9 @@ #include "zservice_container/zservice_container.hpp" #include "zwebservice/zwebservice.hpp" +// +#include "zlinuxcomponents/alsaplayer/smart_soundbox_player.hpp" + /** * @brief * @@ -53,6 +56,8 @@ class MainControlService : public enable_shared_from_this { shared_ptr m_audioRecoderService; shared_ptr m_audioLoggingService; + shared_ptr m_smartSoundboxPlayer; + typedef enum { kzwebService, } fromwhere_t; diff --git a/src/service/voiceprocess/audio_logging_service.cpp b/src/service/voiceprocess/audio_logging_service.cpp index 253e435..909f259 100644 --- a/src/service/voiceprocess/audio_logging_service.cpp +++ b/src/service/voiceprocess/audio_logging_service.cpp @@ -48,7 +48,7 @@ void AudioLoggingService::loggerMICVoice(shared_ptr audioClip) { cleanupLogVoiceByTime("./voice/rt/mic_voice_*.wav", RT_STORAGE_CLIP_NUMS); m_rtMicVoiceFile.reset(new WavRecorder("./voice/rt/mic_voice_" + gettimestamp() + ".wav")); m_rtMicVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); - m_rtMicVoiceFile->dumpheader(logger); + // m_rtMicVoiceFile->dumpheader(logger); m_rtMicVoiceFile->writeVoice(audioClip); } else { m_rtMicVoiceFile->writeVoice(audioClip); diff --git a/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp b/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp index 55e2a6a..8c998a7 100644 --- a/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp +++ b/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp @@ -26,13 +26,26 @@ void BfWakeupVProcesser::processVoice(shared_ptr audioClip) { } vector voice; audioClip->getOneCHVoice(voice, 0); - + + ZCHECK(audioClip->getFormat() == S16_LE, "audioClip format is not S16_LE"); + + int16_t *p = (int16_t *)voice.data(); + for (int i = 0; i < voice.size() / 2; i++) { + p[i] = p[i] * m_amplify; + } + shared_ptr afterProcessAudioClip = make_shared((uint8_t *)voice.data(), voice.size(), 1, audioClip->getRate(), audioClip->getFormat()); onAfterProcessVoice(afterProcessAudioClip); } +void BfWakeupVProcesser::setAmplify(float amplify) { + logger->info("BfWakeupVProcesser::setAmplify amplify={}", amplify); + m_amplify = amplify; +} +void BfWakeupVProcesser::setAmplifyDB(float amplifydb) { m_amplify = pow(10, amplifydb / 20); } + void BfWakeupVProcesser::writeVoice(shared_ptr audioClip) { ZCHECK(audioClip != nullptr, "audioClip is null"); ZCHECK(audioClip->getFormat() == S16_LE, "audioClip format is not S16_LE"); diff --git a/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp b/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp index 9a4ece5..77842ca 100644 --- a/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp +++ b/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp @@ -40,6 +40,8 @@ class BfWakeupVProcesser : public enable_shared_from_this { unique_ptr m_thread; + float m_amplify = 1.0; + public: nod::signal audioClip)> onAfterProcessVoice; @@ -47,6 +49,9 @@ class BfWakeupVProcesser : public enable_shared_from_this { void initialize(); + void setAmplify(float amplify); + void setAmplifyDB(float amplifydb); + void writeVoice(shared_ptr audioClip); private: diff --git a/src/service/voiceprocess/wakeup_processer.cpp b/src/service/voiceprocess/wakeup_processer.cpp index bb88cfd..9ecf1ad 100644 --- a/src/service/voiceprocess/wakeup_processer.cpp +++ b/src/service/voiceprocess/wakeup_processer.cpp @@ -3,12 +3,18 @@ using namespace std; using namespace iflytop; using namespace core; -#define CHUNK_SIZE "2048" +#define CHUNK_SIZE "1600" -void WakeupProcesser::initialize(string precise_engine, string wakeupmodulepath) { +void WakeupProcesser::initialize(string precise_engine, string wakeupmodulepath, string chunksize) { + logger->info("initialize precise_engine:{}, wakeupmodulepath:{}, chunksize:{}", precise_engine, wakeupmodulepath, + chunksize); wakeupProcesser.reset(new MycroftPreciseWapper()); - wakeupProcesser->initialize(precise_engine.c_str(), wakeupmodulepath.c_str(), CHUNK_SIZE); + wakeupProcesser->initialize(precise_engine.c_str(), wakeupmodulepath.c_str(), chunksize.c_str()); + m_chucksize = atoi(chunksize.c_str()); } + +int WakeupProcesser::getChunkSize() { return m_chucksize; } + void WakeupProcesser::dumpwakeup_info(float source) { if (source > 0.9) { logger->info("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{}", source); @@ -30,7 +36,12 @@ void WakeupProcesser::dumpwakeup_info(float source) { } void WakeupProcesser::processVoice(uint8_t* voice, size_t voiceLen) { + if (!voice) return; + ZCHECK(voiceLen == m_chucksize, "voiceLen != m_chucksize"); + // logger->info("before processVoice {}", voiceLen); wakeupProcesser->processVoice(voice, voiceLen); + // logger->info("end processVoice"); + wakeupProcesser->regWakeupCB([&](float wakeupscore) { if (!wakeupflag) { if (wakeupscore > 0.1) { diff --git a/src/service/voiceprocess/wakeup_processer.hpp b/src/service/voiceprocess/wakeup_processer.hpp index 64c918d..1b2a402 100644 --- a/src/service/voiceprocess/wakeup_processer.hpp +++ b/src/service/voiceprocess/wakeup_processer.hpp @@ -40,6 +40,7 @@ class WakeupProcesser : public enable_shared_from_this { bool wakeupflag = false; tp_steady last_wakeup_timepoint; function m_cbfunc; + int m_chucksize = 0; public: nod::signal onWakeupSignal; @@ -47,10 +48,12 @@ class WakeupProcesser : public enable_shared_from_this { public: WakeupProcesser(){}; - void initialize(string precise_engine, string wakeupmodulepath); + void initialize(string precise_engine, string wakeupmodulepath, string chunksize); void processVoice(uint8_t* voice, size_t voiceLen); + int getChunkSize(); + private: void dumpwakeup_info(float source); };