
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))
return x
def fen_jie(radio):
x_index = np.where((radio[1:] / (radio[:-1] + 0.0000001)) < 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_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
radio,sample=librosa.load("2500中文常用字发音/美1627285208.wav",16000)
x,h=fen_jie(radio)
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
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