Search
Write a publication
Pull to refresh
3
0
Vasily @vasan

Programmer, musician, composer

Send message

Заинтересовала идея реализации синтезатора на основе Teensy 4.1, а именно портирование своего VSTi синта "Marazmator" в виде автономного девайса. Первоначально думал использовать Raspberry Pi 3+, однако как тут прочитал, что Teensy 4.1 вроде как пошустрее будет. Но опять терзают сомнения, так как хватит ли его мощи для синтеза + ревербератор и фленджер. Ревер также планирую портировать с VST DReverb Lite. Но и ещё для управления нужно с дюжину переменных резисторов, которые нужно оцифровать хотябы 10 битным АЦП. И дисплей также очень желателен, в идеале 3,5'' 480x320, но для начала пойдёт что то вроде 1,3'' OLED HAT 128x64.

Вот и думаю, как лучше реализовать идею. Может кто подскажет "в какую сторону копать"?

Ещё один недостаток был выявлен при тестировании. Если разговаривает ребёнок, или взрослый говорит фальцетом, то Silero VAD его не определяет как голос. С этим надо что то делать. Можно ли с Вами обсудить этот вопрос, и если требуется финансирование, давайте обсудим.

Само собой если ресемплинг сделать самому )

Ну а если попытаться скормить алгоритму данные без ресемплинга - то получаем исключение, по крайней мере если собрать C++ пример в Visual Studio.

Следовательно частота дискретизации 44100 Гц не поддерживается?

Тогда как и писал вначале этой ветки о необходимости ресемплера в самой библиотеке.

32 и 48 приводятся в 16 тупо усреднением каждого 2 или 3 семпла

Ну так и 44100 Гц и вообще любую частоту дискретизации привести к требуемой с помощью простой линейной интерполяции. Если это в самой библиотеки приводится.

А вот сегодня решил адаптировать пример silero-vad-onnx.cpp таким образом, чтобы он мог работать с разными частотами дискретизации, изменив всего пару строчек:

  1. при создании VadIterator.
    VadIterator vad(model_path, wav_reader.sample_rate()); // тут явно указал частоту дискретизации тестируемого wav-файла

  2. при расчёте временных меток:

    const float sample_rate_float = wav_reader.sample_rate(); // в примере было: const float sample_rate_float = 16000.0f;

При отладке в Visual Studio возникает исключение с параметром error_code = 2 если частота дискретизации 44100 Гц. С 16000 Гц всё работает хорошо.

Возникло исключение при частоте дискретизации 44100 Гц.
Возникло исключение при частоте дискретизации 44100 Гц.

Неужто параметр исключения ORT_INVALID_ARGUMENT подразумевает что задана неверная частота дискретизации?

В моём случае это приложение реального масштаба времени, предназначенное для студийной работы, и timestamp-ы в этом случае не требуются. Аудиоданные с аудиовхода постоянно считываются драйвером ASIO в буфер, размер которого можно задать в панели управления ASIO. Внутри программы ещё один буфер - накопительный, размером 512 семплов (как раз такой как в примере https://github.com/snakers4/silero-vad/blob/master/examples/cpp/silero-vad-onnx.cpp).

Всё прекрасно работает. Речь прекрасно определяется и даже многие музыкальные инструменты не вызывают ложных срабатываний, однако как стоит зазвучать гитаре или роялю - тут 50 на 50 ложных срабатываний. И это недопустимо.

Вот и думаю, может вообще отказаться от VAD, вместо него смотреть в сторону библиотек для классификации звуков?

По скорости, он действительно быстрее

В данном случае не важна скорость. Тут главное определить содержит ли буфер с аудиоданными речь, то есть функция должна возвратить true, всё остальное должно возвращать false.

Речь попугая так скажем похожа на человеческую, порой и люди то отличить не смогут. Рэп когда просто читается, так это также речь. Если на заднем фоне, то это тоже по сути то же речь, если её нормализовать с помощью компрессора. А вот пение, особенно гласными, уже будет иметь периодический вид волновой формы, поэтому "технически" на речь уже не тянет (некоторые синтезаторные патчи могут иметь аналогичные спектрограмы). Хотя смотря для каких целей, если оценивать "музыкальность" то да. Но а если как определение голоса в целом то все приведённые случаи можно определить как речь.

Дополнительно можно привести пример "голос, пропущенный через вокодер или гармонайзер" ).

По крайней мере при обучении модели можно же задействовать семплы рояля и гитары и указать что это не речь?

Ну это просто неправда. Цитата из документации:

Прошу прощения, действительно работает! Просто я разрабатываю на С++ и не читаю всё что касается питона.

Просто определить наличие речи без расшифровки. Любые другие звуки, будь то музыка, шум должны игнорироваться.

И ещё одна неудобная особенность Silero VAD, это работа только на частоте дискретизации 16000 Гц. Работаю со студийным звуком, захват которого происходит через ASIO, где обычно используются более высокие частоты дискретизации. Нельзя ли интегрировать ресемплер в саму библиотеку, чтобы пользователь смог указать свою частоту дискретизации?

Попробовал использовать Silero VAD в своём приложении, где требуется в реальном масштабе времени реагировать на голосовую активность. Всё хорошо работает, однако Silero VAD реагирует также на звуки фортепиано и гитары, чего по идее быть не должно. Решил попробовать другой - Ten-VAD, ситуация аналогичная - реагирует на звуки музыкальных инструментов струнной группы. Не ужели ни кто не создал VAD, реагирующий только на человеческий голос, и не допускающий ложных срабатываний от других звуков?

какой-то Васян

Попрошу не обобщать! Никогда не занимался вирусописательством.

И что из этого? У меня футсвич к системнику вообще через LPT порт подключен )

По твоему творцы обязаны под пореблядство прогибаться?

Помню делал подобный блок педалей вообще без всякой электроники. Просто купил три кнопки для дверного звонка, продавались одно время такие - с квадратной площадкой, куда можно было нажимать не только рукой, но и ногой. Прикрутил их саморезами к доске а провода распаял на разъём для LPT порта от старого принтера.

В качестве драйвера LPT порта, использовал LPTWDMIO от Валерия Ковтуна. Также написал небольшую программу на Delphi, которая считывала нажатия на педали и отправляла требуемые MIDI-сообщения через virtualMIDI SDK от Тобиаса Эриксена. Так что получилось всё очень просто. )

Музыкальный софт, например, в основном для Win и Mac пишут. Зайдите на сайт №1 в мире по музыкальному софту, и посмотрите много ли там предлагают под Linux. Да и подавляющее число производителей музыкального оборудования не поддерживают Linux на уровне драйверов.

Если у вас расчёты в плавающей точке, то справедливости ради, в современных Дельфях в x64 стало получше, т.к. перешли с FPU на SSE2.

А это справедливо для каких именно чисел: single, double или extended?

TComponent обладает методами, которые позволяют реализовать систему владения объектами и из коробки стыкуется с многими штатными классами.

Вот в том то и дело, большая часть автоматического сбора мусора в Delphi/Lazarus решается производными TComponent. А освобождение остальных объектов, производных TObject, особо не напрягает. Поэтому не всегда овчинка стоит выделки, мне лично незачем писать отдельный код для этого, достаточно банального obj.Free; или FreeAndNil(obj); и это абсолютно не напрягает.

Во-вторых, Delphi 7? Серьёзно?

Первая версия PolyGAS была разработана в 2005 году, в те времена Delphi 7 была де-факто стандартом для многих разработчиков Delphi.

Последняя версия уже была сделана на Delphi XE8 в 2017 году, после чего было решено портировать код на С++.

Information

Rating
11,650-th
Location
Красноярский край, Россия
Date of birth
Registered
Activity

Specialization

DSP/VST/DAW Developer
OOP
C++
C
Software development
Visual Studio
Delphi
Lazarus
PHP
Objective-C