【Audio 입문】소리를 발생한다♬

지금까지 어쩐지 당연하다고 생각했지만, 우선 올바른 소리를 정확하게 출력하는 곳에서 하려고 한다.
기술적으로는, 지금까지도 몇번인가 쓰고 있으므로, 갑자기 코드를 내고 조금 설명하고 싶다.

코드 해설


import wave
import numpy as np
from matplotlib import pylab as plt
import struct
import pyaudio
import matplotlib

이하에 발생하는 소리의 속성을 나타낸다.
a = 1     #振幅
fs = 44100 #サンプリング周波数
f0 = 400  #基準周波数
f1 = f0+10 #重畳する音の周波数
sec = 5   #秒;発生時間
CHUNK=1024 #一度にサンプリングするframe数
p=pyaudio.PyAudio()

stream=p.open(  format = pyaudio.paInt16,
        channels = 1,
        rate = fs,
        frames_per_buffer = CHUNK,
        input = True,
        output = True) # inputとoutputを同時にTrueにする

이하, 실제로 출력하는 사인파를 생성한다.
※이번에는 두 개의 물결을 중첩한다
swav=[]
for n in np.arange(fs * sec):
    #サイン波を生成
    s = (a * np.sin(2.0 * np.pi * f0 * n / fs)+ a * np.sin(2.0 * np.pi * f1 * n / fs))/2
    swav.append(s)

생성되는 사인파를 그립니다.
0-0.1초까지와 하울링을 보기 위해 전체 0-5초의 그림을 그리지만,
어젯밤 플롯의 배치 방법을 배웠기 때문에 그것을 응용하고 있다.
※ 배치하는 그림의 데이터는 동일하고 범위 지정 등 바꾸어 그릴 수 있습니다
#サイン波を表示
matplotlib.rcParams.update({'font.size': 18, 'font.family': 'sans', 'text.usetex': False}) 
fig = plt.figure(figsize=(8,6))  #(width,height)
x_offset=np.round(0.05*4,decimals=2)
y_offset=np.round(0.05*10,decimals=2)
width=0.3
height=0.3
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # main axes
axes2 = fig.add_axes([x_offset, y_offset, width, height]) # insert axes

x = np.linspace(0, sec, int(fs*sec)) #sec;サンプリング時間、fs*sec;サンプリング数
axes1.set_ylim(-1.2,1.2)
axes1.set_xlim(0,0.1) #0-0.1 sec
axes1.plot(x,swav)

axes2.set_ylim(-1.2,1.2)
axes2.set_xlim(0,5) #0-5 sec
axes2.plot(x,swav)
plt.pause(1)
plt.savefig('./fft/sound_'+str(f0)+'_'+str(f1)+'.jpg')

swav에 저장된 사운드 데이터는 다음과 같이 wav 파일로 저장됩니다.
#サイン波を-32768から32767の整数値に変換(signed 16bit pcmへ)
swav = [int(x * 32767.0) for x in swav]
#バイナリ化
binwave = struct.pack("h" * len(swav), *swav)
#サイン波をwavファイルとして書き出し
w = wave.Wave_write("./fft/output"+str(f0)+"_"+str(f1)+".wav")
params = (1, 2, fs, len(binwave), 'NONE', 'not compressed')
w.setparams(params)
w.writeframes(binwave)
w.close()

마지막으로 생성 된 사운드를 스피커에서 출력합니다.
※input로 치환할 필요는 없지만, 일단 착각 방지를 위해서 한 번 input에 대입하고 나서 출력하고 있다
input = binwave
output = stream.write(input)

다양한 소리를 만들어 듣고 비교



이번에는, 기준 진동을 400Hz로 하고, 이하의 소리를 중첩해 작성해 놀아 보았다
f_list=[0.01,0.1,0.5,1,2,5,10,50,100,200,300,350,400.1,400.2,400.5,401,402,405,410,420,450,500,600,800,1000,1200,1400,1600]

결과는 다음과 같은 이미지를 얻습니다.

상기의 파라미터로 Gif 애니메이션으로 한다.

대응하는 소리는 아래에 놓았다.
AudioAutoencoder/sound_generation/melody.wav

소리의 이상한



만든 소리를 들어 보면,
1.400-402의 중첩은 이른바 하울링처럼 우와~우와~쿤이라고 들립니다
2. 고주파 예를 들면 400-1000의 중첩이라면, 이 고조파측이 주파수가 높아짐에 따라, 큰 소리로 들립니다
3. 저주파의 소리와의 중첩 400-1등에서는, 1Hz는 가청음이 아니기 때문에 관계하지 않는 것 같습니다. 그러나 소리가 커지거나 작아지거나 하울링처럼 들릴 수도 있습니다.
4. 가장 어쩌면 음성과 관련된 것은 그들 사이의 주파수, 예를 들어 400-600과 같은 경우입니다. 이것은, 아직입니다만 음성의 ‘우’와 같은 소리가 나옵니다. 이것은 얼마 전 포먼트 합성의 이야기와 비슷한 현상입니다.

코드는 아래에 넣었습니다.



· AudioAutoencoder/sin_sound.py

요약



· 다양한 소리를 사인파로 만들고 놀았습니다.
・발생한 소리는 고도 2음이지만, 「소리의 이상」에 기재한 바와 같이 다채로운 소리를 발생한다

· 이들을 FFT~STFT, 그리고 wavelet 변환해 분석한다
· 남성 음성, 여성 음성 분석 및 음성 합성을 실시한다.

좋은 웹페이지 즐겨찾기