From b2b7ec86912a9d12720f0d1f776fad211cd406ee Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 16 Mar 2023 11:50:45 +0800 Subject: [PATCH] update submodule --- dep/iflytopcpp | 2 +- dep/zlinuxcomponents | 2 +- src/service/main_control_service.cpp | 8 ++++--- src/service/voiceprocess/audio_logging_service.cpp | 3 ++- src/service/voiceprocess/audio_logging_service.hpp | 28 +++++++++++++++++----- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/dep/iflytopcpp b/dep/iflytopcpp index f5a2ccc..c8cd480 160000 --- a/dep/iflytopcpp +++ b/dep/iflytopcpp @@ -1 +1 @@ -Subproject commit f5a2ccc1a0f8dfabb7e162eca6d0245231658f0f +Subproject commit c8cd4807bfb283471475b180e14452b88758f63d diff --git a/dep/zlinuxcomponents b/dep/zlinuxcomponents index 83404cd..12989cd 160000 --- a/dep/zlinuxcomponents +++ b/dep/zlinuxcomponents @@ -1 +1 @@ -Subproject commit 83404cdad908c9db64a161bef14dd1bbd2bcbf5d +Subproject commit 12989cdd5a45d6279ead3278aac7f4dd97af0824 diff --git a/src/service/main_control_service.cpp b/src/service/main_control_service.cpp index d1d36d2..0b2a0b7 100644 --- a/src/service/main_control_service.cpp +++ b/src/service/main_control_service.cpp @@ -19,7 +19,6 @@ using namespace std; /********************************************************************************************************************* * ======================================================代码======================================================= * *********************************************************************************************************************/ - void MainControlService::initialize() { GET_TO_SERVICE(m_zwebService); GET_TO_SERVICE(m_deviceIOService); @@ -29,7 +28,6 @@ void MainControlService::initialize() { GET_TO_SERVICE(m_wakeupProcesser); GET_TO_SERVICE(m_audioRecoderService); GET_TO_SERVICE(m_audioLoggingService); - // 监听从webservice来的websocket消息 m_zwebService->startWork([this](const json& command, json& receipt) { @@ -48,8 +46,12 @@ void MainControlService::initialize() { return; } logger->info("onRecordData {}", audioClip->size()); - m_beforeWakeupVoiceProcesser->writeVoice(audioClip); + + // 1. 保存此阶段语音到文件中 m_audioLoggingService->loggerMICVoice(audioClip); + + // voice -> before wakeup + m_beforeWakeupVoiceProcesser->writeVoice(audioClip); }); m_beforeWakeupVoiceProcesser->onAfterProcessVoice.connect([this](shared_ptr audioClip) { diff --git a/src/service/voiceprocess/audio_logging_service.cpp b/src/service/voiceprocess/audio_logging_service.cpp index c614c5b..253e435 100644 --- a/src/service/voiceprocess/audio_logging_service.cpp +++ b/src/service/voiceprocess/audio_logging_service.cpp @@ -21,7 +21,7 @@ static string gettimestamp() { 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) { +void AudioLoggingService::cleanupLogVoiceByTime(string prefix, size_t maxnum) { vector files; LinuxCoreUtils().ls(fmt::format("ls -1 -trd {}", prefix), files); @@ -48,6 +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->writeVoice(audioClip); } else { m_rtMicVoiceFile->writeVoice(audioClip); diff --git a/src/service/voiceprocess/audio_logging_service.hpp b/src/service/voiceprocess/audio_logging_service.hpp index 0402a19..b3120a1 100644 --- a/src/service/voiceprocess/audio_logging_service.hpp +++ b/src/service/voiceprocess/audio_logging_service.hpp @@ -56,18 +56,32 @@ class AudioLoggingService : public enable_shared_from_this class WavRecorder { public: - ofstream m_file; - uint32_t m_durationMS = 0; + ofstream m_file; + uint32_t m_durationMS = 0; + uint32_t m_totalsize; + WAVHeader wavHeader; - WavRecorder(string filename) { m_file.open(filename, ios::binary); } + WavRecorder(string filename) { m_file.open(filename, ios::binary | ios::trunc); } void writeHeader(uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels, uint32_t num_samples) { - WAVHeader wavHeader(sample_rate, bits_per_sample, num_channels, num_samples); + wavHeader.initialize(sample_rate, bits_per_sample, num_channels, 0); m_file.write((char*)wavHeader.data(), wavHeader.size()); } + void dumpheader(logger_t logger) { wavHeader.dump(logger); } void writeVoice(shared_ptr audioClip) { if (!audioClip) return; - m_file.write((char*)audioClip->data(), audioClip->size()); m_durationMS += audioClip->getAudioDurationMs(); + m_totalsize += audioClip->size(); + + // 写入音频文件 + m_file.seekp(0, ios::end); + m_file.write((char*)audioClip->data(), audioClip->size()); + + // 更新wav头 + wavHeader.resize(m_totalsize); + m_file.seekp(4, ios::beg); + m_file.write((char*)&wavHeader.header.chunk_size, 4); + m_file.seekp(40, ios::beg); + m_file.write((char*)&wavHeader.header.subchunk2_size, 4); } }; @@ -85,7 +99,9 @@ class AudioLoggingService : public enable_shared_from_this void loggerASRVoice(shared_ptr audioClip); void setWakeupState(bool state); + void clearupWavRecorder(); - void cleanupLogVoiceByTime(string prefix, int maxnum); + private: + void cleanupLogVoiceByTime(string prefix, size_t maxnum); }; } // namespace iflytop