Skip to content

Commit

Permalink
Refactoring (#5)
Browse files Browse the repository at this point in the history
Initial code cleanups
  • Loading branch information
Thalhammer authored May 17, 2021
1 parent 242560d commit bc2331c
Show file tree
Hide file tree
Showing 54 changed files with 1,576 additions and 664 deletions.
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
root = true

[!*.{h,cpp}]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.{h,cpp}]
indent_style = tab
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
trim_trailing_whitespace = false
39 changes: 26 additions & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,33 @@
cmake_minimum_required(VERSION 3.10)
project(snowboy)
cmake_minimum_required(VERSION 3.12)
project(snowman VERSION 1.0.0 DESCRIPTION "Snowman hotword detection library")
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)

#option(SNOWBOY_CXX11_COMPAT "Build library with C++11 strings disable to be binary compatible with the original release." OFF)
set(SNOWBOY_CXX11_COMPAT ON)
option(SNOWMAN_CXX11_COMPAT "Build library with C++11 strings disabled to be binary compatible with the original release." ON)
option(SNOWMAN_BUILD_APPS "Build helper applications like enroll or cut" ON)
option(SNOWMAN_BUILD_TESTS "Build unit tests (requires gtest and openssl)" ON)
option(SNOWMAN_BUILD_SHARED "Build library as a shared library instead of a static library" OFF)
# According to steam ~99.17% of users have at least ssse3
# and 100% have SSE, SSE2 and SSE3, so this is on by default
option(SNOWMAN_BUILD_WITH_SSE3 "Enable sse3 optimizations" ON)
# ~98.3%, so this is on by default as well
option(SNOWMAN_BUILD_WITH_SSE4 "Enable sse4 optimizations" ON)
# ~94.7%
option(SNOWMAN_BUILD_WITH_AVX "Enable avx optimizations" OFF)
# ~82%
option(SNOWMAN_BUILD_WITH_AVX2 "Enable avx2 optimizations" OFF)
option(SNOWMAN_BUILD_NATIVE "Build library for the current cpu. This makes sure it uses every instruction set available, but the resulting binary probably won't run on older hardware." OFF)

if(SNOWBOY_CXX11_COMPAT)
add_compile_options(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()

add_compile_options(-std=c++0x -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Winit-self -rdynamic)
add_compile_options(-DHAVE_POSIX_MEMALIGN -I. -fno-omit-frame-pointer -fPIC -msse -msse2)
add_compile_options("$<$<CONFIG:DEBUG>:-fsanitize=address>")
add_link_options(-rdynamic)
add_link_options("$<$<CONFIG:DEBUG>:-fsanitize=address>")

if(SNOWMAN_CXX11_COMPAT)
add_compile_options(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()

add_subdirectory(lib)
add_subdirectory(apps)
add_subdirectory(test)
if(SNOWMAN_BUILD_APPS)
add_subdirectory(apps)
endif()
if(SNOWMAN_BUILD_TESTS)
add_subdirectory(test)
endif()
6 changes: 1 addition & 5 deletions apps/cut.cpp
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
#include <cstring>
#include <framer-stream.h>
#include <fstream>
#include <helper.h>
#include <iostream>
#include <pipeline-personal-enroll.h>
#include <snowboy-detect.h>
#include <template-container.h>
#include <template-enroll-stream.h>
#include <types.h>
#include <wave-header.h>

const static auto root = detect_project_root();

Expand Down
10 changes: 0 additions & 10 deletions apps/enroll.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,7 @@
#include <cstring>
#include <framer-stream.h>
#include <fstream>
#include <helper.h>
#include <iostream>
#include <openssl/crypto.h>
#include <openssl/md5.h>
#include <pipeline-personal-enroll.h>
#include <snowboy-detect.h>
#include <template-container.h>
#include <template-enroll-stream.h>

const static auto root = detect_project_root();

Expand All @@ -20,9 +13,6 @@ int main(int argc, const char** argv) {
bool cut_recordings;
if (!parse_args(argc, argv, output, recordings, lang, cut_recordings)) return -1;

{
std::ofstream t{output, std::ios::binary | std::ios::trunc};
}
snowboy::SnowboyPersonalEnroll enroll{root + "resources/pmdl/" + lang + "/personal_enroll.res", output};
snowboy::SnowboyTemplateCut cut{root + "resources/pmdl/" + lang + "/personal_enroll.res"};
for (auto& e : recordings) {
Expand Down
41 changes: 33 additions & 8 deletions lib/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

add_library(snowboy_reimpl
set(SNOWMAN_SRC
${CMAKE_CURRENT_SOURCE_DIR}/agc.cpp
${CMAKE_CURRENT_SOURCE_DIR}/audio-lib.cpp
${CMAKE_CURRENT_SOURCE_DIR}/dtw-lib.cpp
Expand Down Expand Up @@ -28,6 +28,7 @@ add_library(snowboy_reimpl
${CMAKE_CURRENT_SOURCE_DIR}/raw-nnet-vad-stream.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-debug.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-detect.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-detect-c.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-io.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-math.cpp
${CMAKE_CURRENT_SOURCE_DIR}/snowboy-options.cpp
Expand All @@ -41,11 +42,35 @@ add_library(snowboy_reimpl
${CMAKE_CURRENT_SOURCE_DIR}/vad-state-stream.cpp
${CMAKE_CURRENT_SOURCE_DIR}/vector-wrapper.cpp
)
target_include_directories(snowboy_reimpl PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_directories(snowboy_reimpl PRIVATE /usr/lib/atlas-base)
target_link_libraries(snowboy_reimpl dl m rt pthread f77blas cblas lapack_atlas atlas)
if(SNOWMAN_BUILD_SHARED)
add_library(snowman SHARED ${SNOWMAN_SRC})
set_target_properties(snowman PROPERTIES VERSION ${PROJECT_VERSION})
set_target_properties(mylib PROPERTIES SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR})
else()
add_library(snowman STATIC ${SNOWMAN_SRC})
endif()
target_compile_features(snowman PRIVATE cxx_std_11)
target_compile_options(snowman PRIVATE -Wall -Wno-sign-compare -Winit-self -rdynamic)
target_compile_options(snowman PRIVATE -DHAVE_POSIX_MEMALIGN -fno-omit-frame-pointer)
target_include_directories(snowman PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_directories(snowman PRIVATE /usr/lib/atlas-base)
target_link_libraries(snowman m pthread f77blas cblas lapack_atlas atlas)

if(SNOWMAN_BUILD_WITH_SSE3)
target_compile_options(snowman PRIVATE -msse -msse2 -msse3 -mssse3)
endif()
if(SNOWMAN_BUILD_WITH_SSE4)
target_compile_options(snowman PRIVATE -msse4.2)
endif()
if(SNOWMAN_BUILD_WITH_AVX)
target_compile_options(snowman PRIVATE -mavx)
endif()
if(SNOWMAN_BUILD_WITH_AVX2)
target_compile_options(snowman PRIVATE -mavx2)
endif()
if(SNOWMAN_BUILD_NATIVE)
target_compile_options(snowman PRIVATE -march=native -mtune=native)
endif()

add_library(snowboy ALIAS snowman)

file(TOUCH ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp)
add_library(snowboy ${CMAKE_CURRENT_BINARY_DIR}/dummy.cpp)
target_link_libraries(snowboy -Wl,--start-group snowboy_reimpl -Wl,--end-group)
#target_link_libraries(snowboy -Wl,--start-group snowboy_reimpl ${CMAKE_CURRENT_SOURCE_DIR}/../resources/nnet-lib.o -Wl,--end-group)
2 changes: 1 addition & 1 deletion lib/audio-lib.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include <audio-lib.h>
#include <matrix-wrapper.h>
#include <snowboy-debug.h>
#include <types.h>
#include <wave-header.h>

namespace snowboy {
float GetMaxWaveAmplitude(const WaveHeader& hdr) {
Expand Down
85 changes: 35 additions & 50 deletions lib/dtw-lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ namespace snowboy {
auto local_22c = std::numeric_limits<float>::max();
for (auto row = 0; row < param_2.m_rows; row++) {
/* try { // try from 00101d18 to 00101d74 has its CatchHandler @ 00102283 */
int local_1e8, local_1e4, local_1e0, local_1dc;
int local_1e8 = 0, local_1e4 = 0, local_1e0 = 0, local_1dc = 0;
snowboy::SlidingDtw::ComputeBandBoundary(row, &local_1e8, &local_1e4);
if (0 < row) {
snowboy::SlidingDtw::ComputeBandBoundary(row - 1, &local_1e0, &local_1dc);
Expand Down Expand Up @@ -200,22 +200,16 @@ namespace snowboy {
Matrix local_1d8;
local_1d8.Resize(param_2.m_rows, param_3.m_rows);
for (auto row = 0; row != local_1d8.m_rows; row++) {
const int iVar7 = (int(row) - 1) * (int)local_1d8.m_stride;
const int iVar14 = row * local_1f8.m_stride;
const int local_284 = row * local_1f8.m_stride;
const int iVar11 = row * local_1d8.m_stride;
const int iVar15 = row * local_1d8.m_stride;
if (0 < local_1d8.m_cols) {
auto pfVar9 = local_1d8.m_data + (long)iVar7 + -1;
auto pfVar8 = local_1d8.m_data + (long)iVar11 + -1;
if (row == 0) {
auto lVar12 = 0;
do {
auto pfVar9 = local_1d8.m_data + (row - 1) * local_1d8.m_stride - 1;
auto pfVar8 = local_1d8.m_data + (row * local_1d8.m_stride) - 1;
for (auto lVar12 = 0; lVar12 < local_1d8.m_cols; lVar12++) {
if (row == 0) {
while (((int)lVar12 == 0 || (row == 0))) {
pfVar9 = pfVar9 + 1;
local_1d8.m_data[lVar12] = local_1f8.m_data[lVar12];
lVar12 += 1;
pfVar9 = pfVar9 + 1;
pfVar8 = pfVar8 + 1;
lVar12++;
if (local_1d8.m_cols <= (int)lVar12) goto LAB_00186e9d;
}
auto fVar16 = pfVar9[1];
Expand All @@ -225,18 +219,12 @@ namespace snowboy {
if (*pfVar9 <= fVar16) {
fVar16 = *pfVar9;
}
auto lVar6 = iVar14 + lVar12;
lVar12 += 1;
pfVar8[1] = fVar16 + local_1f8.m_data[lVar6];
pfVar9 = pfVar9 + 1;
pfVar8 = pfVar8 + 1;
} while ((int)lVar12 < local_1d8.m_cols);
} else {
auto lVar12 = 0;
do {
pfVar8[1] = fVar16 + local_1f8.m_data[row * local_1f8.m_stride + lVar12];

} else {
if (((int)lVar12 == 0) || (row == 0)) {
if ((int)lVar12 == 0) {
local_1d8.m_data[iVar15] = local_1f8.m_data[local_284] + local_1d8.m_data[iVar15 - local_1d8.m_stride];
local_1d8.m_data[row * local_1d8.m_stride] = local_1f8.m_data[row * local_1f8.m_stride] + local_1d8.m_data[(row - 1) * local_1d8.m_stride];
}
} else {
auto fVar16 = pfVar9[1];
Expand All @@ -246,40 +234,37 @@ namespace snowboy {
if (*pfVar9 <= fVar16) {
fVar16 = *pfVar9;
}
pfVar8[1] = fVar16 + local_1f8.m_data[iVar14 + lVar12];
pfVar8[1] = fVar16 + local_1f8.m_data[row * local_1f8.m_stride + lVar12];
}
lVar12 += 1;
pfVar9 = pfVar9 + 1;
pfVar8 = pfVar8 + 1;
} while ((int)lVar12 < local_1d8.m_cols);
}
pfVar9 = pfVar9 + 1;
pfVar8 = pfVar8 + 1;
}
}
LAB_00186e9d:
[]() {}(); // TODO: This is just here cause for some reason a label directly before the closing bracket does not work
}
auto local_228 = -1;
int iVar11 = local_1d8.m_rows - 1;
SubVector{local_1d8, iVar11}.Min(&local_228);
auto fVar16 = local_1d8.m_data[local_1d8.m_stride * iVar11 + local_228];
auto min_index = -1;
auto min_value = SubVector{local_1d8, local_1d8.m_rows - 1}.Min(&min_index);
if (param_4 != nullptr) {
while (iVar11 != 0) {
for (int iVar11 = local_1d8.m_rows - 1; iVar11 != 0;) {
// TODO: This is wrong
// If I look at the code it should only be
// param_4->at(iVar11).push_back(local_228);
// param_4->at(iVar11).push_back(min_index);
// But that produces different results from what it should
if (param_4->at(iVar11).empty())
param_4->at(iVar11).push_back(local_228);
param_4->at(iVar11).push_back(min_index);
else
param_4->at(iVar11).at(0) = local_228;
if (0 >= local_228) {
param_4->at(iVar11).at(0) = min_index;
if (0 >= min_index) {
iVar11--;
continue;
}
auto fVar18 = local_1d8.m_data[local_1d8.m_stride * iVar11 + local_228] - local_1f8.m_data[local_1f8.m_stride * iVar11 + local_228];
float pfVar8[3] = {fVar18, fVar18, fVar18};
pfVar8[0] = std::abs(fVar18 - local_1d8.m_data[(iVar11 + -1) * local_1d8.m_stride + (local_228 - 1)]);
pfVar8[1] = std::abs(fVar18 - local_1d8.m_data[(local_228 - 1) + iVar11 * local_1d8.m_stride]);
pfVar8[2] = std::abs(fVar18 - local_1d8.m_data[(iVar11 + -1) * local_1d8.m_stride + local_228]);
auto fVar18 = local_1d8.m_data[local_1d8.m_stride * iVar11 + min_index] - local_1f8.m_data[local_1f8.m_stride * iVar11 + min_index];
float pfVar8[3];
pfVar8[0] = std::abs(fVar18 - local_1d8.m_data[(iVar11 + -1) * local_1d8.m_stride + (min_index - 1)]);
pfVar8[1] = std::abs(fVar18 - local_1d8.m_data[(min_index - 1) + iVar11 * local_1d8.m_stride]);
pfVar8[2] = std::abs(fVar18 - local_1d8.m_data[(iVar11 + -1) * local_1d8.m_stride + min_index]);
auto pfVar9 = pfVar8 + 1;
if (pfVar8[0] <= pfVar8[1]) {
pfVar9 = pfVar8;
Expand All @@ -290,26 +275,26 @@ namespace snowboy {
auto iVar10 = (int)((long)((long)pfVar9 - (long)pfVar8) >> 2);
if (iVar10 != 0) {
if (iVar10 == 1) {
local_228 -= 1;
min_index -= 1;
} else {
if (iVar10 == 2) {
iVar11 = iVar11 + -1;
iVar11--;
}
}
} else {
local_228 -= 1;
iVar11 = iVar11 + -1;
min_index -= 1;
iVar11--;
}
}
// TODO: This is wrong
// If I look at the code it should only be
// param_4->at(0).push_back(local_228);
// param_4->at(0).push_back(min_index);
// But that produces different results from what it should
if (param_4->at(0).empty())
param_4->at(0).push_back(local_228);
param_4->at(0).push_back(min_index);
else
param_4->at(0).at(0) = local_228;
param_4->at(0).at(0) = min_index;
}
return fVar16 / param_2.m_rows;
return min_value / param_2.m_rows;
}
} // namespace snowboy
2 changes: 0 additions & 2 deletions lib/dtw-lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ namespace snowboy {
// TODO: This could be replaced with enum DistanceType
std::string distance_metric;
};
static_assert(sizeof(SlidingDtwOptions) == 0x10);
struct SlidingDtw {
SlidingDtwOptions m_options;
std::deque<std::deque<float>> field_x18;
Expand All @@ -38,7 +37,6 @@ namespace snowboy {
void ComputeBandBoundary(int, int*, int*) const;
virtual ~SlidingDtw();
};
static_assert(sizeof(SlidingDtw) == 0x78);

float DtwAlign(DistanceType, const MatrixBase&, const MatrixBase&, std::vector<std::vector<int>>*);
} // namespace snowboy
1 change: 0 additions & 1 deletion lib/eavesdrop-stream.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,4 @@ namespace snowboy {
virtual std::string Name() const override;
virtual ~EavesdropStream();
};
static_assert(sizeof(EavesdropStream) == 0x28);
} // namespace snowboy
Loading

0 comments on commit bc2331c

Please sign in to comment.