2016-12-05 4 views
0

그래서 현재 속도를 높이 지 않고 wav 파일을 투구하려고합니다. Scipy와 Numpy를 사용하여 Wave 파일의 원본 데이터를 가져오고 새 파일을 만든 후 원래 파일에 +2 정도를 추가하면 파일을 완전히 엉망진창으로 만들었습니다. 여기 어떻게하면 파이썬을 사용하여 wav 파일을 던질 수 있습니까?

내가 지금 가지고 무엇 : 내 목표를 달성하기 위해 무엇을해야하므로 너희들이 말해 줄 수 있다면

from scipy.io.wavfile import read as wavr 
from scipy.io.wavfile import write as wavw 
import numpy as np 




rate, data = wavr('hit.wav')  

idk = data[:] 

R = [] 
L = [] 

for thing in idk: 
    old1 = thing[0] + 2.0 
    old2 = thing[1] + 2.0 
    R.append(old1) 
    L.append(old2) 
    print(len(L)) 
    print(len(R)) 

Right= np.array(R) 
Left= np.array(L) 
help = np.column_stack((Right,Left))  

print(rate) 


wavw("copied.wav",44100,help) 

어쩌면 나의 현재의 시도가 어떤 경우에 거짓

+0

"wav 파일을 피치"한다는 것은 무엇을 의미합니까? –

+0

@WarrenWeckesser, OP 아마도 "wav 파일의 피치 변경"을 의미합니다 http://stackoverflow.com/questions/6326822/python-audio-frame-pitch-change – davedwards

+0

@downshift 그건 내 추측이지만 이것은 처음으로 [피치] (https://en.wikipedia.org/wiki/Pitch_ (음악))를 보았을 때 [verbed] (https://en.wikipedia.org/wiki/Conversion_(word_formation) # 확인). –

답변

3

나의 친애하는 당신은 큰 문제 (나는 거기에 있었다)에있다.

우선, 모든 wav 파일은 특정 임계 값을 초과하지 않는 float를 사용한다고 생각합니다. 값이 -1에서 1 사이라고 가정합니다. 따라서 "just +2"를 파일에 추가하면 사실 모든 것을 포화 상태에 빠뜨립니다.

그러면 음악 이론에 대해 잘못된 점이 있습니다. 소리가 파도인지 알 수 있습니다. 좀 더 정확히 말하자면 440Hz 음표 (음악가가 악기를 튜닝하는 데 사용하는 A4 음)를 녹음 할 때 초당 440 회 진동하는 사인파 (like this one)가 있습니다. 게다가 0을 중심으로 할 수도 있고 그렇지 않을 수도 있지만 사운드는 전혀 다릅니다 (웨이브에 상수를 추가하거나 제거하는 것은 의미가 없으며 신호를 포화시키는 것만 가능함).

소리의 음높이를 변경하려면 주파수 인 (초당 진동 횟수)을 수정해야합니다. 음악에서는이를 vocoder이라고합니다. 그것의 뒤에 이론은 이미 아주 하드 코어이다; 그것은 이라는 과학 분야에서 신호 처리입니다. (this tutorial 꽤 멋진 것, 그렇지 않으면 Wikipedia을하지만, 수학 중심의)

  • 푸리에 변환을 : 더 정확하게, A (상) 보코더를 사용합니다. 사운드의 샘플이 주어지면 푸리에 변환은 포함 된 주파수를 제공합니다 (약간의 A4, 많은 C3 등). (더 정확하게는이 특정 문제에 대해 짧은 시간 푸리에 변환이 필요합니다.);
  • 파일 청크에서 푸리에 변환을 수행하고 각 청크의 피치를 수정하고 모든 청크를 다시 붙여 넣는 데 사용되는 overlap-add algorithm. 이것은 내가 완전히 실패한 곳입니다. 그리고 나는 보코더를 코딩하려고했습니다. 두번입니다.

필자는 더 많은 시간을 할애 할 수는 있지만, 피치와 같이 소리가 나는 주파수에 닿는 부분은 무거운 수학으로 채워진다는 것을 알았습니다. 신호 처리는 매우 흥미로운 분야이지만 다이내믹하게 다루기는 어렵습니다. 수학 능력이 충분하다면, 온라인으로 몇 과목을 볼 수 있습니다, 여기 Stanford's. 음악 및 코드로 놀고 싶다면 원시 데이터가 아닌 기존 도구를 사용하십시오 (Processing, 또는 existing python libraries).

wav 파일을 사용하여 더 쉽게 연습하려는 경우 음량이나 속도를 수정 해보십시오 (피치가 변하는 것을 알고 있어야 함). 볼륨의 경우 에 파일의 모든 샘플에 (덧셈 제외) 상수를 곱해야합니다. 속도면에서 두 샘플 중 한 샘플을 제거하여 오디오를 두 배 빠르게 만들거나 웨이브 배열의 크기를 늘리고 기존 샘플간에 관련 샘플을 넣는 좋은 해결책을 찾을 수 있습니다 (이전 샘플은? 밖으로 재료!).

행운을 빈다.

+1

* "모든 wav 파일은 수레를 사용합니다 ..."* WAV는 여러 정수 데이터 유형을 지원합니다. –

+0

위대한 답변 주셔서 감사합니다. 내가 C, C++ 같은 다른 프로그래밍 언어에서 필요한 것을 할 수있는 더 좋은 방법이 있다고 생각하십니까? 기본적으로 파일이 재생되는 초 동안 피치가 약간 올라갈 수 있습니다. – Ruffi

+1

소리를 수정하려면 [Audacity] (http://www.audacityteam.org/download/)와 같은 오디오 처리 도구를 사용해야합니다. 그들은 수학을 돌 보았습니다. 꽤 부드럽고 오픈 소스였습니다! 그것에 대한 좋은 자습서를 찾을 수 있습니다. 보코더와 같은 높은 수준의 기능을 가진 프로그래밍 언어를 찾지 못했습니다. Matlab 일지 모르지만 배우기가 힘든 소프트웨어입니다. –

관련 문제