import matplotlib . pyplot as plt import librosa import numpy as np from scipy . io import wavfile from collections import Counter def tian_chong ( j , a , b , f ): # x = 0.9 * np.sin(np.linspace(a, b, j)) + 0.1 * np.sin(np.linspace(np.pi,
import librosa
import numpy as np
from scipy.io import wavfile
from collections import Counter
def tian_chong(j,a,b,f):
# x = 0.9 * np.sin(np.linspace(a, b, j)) + 0.1 * np.sin(np.linspace(np.pi, f * np.pi,j))
x = 0.9 *np.sin(np.linspace(a, b, j))
return x
def fen_jie(radio):
x_index = np.where((radio[1:] / (radio[:-1] + 0.0000001)) < 0)
# 相邻穿过0点位置的间隔
x_index_list = np.array([j - i for i, j in zip([0] + x_index[0].tolist(), x_index[0].tolist() + [radio.size])])
# 翻倍
# x_index_list*=5
x_index_list_h = [max(np.abs(radio[i:j])) if radio[i:j].size!=0 else 0 for i, j in
zip([0] + x_index[0].tolist(), x_index[0].tolist() + [radio.size])]
return x_index_list,x_index_list_h
def huan_yuan(x_index_list,x_index_list_h):
res = np.hstack([x_index_list_h[i] * tian_chong(j,0, np.pi ,22) if i % 2 == 0 else
x_index_list_h[i] * tian_chong(j,np.pi,2 *np.pi, 22) for i, j in
enumerate(x_index_list)])
return res
import os
# filename_list=os.listdir("2500中文常用字发音")
radio,sample=librosa.load("2500中文常用字发音/美1627285208.wav",16000)
# radio1,sample1=librosa.load("160_1_recorded2_041_fast.wav",16000)
# radio=radio[500:3000]
x,h=fen_jie(radio)
# x=x**2 事实证明 间隔之间的比值 决定了内容
# x1,h1=fen_jie(radio1)
# 连续间距变化小于3的 np.abs(x[1:]-x[:-1])<3
# reset +=x.tolist()
# res=huan_yuan(x,h)
# 将值压缩到21-108 之间
# 去极值
x[x>3*np.mean(x)]=np.mean(x)
h=np.array(h)
h[h>3*np.mean(h)]=np.mean(h)
z=x*h*((90-30)/(max(x*h)-min(x*h)))+30
# 将值压缩到0.25-4之间
z_d=x*((2-0.25)/(max(x)-min(x)))+0.25
z_index=((z[1:]-z[:-1])/z[1:])>0.3
z=z[1:][z_index]
z_d=z_d[1:][z_index]
z_d=np.floor(z_d/0.25)*0.25
# 求几品
import music21 as ms21
s=ms21.stream.Stream()
for n,d in zip(z,z_d):
one_n=ms21.note.Note(int(n),duration=ms21.duration.Duration(d))
s.append(one_n)
s.write("midi","s.mid")
if __name__ == '__main__':
pass