scpark20 / audio-preprocessing-practice

오디오 전처리 작업을 위한 연습
25 stars 4 forks source link

sound / 음색 벡터화 #1

Open InspiringPeople opened 5 years ago

InspiringPeople commented 5 years ago

안녕하세요~ DLC 3기 장윤경이라고 합니다. 수업 시간에 너무 재미있게 잘 들었어요~! 이제 2번 밖에 안 남았다니, 벌써 아쉽네요 ㅎㅎ

질문 2개가 있어서 여기에 올립니다~

  1. sound를 딥러닝 모델에 넣을 때 [channels, embedding_dim]로 맵핑해서 넣었는데 sound는 이런식으로 벡터화하는게 일반적인가요? 자연어 같은 경우는 one-hot으로 그냥 벡터화하기도 하고 word2vec이나 fasttext 등 벡터화를 위해 여러가지 임베딩을 사용하는데 sound는 그렇지는 않은지 궁금합니다.

  2. 이것은 수업과는 조금 관련없을 수도 있는데.. 개인적으로 이번에 DAW를 처음 만지다보니 악기들의 음색이 너무 많아서 고르기가 어렵더라고요~ 피아노 같이 대중적인 음색은 제목을 보고도 직감적으로 알 수 있지만 잘 다뤄보지 않은 악기 종류도 많아서.. 악기 음색에 따라 vector화 시키고 t-sne로 표현하면 저같은 초보자들이 시각적으로 이해하기에 좋을 것 같다는 생각을 했습니다. 그래서 같은 음원이라도 피아노/첼로/드럼 같이 악기 음색이 바뀌는 것에 따라 수치적으로 각각 다르게 표현할 수 있는 방법이 있는지.. 아니면 그냥 이 소리 자체를 1번처럼 처리해서 벡터화 시켜야하는지 궁금합니다.

감사합니다~!^^

scpark20 commented 5 years ago
  1. one-hot 벡터화 한다음 fully connected layer나 RNN안에 있는 linear transform을 거치는 일은 제가 사용한 tf.gather를 이용해서 embedding_dim 크기의 벡터로 반환해주는 일과 정확히 같습니다.

x = tf.placeholder(dtype=tf.int32, shape=[Batch, Length])

tf.gather를 이용

embedding_table = tf.get_variable('embedding_table', [channels, embedding_dim]) x_embedded1 = tf.gather(embedding_table, x)

tf.one_hot을 이용

x_onehot = tf.one_hot(x, depth=channels) x_embedded2 = tf.layers.dense(x_onehot, embedding_dim, bias=False)

위 코드에서 dense layer의 weight가 embedding_table과 같다면 x_embedded1과 x_embedded2는 결과적으로 같은 값을 갖게 된다는걸 생각하시면 될 것 같습니다.

scpark20 commented 5 years ago

word2vec은 글자하나가 아닌 단어를 임베딩하는 일을 합니다. 여기서 사용하고 있는 임베딩은 자연어의 경우 글자하나에 해당하기에 저런 방법을 씁니다. fasttext는 제가 잘모르겠네요 ㅋㅋㅋ

scpark20 commented 5 years ago
  1. 음색을 벡터화하려는 시도는 많이 있어왔습니다. 음성 합성의 경우 GST(global style token) 등을 사용한 예가 있습니다. 그리고 악기의 경우, Nsynth 예를 들 수 있고요. 그런데 이런 방법들은 실습에서 예로 든 임베딩과는 좀 다른 auto-encoder를 이용하여 z-space에 데이터를 임베딩 시키는 방법입니다.

GST관련해서는 다음 블로그를 보시면 되고 https://ai.googleblog.com/2018/03/expressive-speech-synthesis-with.html NSynth 관련해서는 다음 블로그를 보시면 됩니다. https://magenta.tensorflow.org/nsynth

감사합니다.