4 changed files with 200 additions and 0 deletions
-
45src/service/voiceprocess/beforeasr_voiceprocesser.cpp
-
54src/service/voiceprocess/beforeasr_voiceprocesser.hpp
-
46src/service/voiceprocess/beforewakeup_voiceprocesser.cpp
-
55src/service/voiceprocess/beforewakeup_voiceprocesser.hpp
@ -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> audioClip; |
||||
|
m_audioClips.try_dequeue(audioClip); |
||||
|
if (audioClip == nullptr) { |
||||
|
thisThread.sleepForMs(10); |
||||
|
continue; |
||||
|
} |
||||
|
processVoice(audioClip); |
||||
|
} |
||||
|
})); |
||||
|
} |
||||
|
void BeforeasrVoiceProcesser::processVoice(shared_ptr<AudioClip> 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<AudioClip> afterProcessAudioClip = |
||||
|
make_shared<AudioClip>((uint8_t *)voice, voiceLen, 1, audioClip->getRate(), audioClip->getFormat()); |
||||
|
|
||||
|
onAfterProcessVoice(afterProcessAudioClip); |
||||
|
} |
||||
|
|
||||
|
void BeforeasrVoiceProcesser::writeVoice(shared_ptr<AudioClip> 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); |
||||
|
} |
@ -0,0 +1,54 @@ |
|||||
|
//
|
||||
|
// Created by zwsd
|
||||
|
//
|
||||
|
|
||||
|
#pragma once
|
||||
|
#include <fstream>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#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<BeforeasrVoiceProcesser> { |
||||
|
ENABLE_LOGGER(BeforeasrVoiceProcesser); |
||||
|
|
||||
|
public: |
||||
|
ConcurrentQueue<shared_ptr<AudioClip>> m_audioClips; |
||||
|
|
||||
|
unique_ptr<Thread> m_thread; |
||||
|
|
||||
|
public: |
||||
|
nod::signal<void(shared_ptr<AudioClip> audioClip)> onAfterProcessVoice; |
||||
|
|
||||
|
BeforeasrVoiceProcesser(){}; |
||||
|
|
||||
|
void initialize(); |
||||
|
|
||||
|
void writeVoice(shared_ptr<AudioClip> audioClip); |
||||
|
|
||||
|
private: |
||||
|
void processVoice(shared_ptr<AudioClip> audioClip); |
||||
|
}; |
||||
|
} // namespace iflytop
|
@ -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> audioClip; |
||||
|
m_audioClips.try_dequeue(audioClip); |
||||
|
if (audioClip == nullptr) { |
||||
|
thisThread.sleepForMs(10); |
||||
|
continue; |
||||
|
} |
||||
|
processVoice(audioClip); |
||||
|
} |
||||
|
})); |
||||
|
} |
||||
|
void BeforeWakeupVoiceProcesser::processVoice(shared_ptr<AudioClip> 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<AudioClip> afterProcessAudioClip = |
||||
|
make_shared<AudioClip>((uint8_t *)voice, voiceLen, 1, audioClip->getRate(), audioClip->getFormat()); |
||||
|
|
||||
|
onAfterProcessVoice(afterProcessAudioClip); |
||||
|
} |
||||
|
|
||||
|
void BeforeWakeupVoiceProcesser::writeVoice(shared_ptr<AudioClip> 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); |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
//
|
||||
|
// Created by zwsd
|
||||
|
//
|
||||
|
|
||||
|
#pragma once
|
||||
|
#include <fstream>
|
||||
|
#include <iostream>
|
||||
|
#include <list>
|
||||
|
#include <map>
|
||||
|
#include <memory>
|
||||
|
#include <set>
|
||||
|
#include <sstream>
|
||||
|
#include <string>
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#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<BeforeWakeupVoiceProcesser> { |
||||
|
ENABLE_LOGGER(BeforeWakeupVoiceProcesser); |
||||
|
|
||||
|
public: |
||||
|
ConcurrentQueue<shared_ptr<AudioClip>> m_audioClips; |
||||
|
|
||||
|
unique_ptr<Thread> m_thread; |
||||
|
|
||||
|
public: |
||||
|
nod::signal<void(shared_ptr<AudioClip> audioClip)> onAfterProcessVoice; |
||||
|
|
||||
|
BeforeWakeupVoiceProcesser(){}; |
||||
|
|
||||
|
void initialize(); |
||||
|
|
||||
|
void writeVoice(shared_ptr<AudioClip> audioClip); |
||||
|
|
||||
|
private: |
||||
|
void processVoice(shared_ptr<AudioClip> audioClip); |
||||
|
}; |
||||
|
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue