기계 학습으로 V 노래 배달에서 노래 만 자릅니다.

7237 단어 Python3CNN
안녕하세요, 괴짜입니다.

v 노래 배달은 좋다 ......



(이것은 아프다)

이번에는 노래 전달에서 자동으로 노래 부분만 추출하는 녀석을 만들었습니다.

이것을 사용하여 뭔가하고 싶지만 대부분 저작권에 걸릴 것 같아서 회개하고 있습니다.

개요


  • 배달을 10 초 안에 잘라서 멜 주파수 스펙트로 그램을 계산하고
  • 노래와 그 밖에 나누어 CNN에 넣어
  • 싫어

  • 준비



    기계 학습의 지견은 전혀 없기 때문에 검색합니다.



    특히 여기을 참고로 (제설) 모델을 빌렸습니다. 대단히 감사합니다.

    전처리



    멜 주파수 스펙트로그램이 좋을 것 같으므로, 전달을 10초로 끊어 구합니다.
    # メル周波数スペクトラムを返す
    def calculate_melsp(x, n_fft=1024, hop_length=128):
        stft = np.abs(librosa.stft(x, n_fft=n_fft, hop_length=hop_length))**2
        log_stft = librosa.power_to_db(stft)
        melsp = librosa.feature.melspectrogram(S=log_stft,n_mels=128)
        return melsp
    
    _x, fs = librosa.load("wavファイル", sr=48000, duration=9.9)
    _x = calculate_melsp(_x)
    librosa.display.specshow(_x, sr=48000)
    plt.colorbar()
    plt.show()
    

    이런 느낌의 이미지가 나옵니다. (이것은 와라베다의 6조년의 녹입니다)



    잘 모르겠네요. 이것을 CNN에서 학습시킵니다.

    CNN에서 학습



    테스트 데이터는 네 가지 배포에서 생성되었습니다. 노래·그 이외 맞추어 1200 데이터입니다.
  • 흰색 위 후부키 [아사카 테두리]
  • 戊亥とこ [스낵 戊亥]
  • 兎田ペコラ [라이브 직전]
  • 카구라 메아 [아카이브 삭제 얼룩]

  • 여기 망마 사용했습니다. 데이터 세트를 제공하는 방법은 다음과 같습니다.

    x_train ... 데이터 수 * 128 * 3713 * 1

    y_train ... 데이터 수 * (1 or 0) ← 노래인가 아니면
    model.fit(x_train, y_train, epochs=20, verbose=1, validation_split=0.1, batch_size=5)
    model.save("model.h5")
    

    일괄 처리 크기는 기본값 (25)이므로 메모리가 죽었으므로 5로 설정했습니다.

    결과는 이런 느낌입니다.



    Accuracy 0.9333 val_accuracy 0.9750은 꽤 좋지 않을까요 (전혀 모르겠지만)

    추론하고 잘라보자


    model = load_model("model.h5")
    ret = model.predict(  1*128*3713*1のデータ  )
    
    # ret[0] -> 歌 の確率
    # ret[1] -> それ以外 の確率
    

    100%가 아니기 때문에 확률을 잘 사용해 노래만 잘라낼 수 있도록 짜였습니다.
  • 노래로 판정된 구간이 3개 이상 계속되고 확률의 평균이 80%를 초과하는 경우에 노래로 판정한다
  • 1에서 결정된 노래 구간과 노래 구간 사이가 2 구간 이하이고 노래 구간을 결합했을 때 6 분을 초과하지 않는 경우 두 구간을 결합한다.
  • 2의 노래 구간의 전후 1구간을 보고, 확률이 40%를 초과하면 노래 구간에 결합한다
  • 3에서 얻은 노래 구간에서 잘라내기

  • 간단히 설명합니다.

    1로 대략적인 노래 구간을 냅니다. 에코가 붙은 잡담이나 노래처럼 판정된 잡담이 섞이지 않게, 확률의 평균으로 지워 버립니다.

    이것만으로는 발라드계 악곡이 분할되어 버리는 문제가 있으므로, 1로 남은 노래 구간의 사이가 2구간(=20초) 이하이면 결합합니다. 다만, 이 방법은 「연장으로 노래되면 2곡이 합체해 버린다」문제가 있습니다. 그래서 결합 후에 6분을 넘지 않도록 했습니다. (노래는 대개 6분 이내라고 생각하기 때문입니다)

    여기까지 대략적으로 노래를 취할 수 있습니다. 다만 인트로나 아웃로가 끊어져 버린다·딱 맞는 문제가 있기 때문에, 전후가 노래 같은(확률이 40%이상 있는) 때는 결합했습니다.

    결과



    데이터 세트에 없는, 「미나토 아쿠아」씨의 노래 프레임을 잘라 보았습니다.

    미나토 아쿠아 「【Vtuber】1일 한정! 아이돌 메이드의 전력 Live! 【노래 테두리】」



    자동으로 잘라낸 것이 여기입니다.

    아주 좋은 느낌으로 잘라낼 수있었습니다.

    다만, 곡의 뒤를 길게 잘라 버리는 일이 있기 때문에, 거기를 개선하면서 이 기술의 사용법을 검토해 가고 싶습니다.

    더 이상 정밀도 올리고 싶을 때는 어떻게 하는 것이 정답일까 ......

    좋은 웹페이지 즐겨찾기