Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

프로그래밍

오디오 파일 읽어서 SoundCloud Waveform처럼 만들기 관련 자료

Eli♪ 2022. 2. 21. 06:22

https://soundcloud.com/tecchii/apart 를 youtube-dl로 받은 후 NAudio.WaveFormRenderer에 넣고 돌린 것

얼마 전 비전공자 입장에서 TTS 제작하는 SCE-TTS라는 곳에서 Mimic Recording studio 사용하는 것을 봤는데 무슨 도커깔고 서버열고 하는거보고 이건 아니다 싶었고, 녹음하는 부분이 개선될 여지가 있을까 해서 잠깐 이것저것 찾아봄. 당연히 기본 녹음의 경우 Audacity를 이용하면 쉽게 할 수 있으나, 좀 더 아름답게 waveform 그리는 것 관련해서 이전 글에서도 잠깐 흥미가 생겨서 검색해봤던 점도 있고 해서 audio visualization 관련으로 약간 더 찾아봄. 그 결과 유용한 자료들 몇 가지를 찾은 것 같아서 간단하게 기록으로 남겨 본다.

 

NAudio.WaveFormRenderer

맨 위의 그림처럼 대략적인 프리셋이 이미 갖춰진 example을 포함한다.

https://github.com/naudio/NAudio.WaveFormRenderer

 

GitHub - naudio/NAudio.WaveFormRenderer: Simple utility to render waveforms of audio files in various styles using System.Drawin

Simple utility to render waveforms of audio files in various styles using System.Drawing - GitHub - naudio/NAudio.WaveFormRenderer: Simple utility to render waveforms of audio files in various styl...

github.com

개발 언어: C#

사용 라이브러리: Windows Forms(built-in), NAudio(3rd party) 등등

지원 포맷: Wav (PCM방식), mp3

사용 방법: 코드를 zip으로 받아서 VS에서 sln 파일 연 후 Nuget package에서 NAudio와 NAuido.WaveFormRenderer를 솔루션에 추가한다. 그리고 .Net core 3.0 runtime(x64) 을 MS 관련 다운로드 페이지에서 다운받고 빌드.

 

NAudio Waveform 그리기 극 기초 강좌

NAudio WaveViewer component를 WinForm 창에 추가한 후 간단하게 WaveStream에 넣어주면 자기가 알아서 그린다. 다만 가로 길이 rescaling은 안된다. Audacity에 있는 것과 비슷한 기능으로 동작하는 것으로 추정해본다.

유튜브 링크: https://youtu.be/ZnFoVuOVrUQ

 

개발 언어: C#

사용 라이브러리: Windows Forms(built-in), NAudio(3rd party)

지원 포맷: Wav

사용 방법: VS에서 새로만들기 WinForm application 만들고 Nuget에서 NAudio추가 후 Form1.cs[디자인] 창에서 왼쪽의 도구상자 열고 menustrip 하나 추가하고 NAudio.WinForms라고 도구상자에 추가된거에서 WaveViewer 하나 추가한 다음 아래의 최소코드를 Form1.cs에 작성. 직접 작성시 함수 이름 mismatch 때문에 에러날 수도 있는데 알아서 handling.

 

관련 최소 코드:

// Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AudioVis
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void wav파일열기ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Wave File (*.wav)|*.wav;";
            if (open.ShowDialog() != DialogResult.OK) return;

            
            waveViewer1.WaveStream = new NAudio.Wave.WaveFileReader(open.FileName);
        }
    }
}

 

Pydub 및 PIL을 이용한 오디오 파형 생성 및 png로 저장

그림 출처: https://nachwon.github.io/faster-waveform/

약 100줄도 안되는 코드로 대략 위와 같은 그림을 생성할 수 있다. 다만 바 하나하나를 직접 계산해서 하기 때문에 가로길이 맞추는 것이 쉽진 않았다. soundcloud처럼 만드려면 추가 프로세싱이 더 들어가야 할 것으로 생각한다. python 3.10 환경에서 라이브러리 깔고 시도해봤는데 문제없이 잘 되는 것을 확인했다.

https://nachwon.github.io/faster-waveform/

 

[SoundHub] Python으로 오디오 파형 이미지 그리기

Javascript 라이브러리를 사용하지 않고 Python을 이용하여 파형을 그려주어 페이지 로딩 속도를 개선해보았다.

nachwon.github.io

개발 언어: python

사용 라이브러리: pydub, PIL

pydub의 경우 conda-forge에 없어서 pip로 설치해야 했고 PIL의 경우 conda install pillow로 설치 가능하다. (10년 전 플밍수업에서 PIL 쓰던때랑 완전 달라진듯)

지원 포맷: Wav

사용 방법: 위 링크 참조

 

Google Colab에서 librosa와 torchaudio를 써서 오디오 프로세싱

google colab 환경에서 오디오 처리를 하는 방법에 대해 다룬다. 나의 경우 아직 colab은 익숙치가 않아서 안쓰긴 하는데 요즘 colab에서 재밌어보이는걸 만드는 사람이 많은 것 같다. 하여간 fft 및 mel-frequency cepstral coeff 등등 다양한 범위를 다룬다. 영상에서 zero base에서부터 출발해서 프로세싱 하는 과정을 전부 보여주기 때문에 페이스에 맞춰 따라가면서 syntax를 어떻게 써야하는지나 수학적으로 어떤 원리인지 생각해 볼 수 있는 좋은 자료인 것 같다.

 

개발 언어: Python

사용 라이브러리: librosa, pytorch, pyaudio, matplotlib 등등

지원 포맷: Wav

사용 방법: 아래 코드 링크 참조

 

Colabs 코드 링크: https://colab.research.google.com/drive/1N4TV3hCobwGLTMngp1vkOgKK3r3l0ZMJ?usp=sharing 

 

_오디오 처리.ipynb

Colaboratory notebook

colab.research.google.com

강좌 영상(유튜브): https://youtu.be/oltGIc4uo5c

 

Realtime Audio Visualization (FFT 기반)

링크: https://github.com/aiXander/Realtime_PyAudio_FFT

 

GitHub - aiXander/Realtime_PyAudio_FFT: Realtime audio analysis in Python, using PyAudio and Numpy to extract and visualize FFT

Realtime audio analysis in Python, using PyAudio and Numpy to extract and visualize FFT features from streaming audio. - GitHub - aiXander/Realtime_PyAudio_FFT: Realtime audio analysis in Python, u...

github.com

 

개발 언어: Python

사용 라이브러리: pyaudio, scipy, pygame, numpy, matplotlib

지원 포맷: Wav

사용 방법: 위 github 링크 참조

 

pygame+openGL 기반의 audio spectrum visualizer이다. 오래된 라이브러리들을 쓰고 있어서 그런지 정확한 이유는 모르겠지만 3D로 해보니 위와 같이 잔상이 남는다. 설치하란대로 pip requirements를 하니 자꾸 에러가 나서 그냥 직접 requirements.txt안에 있는걸 conda virtualenv에 설치했더니 라이브러리 설치문제는 없었다. 그리고 실행해보니 float 관련 에러가 자꾸 나서 visualizer.py의 에러난 210~213 line을 그냥 주석처리 해버렸더니 위와 같이 나왔다. 좋았던 점은 일반적인 signal processing하는 FFT 그래프들이 오른쪽 끝까지 표시하느라 monstercat같은 느낌을 내지 못하는데 이건 약 1.2kHz에서 끊어서 파형이 좀 더 사용자 친화적으로 잘 보인다. 다만 여러모로 쓸데없는 기능이 많이 들어가서 나같은 minimalist에게는 과한 느낌. pygame을 쓰다보니 fps도 40근처밖에 안나오고 퍼포먼스 이슈도 있을 것 같다. 아무래도 native C#에 비해서는 느릴 수밖에 없는 python의 GUI...

 

아예 VST로 개발(?)

audacity가 크로스플랫폼도 되고 VST도 지원하기 때문에 만약 개발한 기능을 WinForms같이 standalone으로 만들지 않고 VST plugin으로 만들면 이곳저곳에 유용하게 쓸 수 있을 것 같아서 이쪽도 약간 찾아봤다. (간만 봤다)

http://teragonaudio.com/article/How-to-make-VST-plugins-in-Visual-Studio.html

 

How to make VST plugins in Visual Studio

How to make VST plugins in Visual Studio Introduction Microsoft announced that it would offer Visual Studio Express free of charge forever. Though the Express version of Visual C++ (hereafter referred to as VC++) has some limitations, it’s still a great

teragonaudio.com

대충 Steinberg VST SDK + C++로 개발하는 것 같다. 

 

MacOS인 경우 Juce라는 IDE를 쓰는 것으로 확인했다.

https://integraudio.com/best-tools-to-develop-vst-plugins/

 

What Are The Best Tools To Develop VST Plugins & How Are They Made?

Understanding how VSTs are made will provide you with insights on how you can make your own VST plugins...

integraudio.com

 

실시간 Visualizer에 관한 간단생각

내가 생각하는 실시간 audio vis는 주로 EDM에서 많이들 쓰는 방식인데, 예시로 Virtual Riot - Simulation 영상의 오른쪽 아래 파형같은게 있다. 물론 보기만 할 경우 rainmeter용으로 이런저런 플러그인들이 나와있긴 한데 이건 그 프로그램 전용이라 다른데서 써먹기가 힘들다. 핵심은 고역대를 다 짜르고 베이스쪽 위주로 보여주면 된다(거의 500Hz미만정도로 많이 짤라야 EDM에 적합). 그리고 refresh rate가 너무 높아도 마치 24프레임 영화를 60프레임으로 보는 느낌이 나서 너무 높지 않은 적당한 FTT period를 주고, 떨어질 때도 바로 0이 되는게 아니라 적당한 transient를 줘야 맛이 산다.

 

결론

이것저것 다 봤지만 잘 되어있는 라이브러리들은 dependency가 꽤 많고, 그렇지 않은 경우 너무 초보적인 것들만 자료들이 돌아다닌다. 다 적고 대충 드는 생각은 이미 있는 파일을 읽어서 그릴 땐 NAudio가 꽤 좋은 라이브러리라는 것이었다. 퍼포먼스는 당연히 C++이나 C#이 가장 좋고, python은 느린게 체감이 되고, js의 경우 도입부에 적어둔 SCE-TTS에서도 녹음 5번하면 뻑난다고 언급할 정도로 좋지 않다. 역시 wav같이 bitrate가 높은 것은 빠른 언어로 처리하는게 맞는 것 같다. 지금은 자료만 간단하게 기록해 두고 나중에 제대로 정리되는 경우 다시 글을 쓰든지 해야할 것 같다.