ConsistencyCompareThread.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "ConsistencyCompareThread.h"
  2. #include "ThreadManager.h"
  3. #include "CreateWAVThread.h"
  4. #include "LHCompareAPI.h"
  5. ConsistencyCompareThread::ConsistencyCompareThread(CalculateThreadInfo_t& threadInfo)
  6. : BaseCalculateThread(threadInfo)
  7. {
  8. }
  9. ConsistencyCompareThread::~ConsistencyCompareThread()
  10. {
  11. }
  12. /* 获取一致性比对的结果 */
  13. StConsistencyResult ConsistencyCompareThread::getConsistencyResult()
  14. {
  15. std::lock_guard<std::mutex> lock(m_mutexResult);
  16. return m_consistencyResult;
  17. }
  18. /* 判断录音通道是否相等 */
  19. bool ConsistencyCompareThread::isRoadEqual(const SoundCardRoadInfo_t& roadInfo1, const SoundCardRoadInfo_t& roadInfo2)
  20. {
  21. /* r1对比m_r1,r2对比M_r2 */
  22. if( roadInfo1.nSoundCardNum == m_roadInfo1.nSoundCardNum && roadInfo1.roadInfo.nRoadNum == m_roadInfo1.roadInfo.nRoadNum &&
  23. roadInfo2.nSoundCardNum == m_roadInfo2.nSoundCardNum && roadInfo2.roadInfo.nRoadNum == m_roadInfo2.roadInfo.nRoadNum )
  24. {
  25. return true;
  26. }
  27. /* 反过来对比一下 */
  28. if( roadInfo1.nSoundCardNum == m_roadInfo2.nSoundCardNum && roadInfo1.roadInfo.nRoadNum == m_roadInfo2.roadInfo.nRoadNum &&
  29. roadInfo2.nSoundCardNum == m_roadInfo1.nSoundCardNum && roadInfo2.roadInfo.nRoadNum == m_roadInfo1.roadInfo.nRoadNum )
  30. {
  31. return true;
  32. }
  33. return false;
  34. }
  35. /* 线程功能函数 */
  36. void ConsistencyCompareThread::task()
  37. {
  38. m_isRunning = true;
  39. /* 初始化 */
  40. if(!initData())
  41. {
  42. SPDLOG_LOGGER_ERROR(m_logger, "{} 初始化数据失败", m_logBase);
  43. return;
  44. }
  45. m_threadInfo.threadState = EThreadState::State_Running;
  46. /* 更新全局线程的状态 */
  47. while(m_isRunning)
  48. {
  49. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  50. /*--------------------------------------------------------------
  51. * 更新最新数据
  52. *--------------------------------------------------------------*/
  53. m_pCreateWAVThread1->getLatestFileName(m_wavFilePath1);
  54. m_pCreateWAVThread2->getLatestFileName(m_wavFilePath2);
  55. /* 检查是否有新的数据 */
  56. if(m_wavFilePath1 == m_prevWavFilePath1 || m_wavFilePath2 == m_prevWavFilePath2)
  57. {
  58. // SPDLOG_LOGGER_INFO(m_logger, "{} 检测到文件路径未变化", m_logBase);
  59. continue;
  60. }
  61. /*--------------------------------------------------------------
  62. * 开始比对计算,并保存计算结果
  63. *--------------------------------------------------------------*/
  64. if(!compareConsistency())
  65. {
  66. continue;
  67. }
  68. m_prevWavFilePath1 = m_wavFilePath1; // 更新上一个wav文件路径
  69. m_prevWavFilePath2 = m_wavFilePath2; // 更新上一个wav文件路径
  70. }
  71. clearData();
  72. /* 线程结束,更新线程状态 */
  73. }
  74. /* 初始化数据 */
  75. bool ConsistencyCompareThread::initData()
  76. {
  77. if(m_threadInfo.compareItemInfo.mapRoad.size() < 2)
  78. {
  79. SPDLOG_LOGGER_ERROR(m_logger, "{} 录音通道信息不足,至少需要两个通道", m_logBase);
  80. return false;
  81. }
  82. /* 获取两个录音通道的信息 */
  83. auto it = m_threadInfo.compareItemInfo.mapRoad.begin();
  84. m_roadInfo1 = it.value().scRoadInfo; // 第一个通道
  85. it++;
  86. m_roadInfo2 = it.value().scRoadInfo; // 第二个通道
  87. m_logBase = fmt::format("对比通道 {}:{} - {}:{}",
  88. m_roadInfo1.strSoundCardName.toStdString(), m_roadInfo1.roadInfo.nRoadNum,
  89. m_roadInfo2.strSoundCardName.toStdString(), m_roadInfo2.roadInfo.nRoadNum);
  90. /* 获取创建wav文件的指针 */
  91. m_pCreateWAVThread1 = ThreadMan.getCreateWAVThread(m_roadInfo1.nSoundCardNum, m_roadInfo1.roadInfo.nRoadNum);
  92. m_pCreateWAVThread2 = ThreadMan.getCreateWAVThread(m_roadInfo2.nSoundCardNum, m_roadInfo2.roadInfo.nRoadNum);
  93. if(m_pCreateWAVThread1 == nullptr || m_pCreateWAVThread2 == nullptr)
  94. {
  95. SPDLOG_LOGGER_ERROR(m_logger, "{} 获取录音线程失败", m_logBase);
  96. return false;
  97. }
  98. return true;
  99. }
  100. /* 清理数据 */
  101. void ConsistencyCompareThread::clearData()
  102. {
  103. }
  104. /* 比对两个wav文件的一致性 */
  105. bool ConsistencyCompareThread::compareConsistency()
  106. {
  107. CompareResult* result = LHCompare(m_wavFilePath1.fileName.c_str(), m_wavFilePath2.fileName.c_str(), m_sensitivity);
  108. if(result == nullptr)
  109. {
  110. SPDLOG_LOGGER_ERROR(m_logger, "{} 一致性比对失败,可能是文件格式不支持或动态库加载失败", m_logBase);
  111. return false;
  112. }
  113. /* 如果高相似度小于1,将两个通道反过来对比一下 */
  114. if(result->highest_similarity < 1)
  115. {
  116. delete result;
  117. result = nullptr;
  118. SPDLOG_LOGGER_WARN(m_logger, "{} 高相似度小于1,尝试反向对比", m_logBase);
  119. result = LHCompare(m_wavFilePath2.fileName.c_str(), m_wavFilePath1.fileName.c_str(), m_sensitivity);
  120. if(result == nullptr)
  121. {
  122. SPDLOG_LOGGER_ERROR(m_logger, "{} 一致性比对失败,可能是文件格式不支持或动态库加载失败", m_logBase);
  123. return false;
  124. }
  125. }
  126. SPDLOG_LOGGER_INFO(m_logger, "{} 一致性比对结果: 源文件: {}, 目标文件: {}, 最高相似度: {:.3f}, 平均相似度: {:.3f}",
  127. m_logBase, m_wavFilePath1.fileName, m_wavFilePath2.fileName, result->highest_similarity, result->average_similarity);
  128. /* 保存结果 */
  129. m_mutexResult.lock();
  130. m_consistencyResult.AddRetAICompareFile(result->highest_similarity / 100.0);
  131. m_mutexResult.unlock();
  132. delete result;
  133. result = nullptr;
  134. return true;
  135. }