Konwersja plików audio na potrzeby przetworników cyfrowo-analogowych

Odtwarzanie danych audio na mikrokontrolerze z pominięciem obsługi systemu plików i formatów plików audio powoduje iż musimy dane odpowiednio przygotować. Za pomocą narzędzi konsolowych i Pythona można skonwertować klip audio do numerycznego formatu gotowego do użycia.

Celem takiej reprezentacji danych audio jest chęć pominięcia obsługi systemu plików i kart SD w projekcie (który zjada trochę zasobów i nie zawsze jest pożądany). Nie są potrzebne też biblioteki obsługujące konwersje plików wave na sygnał wysyłany do przetwornika.

Konwersja do 8 bitowego klipu Wave

Mając do dyspozycji 8 bitowy DAC dane muszą być skonwertowane do 8 bitowego formatu. Mając 16-bitowy DAC można spróbować zastosować również 16-bitowe dane. Do konwersji można użyć FFmpeg:

ffmpeg -i input.file -ar 16000 -ac 1 -acodec pcm_u8 output.wav

Jako plik wejściowy można użyć różnych formatów - obsługiwanych przez ffmpeg. Wyjściowy 8-bitowy plik wave będzie miał niższą jakość od oryginału. W zależności od poziomu głośności szumy mogą być bardzo wyraźne. Żeby je zredukować, czy nawet usunąć można podbić poziom głośności:

ffmpeg -i input.file -ar 16000 -ac 1 -af "volume=20dB" -acodec pcm_u8 output.wav

Gdzie 20dB można dopasować wedle potrzeb. Wynikowy plik nie powinien mieć żadnych stałych i wyraźnych szumów. Ludzka mowa konwertuje się zazwyczaj dobrze, natomiast muzyka może mieć z tym problemy. Przykład poniżej.

Wyciąganie danych numerycznych

Mając 8-bitowy plik audio można wyciągnąć jego dane jako listę 8-bitowych liczb, które bezpośrednio można wysyłać na DACa. Można to zrobić w Pythonie za pomocą biblioteki scipy:

import scipy.io.wavfile

framerate, data = scipy.io.wavfile.read('output2.wav')
print(list(data))

Otrzymają listę można wrzucić np. na ESP32 (przykład). Warto listę złamać na wiele linii, gdyż jedna bardzo długa linia sprawi ogromne problemy większości edytorom kodu.

Płytki ESP32 mają spory flash (4-16MB) więc dość duże tablice powinny bez problemu się zmieścić. Jeżeli danych jest za dużo, lub jeżeli chcemy system z obsługą zapisu w czasie działania mikrokontrolera - potrzeby będzie dodatkowych chip flash na dane audio.

Powiązane artykuły

RkBlog

Elektronika i Python, 28 July 2017

Comment article
Comment article RkBlog main page Search RSS Contact