Browse Source

temporary code submission

master
zhaohe 2 years ago
parent
commit
ca6f79c199
  1. 2
      dep/iflytopcpp
  2. 2
      dep/zlinuxcomponents
  3. 2
      dep/zwebservice
  4. 6
      src/service/device_io_service.cpp
  5. 6
      src/service/main_control_service.cpp
  6. 93
      src/service/voiceprocess/audio_logging_service.cpp
  7. 99
      src/service/voiceprocess/audio_logging_service.hpp
  8. 2
      src/service/voiceprocess/beforeasr_voiceprocesser.cpp
  9. 2
      src/service/voiceprocess/beforewakeup_voiceprocesser.cpp
  10. 2
      src/service/voiceprocess/wakeup_processer.hpp

2
dep/iflytopcpp

@ -1 +1 @@
Subproject commit e4c17891a53fda64a1beafa88ecc9f62119082c2
Subproject commit f5a2ccc1a0f8dfabb7e162eca6d0245231658f0f

2
dep/zlinuxcomponents

@ -1 +1 @@
Subproject commit 4fe607ac601efb4e3fb0215f16ea89296fcdae42
Subproject commit 99b27976a540084bb76a2d3cea03433dd8b8adba

2
dep/zwebservice

@ -1 +1 @@
Subproject commit 89e0bfea5db6bb713f49644d6e6d33900df9964c
Subproject commit ef8c5689f4ae8abf06b2a8009207e91ea72fdf7b

6
src/service/device_io_service.cpp

@ -1,7 +1,7 @@
#include "device_io_service.hpp"
#include "iflytopcpp/core/components/string_util.hpp"
#include "iflytopcpp/core/components/time_util.hpp"
#include "iflytopcpp/core/components/stringutils.hpp"
#include "iflytopcpp/core/components/timeutils.hpp"
#include "iflytopcpp/core/zexception/zexception.hpp"
using namespace iflytop;
using namespace core;
@ -293,7 +293,7 @@ void DeviceIOService::idcardread(bool& state, string& info) {
{
Modbus03Rx modbus03rx;
EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 65, readreg, modbus03rx, kovertime));
info = StringUtil().bytesToString(modbus03rx.getRegBegin(), datalen);
info = StringUtils().bytesToString(modbus03rx.getRegBegin(), datalen);
}
state = true;
logger->debug("idcardread, state={},info={}", state, info);

6
src/service/main_control_service.cpp

@ -1,6 +1,6 @@
#include "main_control_service.hpp"
#include "iflytopcpp/core/components/string_util.hpp"
#include "iflytopcpp/core/components/stringutils.hpp"
#include "version.hpp"
using namespace iflytop;
using namespace core;
@ -109,7 +109,7 @@ void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json
m_deviceIOService->fanSetState(id, power);
} else if (in["command"] == "relayStateGet") {
auto relaystate = m_deviceIOService->relayStateGet();
receipt["state"]["rawState"] = StringUtil().bytet2Binary(relaystate.state, 32, false);
receipt["state"]["rawState"] = StringUtils().bytet2Binary(relaystate.state, 32, false);
receipt["state"]["routerPower"] = relaystate.getState(DeviceIOService::kRouterPower);
receipt["state"]["touchScreenPower"] = relaystate.getState(DeviceIOService::kTouchScreenPower);
receipt["state"]["usbChargerPower"] = relaystate.getState(DeviceIOService::kUsbChargerPower);
@ -117,7 +117,7 @@ void MainControlService::processReceiveMessage(fromwhere_t fromwhere, const json
receipt["state"]["lightPower"] = relaystate.getState(DeviceIOService::kLightPower);
} else if (in["command"] == "inputStateGet") {
auto inputdeviceState = m_deviceIOService->getinputState();
receipt["state"]["rawState"] = StringUtil().bytet2Binary(inputdeviceState.state, 32, false);
receipt["state"]["rawState"] = StringUtils().bytet2Binary(inputdeviceState.state, 32, false);
receipt["state"]["emergency"] = inputdeviceState.getState(DeviceIOService::kEmergency);
receipt["state"]["waterImmersionSensor"] = inputdeviceState.getState(DeviceIOService::kWaterImmersionSensor);
receipt["state"]["humanProximitySensor"] = inputdeviceState.getState(DeviceIOService::kHumanProximitySensor);

93
src/service/voiceprocess/audio_logging_service.cpp

@ -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) {}

99
src/service/voiceprocess/audio_logging_service.hpp

@ -13,85 +13,76 @@
#include <string>
#include <vector>
#include "iflytopcpp/core/components/timeutils.hpp"
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
#include "iflytopcpp/core/thread/thread.hpp"
#include "zlinuxcomponents/audio/audio_clip.hpp"
#include "iflytopcpp/core/components/time_util.hpp"
/**
* @brief
*
* service: AudioLoggingService
* 1.
* 1.1 5,30
* 1.2 MIC输入的语音和交给唤醒词前的语音
*
* 2.
*
* 1.1 MIC语音
* 1.2 ASR的语音
* 1.3 voiceprocess各个阶段的语音
*
* 3.
*
* ./voice/rt/20200308183030_mic.wav
* ./voice/rt/20200308183030_bfwakeup.wav
*
* ./voice/bywakeup/20200308183030_mic.wav
* ./voice/bywakeup/20200308183030_asr.wav
*
* 1. 20s的音频
* 2. 1,15
* 3.
*
*/
#define RT_STORAGE_CLIP_DURATION_MS (1000 * 60 * 5) // 5分钟
#define RT_STORAGE_CLIP_NUMS (6) // 6
#define WAKEUP_STORAGE_CLIP_NUMS (30) // 存储30次唤醒的语音
namespace iflytop {
using namespace std;
using namespace core;
class AudioLoggingService : public enable_shared_from_this<AudioLoggingService> {
ENABLE_LOGGER(AudioLoggingService);
public:
enum VoiceType {
kOriginalVoice,
kBeforeWakeupVoice,
kBeforeAsrVoice,
};
/**
* @brief
* :
*
* 30s的语音也录制进来
* logVoice/bywakeup/
* 20230308183030_origi.wav
* 20230308183030_bfwak.wav
* 20230308183030_bfasr.wav
*
* 115.
* logVoice/bytime/
* 20230308183030_origi.wav
* 20230308183030_bfwak.wav
* 20230308183030_bfasr.wav
*
*/
class AudioQueue {
public:
// 缓存30s语音的队列
list<shared_ptr<AudioClip>> m_30sque;
// 唤醒存储队列
list<shared_ptr<AudioClip>> m_wakque;
// 实时存储队列
list<shared_ptr<AudioClip>> m_rtque;
};
shared_ptr<AudioQueue> m_originalVoice;
shared_ptr<AudioQueue> m_beforeWakeupVoice;
shared_ptr<AudioQueue> m_beforeAsrVoice;
unique_ptr<Thread> m_realtime_log_thread;
bool wakeup = false;
class OnceLog {
class WavRecorder {
public:
zsteady_tp m_startTime;
ofstream m_file;
uint32_t m_durationMS = 0;
WavRecorder(string filename) { m_file.open(filename, ios::binary); }
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);
}
void writeVoice(shared_ptr<AudioClip> audioClip) {
m_file.write((char*)audioClip->data(), audioClip->size());
m_durationMS += audioClip->getAudioDurationMs();
}
};
shared_ptr<OnceLog> m_realTimeOnceLog;
bool m_wakeupState = false;
unique_ptr<WavRecorder> m_rtMicVoiceFile;
unique_ptr<WavRecorder> m_rtBfwakeupVoiceFile;
public:
AudioLoggingService(){};
void loggerVoice(VoiceType voiceType, shared_ptr<AudioClip> audioClip);
void loggerMICVoice(shared_ptr<AudioClip> audioClip);
void loggerBeforeWakeupVoice(shared_ptr<AudioClip> audioClip);
void loggerASRVoice(shared_ptr<AudioClip> audioClip);
void setWakeupState(bool state);
void cleanupLogVoiceByTime(string prefix, int maxnum);
void triggerWakeupEvent();
void triggerEndWakeupEvent();
void initialize();
};
} // namespace iflytop
} // namespace iflytop

2
src/service/voiceprocess/beforeasr_voiceprocesser.cpp

@ -21,7 +21,7 @@ void BeforeasrVoiceProcesser::initialize() {
}));
}
void BeforeasrVoiceProcesser::processVoice(shared_ptr<AudioClip> audioClip) {
size_t voiceNclips = audioClip->getVoiceLen() / audioClip->getCh() / 2;
size_t voiceNclips = audioClip->getVoiceBufSize() / audioClip->getCh() / 2;
size_t voiceLen = voiceNclips * 2;
uint16_t *voice = (uint16_t *)malloc(voiceNclips * 2);

2
src/service/voiceprocess/beforewakeup_voiceprocesser.cpp

@ -22,7 +22,7 @@ void BeforeWakeupVoiceProcesser::initialize() {
}
void BeforeWakeupVoiceProcesser::processVoice(shared_ptr<AudioClip> audioClip) {
size_t voiceNclips = audioClip->getVoiceLen() / audioClip->getCh() / 2;
size_t voiceNclips = audioClip->getVoiceBufSize() / audioClip->getCh() / 2;
size_t voiceLen = voiceNclips * 2;
uint16_t *voice = (uint16_t *)malloc(voiceNclips * 2);

2
src/service/voiceprocess/wakeup_processer.hpp

@ -14,7 +14,7 @@
#include <vector>
#include "iflytopcpp/core/basic/nod/nod.hpp"
#include "iflytopcpp/core/components/time_util.hpp"
#include "iflytopcpp/core/components/timeutils.hpp"
#include "iflytopcpp/core/spdlogfactory/logger.hpp"
#include "iflytopcpp/core/thread/thread.hpp"
#include "zlinuxcomponents/mycroft_precise/mycroft_precise_wapper.hpp"

Loading…
Cancel
Save