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
-
97src/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 "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 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 { |
|||
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