summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules3
-rw-r--r--CMakeLists.txt31
-rw-r--r--src/audio/manager.cpp13
-rw-r--r--src/audio/manager.hpp3
m---------subprojects/rnnoise0
5 files changed, 48 insertions, 2 deletions
diff --git a/.gitmodules b/.gitmodules
index aae3862..e173bb4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -13,6 +13,9 @@
[submodule "subprojects/miniaudio"]
path = subprojects/miniaudio
url = https://github.com/mackron/miniaudio
+[submodule "subprojects/rnnoise"]
+ path = subprojects/rnnoise
+ url = https://github.com/xiph/rnnoise
[submodule "subprojects/qrcodegen"]
path = subprojects/qrcodegen
url = https://github.com/nayuki/QR-Code-generator
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7a55057..ab51f67 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,6 +11,7 @@ option(USE_LIBHANDY "Enable features that require libhandy (default)" ON)
option(ENABLE_VOICE "Enable voice suppport" ON)
option(USE_KEYCHAIN "Store the token in the keychain (default)" ON)
option(ENABLE_NOTIFICATION_SOUNDS "Enable notification sounds (default)" ON)
+option(ENABLE_RNNOISE "Enable RNNoise for voice activity detection (default)" ON)
option(ENABLE_QRCODE_LOGIN "Enable QR code login (default)" ON)
find_package(nlohmann_json REQUIRED)
@@ -161,12 +162,40 @@ if (ENABLE_VOICE)
target_link_libraries(abaddon ${CMAKE_DL_LIBS})
+ if (ENABLE_RNNOISE)
+ find_package(rnnoise QUIET)
+ if (NOT rnnoise_FOUND)
+ message("rnnoise was not found and will be included as a submodule")
+ # This is potentially really stupid
+ add_library(rnnoise
+ subprojects/rnnoise/src/arch.h
+ subprojects/rnnoise/src/celt_lpc.c
+ subprojects/rnnoise/src/celt_lpc.h
+ subprojects/rnnoise/src/common.h
+ subprojects/rnnoise/src/denoise.c
+ subprojects/rnnoise/src/kiss_fft.c
+ subprojects/rnnoise/src/kiss_fft.h
+ subprojects/rnnoise/src/opus_types.h
+ subprojects/rnnoise/src/pitch.c
+ subprojects/rnnoise/src/pitch.h
+ subprojects/rnnoise/src/rnn_data.c
+ subprojects/rnnoise/src/rnn_data.h
+ subprojects/rnnoise/src/rnn_reader.c
+ subprojects/rnnoise/src/rnn.c
+ subprojects/rnnoise/src/rnn.h
+ subprojects/rnnoise/src/tansig_table.h
+ subprojects/rnnoise/src/_kiss_fft_guts.h
+ subprojects/rnnoise/include/rnnoise.h)
+ target_include_directories(rnnoise PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/subprojects/rnnoise/include")
+ target_link_libraries(abaddon rnnoise)
+ endif ()
+ endif ()
+
if (APPLE)
target_link_libraries(abaddon "-framework CoreFoundation")
target_link_libraries(abaddon "-framework CoreAudio")
target_link_libraries(abaddon "-framework AudioToolbox")
endif ()
-
endif ()
if (${ENABLE_NOTIFICATION_SOUNDS})
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp
index 67fbcd9..f86c484 100644
--- a/src/audio/manager.cpp
+++ b/src/audio/manager.cpp
@@ -64,6 +64,9 @@ void capture_data_callback(ma_device *pDevice, void *pOutput, const void *pInput
AudioManager::AudioManager() {
m_ok = true;
+ m_rnnoise = rnnoise_create(nullptr);
+ spdlog::get("audio")->info("RNNoise expects {} frames", rnnoise_get_frame_size());
+
int err;
m_encoder = opus_encoder_create(48000, 2, OPUS_APPLICATION_VOIP, &err);
if (err != OPUS_OK) {
@@ -143,6 +146,7 @@ AudioManager::~AudioManager() {
ma_device_uninit(&m_capture_device);
ma_context_uninit(&m_context);
RemoveAllSSRCs();
+ rnnoise_destroy(m_rnnoise);
}
void AudioManager::AddSSRC(uint32_t ssrc) {
@@ -419,7 +423,14 @@ void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) {
UpdateCaptureVolume(new_pcm.data(), frames);
- if (m_capture_peak_meter / 32768.0 < m_capture_gate) return;
+ static float idc[480];
+ static float rnnoise_input[480];
+ // take left channel
+ for (int i = 0; i < 480; i++) {
+ rnnoise_input[i] = static_cast<float>(pcm[i * 2]);
+ }
+ float prob = rnnoise_process_frame(m_rnnoise, idc, rnnoise_input);
+ if (prob < m_capture_gate) return;
m_enc_mutex.lock();
int payload_len = opus_encode(m_encoder, new_pcm.data(), 480, static_cast<unsigned char *>(m_opus_buffer), 1275);
diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp
index ed40f35..0083a1f 100644
--- a/src/audio/manager.hpp
+++ b/src/audio/manager.hpp
@@ -14,6 +14,8 @@
#include <miniaudio.h>
#include <opus.h>
#include <sigc++/sigc++.h>
+#include <rnnoise.h>
+
#include "devices.hpp"
// clang-format on
@@ -115,6 +117,7 @@ private:
AudioDevices m_devices;
+ DenoiseState *m_rnnoise;
std::atomic<uint32_t> m_rtp_timestamp = 0;
public:
diff --git a/subprojects/rnnoise b/subprojects/rnnoise
new file mode 160000
+Subproject 1cbdbcf1283499bbb2230a6b0f126eb9b236def