Dzisiaj porozmawiamy sobie o jednym z pakietów jaki nie zawiera się w standardowej bibliotece języka Python w związku z czym, konieczna będzie jego instalacja w systemie o nazwie "pip". Pokażę Wam na czym polega pakiet "pydub" w Pythonie oraz jak dzięki niemu możemy odtwarzać dźwięk, w tym klipy muzyczne. Może zainteresuje Was programowanie od strony dźwiękowej :)?
Tweet |
PAKIET "PYDUB" WYMAGA INSTALACJI
"pydub" jest jednym z pakietów umożliwiających odtwarzanie plików muzycznych i dźwiękowych w formatach "mp3", "wav" oraz "ogg". Nie należy ona do standardowej biblioteki Pythona, w związku z czym trzeba ją zainstalować samodzielnie przy pomocy "pip", prostego w użyciu systemu zarządzania pakietami w Pythonie. Zaznaczam od razu, że to nie jest artykuł tłumaczący od podstaw zasady użycia tego systemu, więc wszelkie problemy dotyczące samego systemu nie będą tu omawiane. Zostanie wytłumaczone tylko to, co ma związek z niniejszym pakietem.
INSTALACJA BIBLIOTEKI "FFMPEG"
Aby móc z tego skorzystać, konieczne jest zainstalowanie niezbędnej biblioteki noszącej nazwę "FFmpeg". Jest ona całkowicie darmowa i umożliwi nam odtwarzanie plików jakie spróbuje otworzyć pakiet "pydub". Wystarczy przejść na stronę główną i pobrać jedno z archiwów. Ja skorzystałem z wersji "ffmpeg-4.2.2-win64-static", gdyż taka była używana w książce dzięki której dowiedziałem się w ogóle o istnieniu takiego pakietu.
Po pobraniu archiwum, wypakowujemy pliki i całą zawartość przenosimy sobie do "Program Files" tworząc katalog o dowolnej nazwie. Następnie, trzeba przejść do zmiennych środowiskowych, znaleźć wpis o nazwie "Path" i wcisnąć "Edytuj". Tam z kolei dodajemy sobie nową wartość ("Nowy") i wprowadzamy bezbłędnie ścieżkę do katalogu zawierającego w sobie pliki należące do "ffmpeg".
Aby prawidłowo zainstalować "ffmpeg", należy dodać ścieżkę do plików przechodząc do okna edycji zmiennych środowiskowych.
Teraz można przejść do instalacji samego pakietu "pydub" ;).
INSTALACJA PAKIETU
Kierujemy się do wiersza poleceń (najlepiej z uprawnieniami administratora) i wpisujemy następujące polecenie:
pip install pydub
Po wciśnięciu klawisza Enter, "pip" przejdzie do instalacji pakietu umieszczając zawartość w katalogu "site-packages" znajdującym się w folderze z zainstalowanym Pythonem. Pakiet "pydub" wcale nie jest gigantycznych rozmiarów, więc samo pobieranie pójdzie bardzo szybko :). Gdy zobaczycie ten komunikat:
Komunikat o poprawności instalacji pakietu "pydub" w systemie "pip".
możecie być pewni, że ten etap macie już z głowy.
MOŻE BYĆ POTRZEBNE COŚ JESZCZE
Muszę Was uprzedzić przed potencjalnym problemem jaki może wyjść na jaw przy próbie odtworzenia dowolnego klipu dźwiękowego. Zerknijcie na ten punkt, jeżeli nic nie będzie słychać podczas uruchamiania programu mimo poprawnego zapisu kodu. Podczas korzystania z "pydub", dowiedziałem się że systemy Windows mogą jeszcze wymagać doinstalowania kolejnego pakietu, "simpleaudio". W moim przypadku to okazało się niezbędne. Kiedy doświadczycie takiego problemu, wpiszcie sobie jeszcze to:
pip install simpleaudio
Sprawa się komplikuje jeszcze bardziej, gdyż sam pakiet może nie chcieć się zainstalować wymagając dodatku w postaci "Microsoft C++ Build Tools"!
Pakiet "simpleaudio" może zaprotestować przy instalacji wymagając dodatku "Microsoft C++ Build Tools"!
Jedyne co mi pomogło w powyższej sytuacji, to zajrzenie na tę stronę, pobranie instalatora i zainstalowanie całego "Windows 10 SDK". W tym komplecie znajduje się wspomniane "Microsoft C++ Build Tools", jednak sam ten plik nie załatwił sprawy. więc spróbujcie pobrać cały wspomniany zestaw. Miejcie na uwadze, że to Wam pochłonie na dzień dobry parę gigabajtów! Po instalacji, dobrze jest to "poprawić" ponownym uruchomieniem komputera i spróbować jeszcze raz wywołać powyższe polecenie z "pip".
ZESTAW METOD
Od tej chwili, interesuje nas sam pakiet "pydub" i jego zawartość. "pydub" wspiera popularne formaty takie jak "mp3", "wav" czy "ogg", choć mogą być jeszcze jakieś inne. Po zaopatrzeniu się w dowolny plik dźwiękowy, wklejamy go sobie do tego samego katalogu, w jakim będzie znajdować się nasz kod źródłowy, a w nim z kolei zajmiemy się wywoływaniem metod.
Tworzymy sobie nowy plik z rozszerzeniem ".py" i zapisujemy w wybranym przez nas katalogu. Na samym początku importujemy z modułu "pydub" na samej górze klasę "AudioSegment" odpowiadającą za przechowywanie danych o pliku:
from pydub import AudioSegment
IMPORT PLIKU DŹWIĘKOWEGO
Pierwszym punktem zapoznania się z pakietem to metoda importująca plik, od której zawsze będziecie zaczynać kodowanie: "from_file". Charakteryzuje się ona nieco innym sposobem zapisu parametrów aktualnych i zwraca obiekt "AudioSegment". Przyjrzyjcie się jej:
sound = AudioSegment.from_file("plik.mp3", format="mp3")
Wynik koniecznie przypisać do nowej zmiennej, gdyż później będziemy w stanie swobodnie manipulować takim obiektem. Pierwszym parametrem jest łańcuch znaków będący ścieżką do pliku razem z jego rozszerzeniem. Następnie po przecinku wprowadzamy drugi parametr, ale zwróćcie uwagę że występuje tutaj przypisanie do zmiennej!
format="mp3"
To ma związek z możliwością wprowadzania parametrów w dowolnej kolejności jaką jest stosowanie argumentów nazwanych. Parametr "format" również musi otrzymać łańcuch znaków, ale wpisujemy już tylko same rozszerzenie.
ODTWARZANIE DŹWIĘKU
Kolejna metoda jaką ma w sobie pakiet "pydub" to "play" jaka zdolna jest odtworzyć nasz dźwięk. Aby stała się ona dostępna, dokładacie następną linijkę importującą:
from pydub.playback import play
Po tym zabiegu, wystarczy wywołać "play" zaraz po utworzeniu obiektu dźwiękowego i wprowadzić go w miejsce parametru:
play(sound)
PRZYCINANIE DŹWIĘKU
Obiekt typu "AudioSegment" jest w rzeczywistości listą zawierającą w sobie mnóstwo pojedynczych milisekund. Czyli dla przykładu, przechowywany w zmiennej jednosekundowy dźwięk jest listą o długości 1000 elementów!
Korzystając z notacji indeksowej w Pythonie, jesteśmy zdolni do "przycięcia" dźwięku w taki sam sposób, jak się to odbywało przy łańcuchu znaków. Wprowadzając w metodę "play" taki zapis:
play(sound[:10000])
podany dźwięk będzie "działał" przez pierwsze dziesięć sekund. Natomiast to:
play(sound[-10000:])
będzie odtwarzało ostatnie dziesięć sekund dźwięku (zwróć uwagę na występujący minus!). Możemy również skorzystać z atrybutu "duration_seconds" i w ten sposób dowiedzieć się ile sekund dokładnie zajmuje gotowy do odtworzenia dźwięk. Wykonując mnożenie przez 1000 milisekund oraz odpowiednie odejmowanie od tego wyrażenia, uzyskujemy identyczny efekt, czyli zostawienie "końcówki":
ms = 10000
play(sound[sound.duration_seconds*1000 - ms:])
Uwaga na dwukropek po zmiennej "ms"! To jest nadal notacja indeksowa! Jeżeli macie problemy ze zrozumieniem, to tutaj chodzi o następującą równość:
lista[-elementy:] = lista[długość - elementy:]
Nie bijcie się po głowie, jeśli nie zrozumiecie tego automatycznie. Ja też musiałem sobie zrobić przy tym przystanek.
ODTWARZANIE PRZY ZMIENIONEJ PRĘDKOŚCI
Pakiet "pydub" pozwala także na zmodyfikowanie prędkości odtwarzania naszego dźwięku. Wymagany kolejny import w następującej postaci:
from pydub.effects import speedup
a potem wywołujemy metodę "speedup" przypisując wynik do tej samego obiektu dźwiękowego, bo zwraca wartość! Dwa parametry to nasz obiekt dźwiękowy oraz podając bezbłędnie nazwę jednego z wbudowanych parametrów stosując argument nazwany, "playback_speed", nadajemy nową prędkość odtwarzania. Tu dla przykładu podnosimy sobie szybkość o 150% (można dać liczbę zmiennoprzecinkową):
sound = speedup(sound, playback_speed = 2.5)
To wszystko! Niczego nie zmieniamy przy metodzie "play".
GENEROWANIE TONU
Pragniecie sobie wygenerować jakiś ton? Nie ma problemu! Potrzebna jest kolejna instrukcja importu:
from pydub.generators import Sine
Zastosujemy generowanie ton sinusoidalnych. Pisząc po ludzku, będzie utworzone takie "buczenie". Do nowej zmiennej przypisujemy zwrot wartości metody o nazwie "to_audio_segment" razem z nazwanym argumentem "duration" mówiącym o tym, ile milisekund ma trwać ten dźwięk, z tym że od konstruktora klasy podając też parametr w postaci herców:
sound = Sine(500).to_audio_segment(duration = 500)
Tak może wyglądać przykładowe wywołanie. Niestety nie mam jak zademonstrować efektu, więc pozostaje Wam to sobie wypróbować samemu. Możecie skorzystać z innego rodzaju dźwięku i na ten przykład zastosować tzw. "biały szum". Dla "zobrazowania", przypomnę Wam o charakterystycznym dźwięku ze starszych telewizorów gdy pokazywały się szare pasy czy "skaczące" kropki z powodu braku sygnału. Pamiętacie to charakterystyczne "syczenie" w nieskończoność :D? To jest właśnie biały szum!
Konieczna jest poniższa linijka importu:
from pydub.generators import WhiteNoise
A tak wygląda przykładowe użycie, tym razem bez żadnych parametrów w pierwszej parze nawiasów okrągłych:
sound = WhiteNoise().to_audio_segment(duration = 500)
Metoda "play" z podaniem wyżej utworzonego dźwięku i wszystko gra (i to dosłownie ;)!). Jest wiele innych rodzajów, które możecie zobaczyć pod adresem człowieka odpowiedzialnego za rozwój omawianego pakietu. Pakiet "pydub" umieszczony jest na GitHubie jako repozytorium.
EKSPORT DŹWIĘKÓW
Ostatnim punktem tego rozbudowanego artykułu jest możliwość wyeksportowania naszego dźwięku do pliku zewnętrznego. Wyjątkowo metoda "export" nie jest zależna od żadnego importu, bo wywołujemy ją od instancji klasy "AudioSegment", czyli krótko pisząc od obiektu dźwięku:
[zmienna dźwięku].export("plik.wav", format="wav")
Zapis jest TAKI SAM jak w metodzie "play". Jedyną różnicą jest wywoływanie jej z poziomu obiektu, a nie z importu określonego modułu.
Podobało się Wam :)? Pakiet "pydub" potrafi wzbudzić ciekawość, aczkolwiek irytuje mnie jego robienie problemów. Nie tylko przy pakiecie "simpleaudio", ale również przy próbie odtworzenia innego formatu niż "mp3". Nie był w stanie mi ich odtworzyć. Nie mam bladego pojęcia dlaczego.