10 changed files with 120 additions and 96 deletions
-
2dep/iflytopcpp
-
2dep/zlinuxcomponents
-
2dep/zwebservice
-
6src/service/device_io_service.cpp
-
6src/service/main_control_service.cpp
-
93src/service/voiceprocess/audio_logging_service.cpp
-
99src/service/voiceprocess/audio_logging_service.hpp
-
2src/service/voiceprocess/beforeasr_voiceprocesser.cpp
-
2src/service/voiceprocess/beforewakeup_voiceprocesser.cpp
-
2src/service/voiceprocess/wakeup_processer.hpp
@ -1 +1 @@ |
|||||
Subproject commit e4c17891a53fda64a1beafa88ecc9f62119082c2 |
|
||||
|
Subproject commit f5a2ccc1a0f8dfabb7e162eca6d0245231658f0f |
@ -1 +1 @@ |
|||||
Subproject commit 4fe607ac601efb4e3fb0215f16ea89296fcdae42 |
|
||||
|
Subproject commit 99b27976a540084bb76a2d3cea03433dd8b8adba |
@ -1 +1 @@ |
|||||
Subproject commit 89e0bfea5db6bb713f49644d6e6d33900df9964c |
|
||||
|
Subproject commit ef8c5689f4ae8abf06b2a8009207e91ea72fdf7b |
@ -1,43 +1,76 @@ |
|||||
#include "audio_logging_service.hpp"
|
#include "audio_logging_service.hpp"
|
||||
|
|
||||
#include "iflytopcpp/core/components/time_util.hpp"
|
|
||||
|
|
||||
|
#include "iflytopcpp/core/components/audio/wavheader.hpp"
|
||||
|
#include "iflytopcpp/core/components/fileutils.hpp"
|
||||
|
#include "iflytopcpp/core/components/timeutils.hpp"
|
||||
|
#include "iflytopcpp/core/linuxcoreutils/linuxcoreutils.hpp"
|
||||
using namespace iflytop; |
using namespace iflytop; |
||||
using namespace core; |
using namespace core; |
||||
void AudioLoggingService::initialize() { |
|
||||
m_originalVoice = make_shared<AudioQueue>(); |
|
||||
m_beforeWakeupVoice = make_shared<AudioQueue>(); |
|
||||
m_beforeAsrVoice = make_shared<AudioQueue>(); |
|
||||
|
|
||||
m_realtime_log_thread.reset(new Thread("m_realtime_log_thread", [this]() { |
|
||||
ThisThread thisThread; |
|
||||
while (!thisThread.getExitFlag()) { |
|
||||
thisThread.sleepForMs(33); |
|
||||
} |
|
||||
})); |
|
||||
|
|
||||
|
static string gettimestamp() { |
||||
|
struct tm tm = {0}; |
||||
|
|
||||
|
time_t t = time(nullptr); |
||||
|
if (t == -1) { |
||||
|
return ""; |
||||
|
} |
||||
|
struct tm* tmp = localtime_r(&t, &tm); |
||||
|
if (!tmp) { |
||||
|
return ""; |
||||
|
} |
||||
|
return fmt::format("{:0>4}{:0>2}{:0>2}{:0>2}{:0>2}{:0>2}", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, |
||||
|
tm.tm_min, tm.tm_sec); |
||||
} |
} |
||||
|
void AudioLoggingService::cleanupLogVoiceByTime(string prefix, int maxnum) { |
||||
|
vector<string> files; |
||||
|
LinuxCoreUtils().ls(fmt::format("ls -1 -trd {}", prefix), files); |
||||
|
|
||||
void AudioLoggingService::loggerVoice(VoiceType voiceType, shared_ptr<AudioClip> audioClip) { |
|
||||
zsteady_tp now = zsteady_clock().now(); |
|
||||
|
if (files.size() > maxnum) { |
||||
|
for (int i = 0; i < files.size() - maxnum; i++) { |
||||
|
system(fmt::format("rm -f {}", files[i]).c_str()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
shared_ptr<AudioQueue> aq; |
|
||||
if (voiceType == kOriginalVoice) { |
|
||||
aq = m_originalVoice; |
|
||||
} else if (voiceType == kBeforeWakeupVoice) { |
|
||||
aq = m_beforeWakeupVoice; |
|
||||
} else if (voiceType == kBeforeAsrVoice) { |
|
||||
aq = m_beforeAsrVoice; |
|
||||
|
void AudioLoggingService::loggerMICVoice(shared_ptr<AudioClip> audioClip) { |
||||
|
/**
|
||||
|
* @brief MIC的语音会存储在两个地方 |
||||
|
* 1. ./voice/rt/mic_voice_*.wav |
||||
|
* 2. ./voice/wakeup/mic_voice_*.wav |
||||
|
* |
||||
|
*/ |
||||
|
if (!m_rtMicVoiceFile) { |
||||
|
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->writeVoice(audioClip); |
||||
} else { |
} else { |
||||
return; |
|
||||
|
m_rtMicVoiceFile->writeVoice(audioClip); |
||||
|
if (m_rtMicVoiceFile->m_durationMS >= (RT_STORAGE_CLIP_DURATION_MS)) { |
||||
|
m_rtMicVoiceFile.reset(); |
||||
|
} |
||||
} |
} |
||||
|
|
||||
aq->m_30sque.push_back(audioClip); |
|
||||
aq->m_rtque.push_back(audioClip); |
|
||||
if (wakeup) aq->m_wakque.push_back(audioClip); |
|
||||
|
if (m_wakeupState) { |
||||
|
if (!m_rtBfwakeupVoiceFile) { |
||||
|
cleanupLogVoiceByTime("./voice/wakeup/mic_voice_*.wav", WAKEUP_STORAGE_CLIP_NUMS); |
||||
|
m_rtBfwakeupVoiceFile.reset(new WavRecorder("./voice/wakeup/mic_voice_" + gettimestamp() + ".wav")); |
||||
|
m_rtBfwakeupVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
||||
|
m_rtBfwakeupVoiceFile->writeVoice(audioClip); |
||||
|
} else { |
||||
|
m_rtBfwakeupVoiceFile->writeVoice(audioClip); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
aq->m_30sque.remove_if( |
|
||||
[&](shared_ptr<AudioClip> audioClip) { return zsteady_clock().dToMs(now - audioClip->getTp()) > (30 * 1000); }); |
|
||||
|
void AudioLoggingService::setWakeupState(bool state) { |
||||
|
if (!state) { |
||||
|
m_wakeupState = true; |
||||
|
} else { |
||||
|
m_wakeupState = false; |
||||
|
m_rtBfwakeupVoiceFile.reset(); |
||||
|
} |
||||
} |
} |
||||
|
|
||||
void AudioLoggingService::triggerWakeupEvent() {} |
|
||||
void AudioLoggingService::triggerEndWakeupEvent() {} |
|
||||
|
void AudioLoggingService::loggerBeforeWakeupVoice(shared_ptr<AudioClip> audioClip) {} |
||||
|
void AudioLoggingService::loggerASRVoice(shared_ptr<AudioClip> audioClip) {} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue