diff --git a/src/service/voiceprocess/beforeasr_voiceprocesser.cpp b/src/service/voiceprocess/beforeasr_voiceprocesser.cpp index e69de29..545c662 100644 --- a/src/service/voiceprocess/beforeasr_voiceprocesser.cpp +++ b/src/service/voiceprocess/beforeasr_voiceprocesser.cpp @@ -0,0 +1,45 @@ +#include "beforeasr_voiceprocesser.hpp" + +using namespace std; +using namespace iflytop; +using namespace core; + +void BeforeasrVoiceProcesser::initialize() { + logger->info("BeforeasrVoiceProcesser::initialize"); + + m_thread.reset(new Thread("BeforeasrVoiceProcesser", [this]() { + ThisThread thisThread; + while (!thisThread.getExitFlag()) { + shared_ptr audioClip; + m_audioClips.try_dequeue(audioClip); + if (audioClip == nullptr) { + thisThread.sleepForMs(10); + continue; + } + processVoice(audioClip); + } + })); +} +void BeforeasrVoiceProcesser::processVoice(shared_ptr audioClip) { + size_t voiceNclips = audioClip->getVoiceLen() / audioClip->getCh() / 2; + size_t voiceLen = voiceNclips * 2; + uint16_t *voice = (uint16_t *)malloc(voiceNclips * 2); + + for (size_t i = 0; i < voiceNclips; i++) { + voice[i] = ((uint16_t *)audioClip->getVoice())[i * 5]; + } + + shared_ptr afterProcessAudioClip = + make_shared((uint8_t *)voice, voiceLen, 1, audioClip->getRate(), audioClip->getFormat()); + + onAfterProcessVoice(afterProcessAudioClip); +} + +void BeforeasrVoiceProcesser::writeVoice(shared_ptr audioClip) { + ZCHECK(audioClip != nullptr, "audioClip is null"); + ZCHECK(audioClip->getFormat() == S16_LE, "audioClip format is not S16_LE"); + ZCHECK(audioClip->getCh() == 5, "audioClip ch is not 5"); // 4mic+1ref + ZCHECK(audioClip->getRate() == 16000, "audioClip rate is not 16000"); + + m_audioClips.enqueue(audioClip); +} \ No newline at end of file diff --git a/src/service/voiceprocess/beforeasr_voiceprocesser.hpp b/src/service/voiceprocess/beforeasr_voiceprocesser.hpp index e69de29..2c34c8d 100644 --- a/src/service/voiceprocess/beforeasr_voiceprocesser.hpp +++ b/src/service/voiceprocess/beforeasr_voiceprocesser.hpp @@ -0,0 +1,54 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iflytopcpp/core/basic/concurrentqueue/concurrentqueue.h" +#include "iflytopcpp/core/basic/nod/nod.hpp" +#include "iflytopcpp/core/spdlogfactory/logger.hpp" +#include "iflytopcpp/core/thread/thread.hpp" +#include "zlinuxcomponents/audio/audio_clip.hpp" +/** + * @brief + * + * service:BeforeasrVoiceProcesser + * + * 作用: 波束增强,降噪,回声消除 + * + */ + +namespace iflytop { +using namespace std; +using namespace core; +using namespace moodycamel; +class BeforeasrVoiceProcesser : public enable_shared_from_this { + ENABLE_LOGGER(BeforeasrVoiceProcesser); + + public: + ConcurrentQueue> m_audioClips; + + unique_ptr m_thread; + + public: + nod::signal audioClip)> onAfterProcessVoice; + + BeforeasrVoiceProcesser(){}; + + void initialize(); + + void writeVoice(shared_ptr audioClip); + + private: + void processVoice(shared_ptr audioClip); +}; +} // namespace iflytop \ No newline at end of file diff --git a/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp b/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp index e69de29..94359a5 100644 --- a/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp +++ b/src/service/voiceprocess/beforewakeup_voiceprocesser.cpp @@ -0,0 +1,46 @@ +#include "beforewakeup_voiceprocesser.hpp" + +using namespace std; +using namespace iflytop; +using namespace core; + +void BeforeWakeupVoiceProcesser::initialize() { + logger->info("BeforeWakeupVoiceProcesser::initialize"); + + m_thread.reset(new Thread("BeforeWakeupVoiceProcesser", [this]() { + ThisThread thisThread; + while (!thisThread.getExitFlag()) { + shared_ptr audioClip; + m_audioClips.try_dequeue(audioClip); + if (audioClip == nullptr) { + thisThread.sleepForMs(10); + continue; + } + processVoice(audioClip); + } + })); +} +void BeforeWakeupVoiceProcesser::processVoice(shared_ptr audioClip) { + + size_t voiceNclips = audioClip->getVoiceLen() / audioClip->getCh() / 2; + size_t voiceLen = voiceNclips * 2; + uint16_t *voice = (uint16_t *)malloc(voiceNclips * 2); + + for (size_t i = 0; i < voiceNclips; i++) { + voice[i] = ((uint16_t *)audioClip->getVoice())[i * 5]; + } + + shared_ptr afterProcessAudioClip = + make_shared((uint8_t *)voice, voiceLen, 1, audioClip->getRate(), audioClip->getFormat()); + + onAfterProcessVoice(afterProcessAudioClip); +} + +void BeforeWakeupVoiceProcesser::writeVoice(shared_ptr audioClip) { + ZCHECK(audioClip != nullptr, "audioClip is null"); + ZCHECK(audioClip->getFormat() == S16_LE, "audioClip format is not S16_LE"); + ZCHECK(audioClip->getCh() == 5, "audioClip ch is not 5"); // 4mic+1ref + ZCHECK(audioClip->getRate() == 16000, "audioClip rate is not 16000"); + + m_audioClips.enqueue(audioClip); +} \ No newline at end of file diff --git a/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp b/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp index e69de29..e655bcb 100644 --- a/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp +++ b/src/service/voiceprocess/beforewakeup_voiceprocesser.hpp @@ -0,0 +1,55 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iflytopcpp/core/basic/concurrentqueue/concurrentqueue.h" +#include "iflytopcpp/core/basic/nod/nod.hpp" +#include "iflytopcpp/core/spdlogfactory/logger.hpp" +#include "iflytopcpp/core/thread/thread.hpp" +#include "zlinuxcomponents/audio/audio_clip.hpp" +/** + * @brief + * + * service:BeforeWakeupVoiceProcesser + * + * 作用: + * bosuzengqiang + * 简单的波束增强 + */ + +namespace iflytop { +using namespace std; +using namespace core; +using namespace moodycamel; +class BeforeWakeupVoiceProcesser : public enable_shared_from_this { + ENABLE_LOGGER(BeforeWakeupVoiceProcesser); + + public: + ConcurrentQueue> m_audioClips; + + unique_ptr m_thread; + + public: + nod::signal audioClip)> onAfterProcessVoice; + + BeforeWakeupVoiceProcesser(){}; + + void initialize(); + + void writeVoice(shared_ptr audioClip); + + private: + void processVoice(shared_ptr audioClip); +}; +} // namespace iflytop \ No newline at end of file