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

Chcę napisać modulator głosu "na żywo".
R3G33
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:38
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#)

Silv
Hm, nie ma głowy…
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1
R3G33
  • Rejestracja:prawie 6 lat
  • Ostatnio:prawie 3 lata
  • Postów:38
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ę!

VT
  • Rejestracja:ponad 5 lat
  • Ostatnio:prawie 2 lata
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ł.

katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
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".


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
edytowany 1x, ostatnio: katakrowa
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
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 ;)

edytowany 1x, ostatnio: alagner
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)