Chcę napisać modulator głosu "na żywo".

0

Hej!
Mam taki plan, a mianowicie programuję już sobie jakiś czas w różnych językach, aktualnie najwięcej w pythonie i wpadłem na pomysł, aby napisać taki modulator głosu "na żywo". Oczywiście będzie to bardzo trudne i zajmie mi dużo czasu, ale nie od razu Rzym zbudowano. Zakładam ten wątek, ponieważ przychodzę z prośbą do Was, programistów, aby podesłali mi różne frameworki/moduły, tutoriale, wszystko co może mi się przydać, oczywiście sam również będę szukać, ale na tym forum na pewno znajdzie się ktoś zapoznany z tematem programowania "audio".
Z góry dzięki i miłego dnia/wieczora życzę! :)

(jeśli ktoś uważa, że dany język będzie lepszy od pythona do zaprogramowania tego, jestem otwarty na sugestie, choć najlepiej władam pythonem i trochę c#)

1

Zacznij od rozpoznania rynku:

https://github.com/juancarlospaco/pyvoicechanger

0
vpiotr napisał(a):

Zacznij od rozpoznania rynku:

https://github.com/juancarlospaco/pyvoicechanger

Dzięki, ale gość jak sprawdzałem kod to napisał tylko gui, chyba, że ja coś zepsułem przy montowania skryptu, bo doinstalowywałem parę modułów.
Gdyby się coś jeszcze znalazło to chętnie sprawdzę, sam natomiast znalazłem takie moduły:

  • pyaudio
  • pydub
  • pytgvoip (tak wiem, to VoIp, ale takiego protokołu używa się do komunikacji sieciowej, więc pomyślałem, że może się przyda)
  • synthplayer

Ps. Samo nagrywanie i zapisywanie głosu jest to ogarnięcia na pewno, ale żeby program na bieżąco modyfikował głos, będę musiał napisać "sterownik" do mikrofonu wirtualny, tak jak to ma, np. MorphVox czy inne podobne programy co nie? Gdyby ktoś wiedział o jakimś fajnym tutorialu, posiadał jakieś przydatne informacje etc. na ten temat to chętnie się po uczę!

1

A znasz teorię przetwarzania sygnałów? Bo zdaje się to ci będzie potrzebne - a to nie jest prosta dziedzina do ogarnięcia. Czyli najpierw teoria dotycząca samplowania sygnałów (przetwarzanie A/C), przetwarzania cyfrowego i potem dopiero potem odtwarzania - czyli C/A. Trochę nauki tutaj z tym będzie. Natomiast co do pomysłu takiego przetwarzania danych w locie przez skrypt pythonowy - to to bym raczej między bajki włożył.

1
vtx napisał(a):

A znasz teorię przetwarzania sygnałów? Bo zdaje się to ci będzie potrzebne - a to nie jest prosta dziedzina do ogarnięcia. Czyli najpierw teoria dotycząca samplowania sygnałów (przetwarzanie A/C), przetwarzania cyfrowego i potem dopiero potem odtwarzania - czyli C/A. Trochę nauki tutaj z tym będzie. Natomiast co do pomysłu takiego przetwarzania danych w locie przez skrypt pythonowy - to to bym raczej między bajki włożył.

Może trochę przesada z tą znajomością A/C -> C/A bo to załatwiają sterowniki oraz sama karta dźwiękowa. Rzeczywiście jednak sprawa nie jest banalna. Ogólne do przetwarzania sygnałów w locie zazwyczaj wykorzystuje się DSP. Rolę DSP może pełnić fizyczny wyspecjalizowany układ lub oprogramowanie. Fizyczne procesory or rozwiązań programowych zwykle różnią się szybkością przetwarzania sygnałów co finalnie przekłada się na "latencję". Latencja to najogólniej ujmując opóźnienie liczone np. w milisekundach pomiędzy sygnałem wejściowym a przetworzonym wyjściowym. Na jej czas składają się czas samplowania (A/D) + czas przetwarzania danych + czas ponownej konwersji na sygnał analogowy (D/A).

W Python mamy ogrom bibliotek do przetwarzania sygnałów oraz do wykonywania na nich operacji DSP lub analogicznych.

DSP można także realizować "po swojemu" jednak w tym przypadku Python jest zbyt wolny (co nie znaczy, że się nie da robić prostych rzeczy) by samodzielnie "w locie" wykonywać tysiące czy nawet miliony operacji na tablicach z próbkami sygnału. Także jeśli bierzesz Python zalecam korzystać z "gotowych" bibliotek.

Przetwarzanie sygnału w "locie".

Prawe w każdym języku i środowisku wygląda to tak samo bo wynika ze sposobu pracy kart dźwiękowych. Wygląda to mniej więcej tak:

  • Tworzysz bufor na samplowany dźwięk. Taki bufor jest wypełniany przez bibliotekę współpracującą ze sterownikiem karty dźwiękowej.
    Po zapełnieniu bufora wywoływana jest funkcja "callback", która zwykle zwraca ten bufor + jego długość. Z tego bufora dane wyciągasz i "obrabiasz" a finanie przesyłasz do bufora wyjściowego.
  • bufor wyjściowy działa podobnie ale tutaj już jest więcej sposobów. Zwykle podajesz adres i ilość bajtów d odtworzenia a biblioteka załatwia całą resztę.

Osobiście do zabawy w DSP w czasie rzeczywistym zdecydowanie bardziej polecam języki kompilowane a nie interpretowane jak Python.
Bardzo łatwym zestawem do ogarnięcia i rozpoczęcia zabawy jest np. Delphi / C# / C++ z bibliotekami BASS.
Możesz też spróbować zabawy w JavaScript ( o tyle fajny, że wisi Ci warstwa sprzętowa ). Kiedyś wykorzystując wbudowane niemal w każdą przeglądarkę możliwości zrobiłem: https://www.enjoyaudio.org/ ( wykorzystuje WebAudio API https://www.w3.org/TR/webaudio/ ).Bardzo przyjazne na początek, że by ogarnąć problematykę przetwarzania na żywo.

Kiedyś ze względu na bogactwo bibliotek chciałem przetwarzać sygnały w locie z użyciem Python. Niestety poległem na zgraniu wszystkiego ze sprzętem. Przetwarzanie plików to bajka ale strumienia "rel time" już mi nie wyszło. Niestety Pythona prawie nie umiem wcale więc nie traktuj tego jako osądu Pythona. Inna sprawa, że jak już wcześniej napisałem przez samo to, że Python jest interpreterem i się nie kompiluje dużo wydajności tracimy w sytuacjach kiedy funkcje DSP chcemy programować "po swojemu".

0

Google: DAFX book, ASIO drivers, FIR filter. To na szybko, bardziej szczegółowo mogę jak wrócę z pracy ale już masz materiału na parę lat studiów jeśli chciałbyś to zgłębiać dokładnie ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1