|
@ -21,6 +21,35 @@ 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, |
|
|
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); |
|
|
tm.tm_min, tm.tm_sec); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
AudioLoggingService::WavRecorder::WavRecorder(string filename) { |
|
|
|
|
|
m_file.open(filename, ios::binary | ios::trunc); |
|
|
|
|
|
m_filename = filename; |
|
|
|
|
|
} |
|
|
|
|
|
void AudioLoggingService::WavRecorder::writeHeader(uint32_t sample_rate, uint16_t bits_per_sample, |
|
|
|
|
|
uint16_t num_channels, uint32_t num_samples) { |
|
|
|
|
|
wavHeader.initialize(sample_rate, bits_per_sample, num_channels, 0); |
|
|
|
|
|
m_file.write((char*)wavHeader.data(), wavHeader.size()); |
|
|
|
|
|
} |
|
|
|
|
|
void AudioLoggingService::WavRecorder::dumpheader(logger_t logger) { wavHeader.dump(logger); } |
|
|
|
|
|
void AudioLoggingService::WavRecorder::writeVoice(shared_ptr<AudioClip> audioClip) { |
|
|
|
|
|
if (!audioClip) return; |
|
|
|
|
|
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); |
|
|
|
|
|
} |
|
|
|
|
|
string AudioLoggingService::WavRecorder::getFilename() { return m_filename; } |
|
|
|
|
|
|
|
|
void AudioLoggingService::cleanupLogVoiceByTime(string prefix, size_t maxnum) { |
|
|
void AudioLoggingService::cleanupLogVoiceByTime(string prefix, size_t maxnum) { |
|
|
vector<string> files; |
|
|
vector<string> files; |
|
|
LinuxCoreUtils().ls(fmt::format("ls -1 -trd {}", prefix), files); |
|
|
LinuxCoreUtils().ls(fmt::format("ls -1 -trd {}", prefix), files); |
|
@ -32,21 +61,24 @@ void AudioLoggingService::cleanupLogVoiceByTime(string prefix, size_t maxnum) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void AudioLoggingService::initialize() { |
|
|
|
|
|
FileUtils().makeDirIfNoExist("./voice/rt/"); |
|
|
|
|
|
FileUtils().makeDirIfNoExist("./voice/wakeup/"); |
|
|
|
|
|
|
|
|
void AudioLoggingService::initialize(bool enableLogger) { |
|
|
|
|
|
m_enableLogger = enableLogger; |
|
|
|
|
|
FileUtils().makeDirIfNoExist("./voicelog/rt/"); |
|
|
|
|
|
FileUtils().makeDirIfNoExist("./voicelog/wakeup/"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void AudioLoggingService::loggerMICVoice(shared_ptr<AudioClip> audioClip) { |
|
|
void AudioLoggingService::loggerMICVoice(shared_ptr<AudioClip> audioClip) { |
|
|
|
|
|
if (!m_enableLogger) return; |
|
|
/**
|
|
|
/**
|
|
|
* @brief MIC的语音会存储在两个地方 |
|
|
* @brief MIC的语音会存储在两个地方 |
|
|
* 1. ./voice/rt/mic_voice_*.wav |
|
|
|
|
|
* 2. ./voice/wakeup/mic_voice_*.wav |
|
|
|
|
|
|
|
|
* 1. ./voicelog/rt/mic_voice_*.wav |
|
|
|
|
|
* 2. ./voicelog/wakeup/mic_voice_*.wav |
|
|
* |
|
|
* |
|
|
*/ |
|
|
*/ |
|
|
if (!m_rtMicVoiceFile) { |
|
|
if (!m_rtMicVoiceFile) { |
|
|
cleanupLogVoiceByTime("./voice/rt/mic_voice_*.wav", RT_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_rtMicVoiceFile.reset(new WavRecorder("./voice/rt/mic_voice_" + gettimestamp() + ".wav")); |
|
|
|
|
|
|
|
|
cleanupLogVoiceByTime("./voicelog/rt/mic_voice_*.wav", RT_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_rtMicVoiceFile.reset(new WavRecorder("./voicelog/rt/mic_voice_" + gettimestamp() + ".wav")); |
|
|
|
|
|
logger->info("create new rt mic voice file: {}", m_rtMicVoiceFile->m_filename); |
|
|
m_rtMicVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_rtMicVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_rtMicVoiceFile->writeVoice(audioClip); |
|
|
m_rtMicVoiceFile->writeVoice(audioClip); |
|
|
} else { |
|
|
} else { |
|
@ -63,8 +95,8 @@ void AudioLoggingService::loggerMICVoice(shared_ptr<AudioClip> audioClip) { |
|
|
lock_guard<mutex> lock(m_mutex); |
|
|
lock_guard<mutex> lock(m_mutex); |
|
|
if (m_wakeupState) { |
|
|
if (m_wakeupState) { |
|
|
if (!m_wakeupMicVoiceFile) { |
|
|
if (!m_wakeupMicVoiceFile) { |
|
|
cleanupLogVoiceByTime("./voice/wakeup/mic_voice_*.wav", WAKEUP_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_wakeupMicVoiceFile.reset(new WavRecorder("./voice/wakeup/mic_voice_" + m_wakeupsessionid + ".wav")); |
|
|
|
|
|
|
|
|
cleanupLogVoiceByTime("./voicelog/wakeup/mic_voice_*.wav", WAKEUP_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_wakeupMicVoiceFile.reset(new WavRecorder("./voicelog/wakeup/mic_voice_" + m_wakeupsessionid + ".wav")); |
|
|
m_wakeupMicVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_wakeupMicVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_wakeupMicVoiceFile->writeVoice(audioClip); |
|
|
m_wakeupMicVoiceFile->writeVoice(audioClip); |
|
|
} else { |
|
|
} else { |
|
@ -97,13 +129,14 @@ void AudioLoggingService::endwakeup() { |
|
|
* @param audioClip |
|
|
* @param audioClip |
|
|
*/ |
|
|
*/ |
|
|
void AudioLoggingService::loggerBeforeWakeupVoice(shared_ptr<AudioClip> audioClip) { |
|
|
void AudioLoggingService::loggerBeforeWakeupVoice(shared_ptr<AudioClip> audioClip) { |
|
|
|
|
|
if (!m_enableLogger) return; |
|
|
/**
|
|
|
/**
|
|
|
* @brief |
|
|
* @brief |
|
|
* 1. ./voice/rt/beforewakeup*.wav |
|
|
|
|
|
|
|
|
* 1. ./voicelog/rt/beforewakeup*.wav |
|
|
*/ |
|
|
*/ |
|
|
if (!m_rtBfwakeupVoiceFile) { |
|
|
if (!m_rtBfwakeupVoiceFile) { |
|
|
cleanupLogVoiceByTime("./voice/rt/rtbfwakeup*.wav", RT_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_rtBfwakeupVoiceFile.reset(new WavRecorder("./voice/rt/rtbfwakeup" + gettimestamp() + ".wav")); |
|
|
|
|
|
|
|
|
cleanupLogVoiceByTime("./voicelog/rt/rtbfwakeup*.wav", RT_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_rtBfwakeupVoiceFile.reset(new WavRecorder("./voicelog/rt/rtbfwakeup" + gettimestamp() + ".wav")); |
|
|
m_rtBfwakeupVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_rtBfwakeupVoiceFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_rtBfwakeupVoiceFile->writeVoice(audioClip); |
|
|
m_rtBfwakeupVoiceFile->writeVoice(audioClip); |
|
|
} else { |
|
|
} else { |
|
@ -120,15 +153,16 @@ void AudioLoggingService::loggerBeforeWakeupVoice(shared_ptr<AudioClip> audioCli |
|
|
* @param audioClip |
|
|
* @param audioClip |
|
|
*/ |
|
|
*/ |
|
|
void AudioLoggingService::loggerASRVoice(shared_ptr<AudioClip> audioClip) { |
|
|
void AudioLoggingService::loggerASRVoice(shared_ptr<AudioClip> audioClip) { |
|
|
|
|
|
if (!m_enableLogger) return; |
|
|
/**
|
|
|
/**
|
|
|
* @brief |
|
|
* @brief |
|
|
* ./voice/wakeup/asr*.wav |
|
|
|
|
|
|
|
|
* ./voicelog/wakeup/asr*.wav |
|
|
*/ |
|
|
*/ |
|
|
lock_guard<mutex> lock(m_mutex); |
|
|
lock_guard<mutex> lock(m_mutex); |
|
|
if (!m_wakeupState) return; |
|
|
if (!m_wakeupState) return; |
|
|
if (!m_asrFile) { |
|
|
if (!m_asrFile) { |
|
|
cleanupLogVoiceByTime("./voice/wakeup/asr*.wav", WAKEUP_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_asrFile.reset(new WavRecorder("./voice/wakeup/asr" + m_wakeupsessionid + ".wav")); |
|
|
|
|
|
|
|
|
cleanupLogVoiceByTime("./voicelog/wakeup/asr*.wav", WAKEUP_STORAGE_CLIP_NUMS); |
|
|
|
|
|
m_asrFile.reset(new WavRecorder("./voicelog/wakeup/asr" + m_wakeupsessionid + ".wav")); |
|
|
m_asrFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_asrFile->writeHeader(audioClip->getRate(), audioClip->getBitsPerSample(), audioClip->getCh(), 0); |
|
|
m_asrFile->writeVoice(audioClip); |
|
|
m_asrFile->writeVoice(audioClip); |
|
|
} else { |
|
|
} else { |
|
|