├── .gitignore ├── requirements.txt ├── data ├── sample.wav ├── sample_griffinlim.png ├── sample_griffinlim_iters20.wav ├── sample_griffinlim_iters40.wav └── sample_griffinlim_iters50.wav ├── griffinlim.png ├── README.md └── GriffinLim_example.py /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | librosa 2 | scipy 3 | numpy 4 | matplotlib 5 | -------------------------------------------------------------------------------- /data/sample.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/data/sample.wav -------------------------------------------------------------------------------- /griffinlim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/griffinlim.png -------------------------------------------------------------------------------- /data/sample_griffinlim.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/data/sample_griffinlim.png -------------------------------------------------------------------------------- /data/sample_griffinlim_iters20.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/data/sample_griffinlim_iters20.wav -------------------------------------------------------------------------------- /data/sample_griffinlim_iters40.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/data/sample_griffinlim_iters40.wav -------------------------------------------------------------------------------- /data/sample_griffinlim_iters50.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lifeiteng/Rabbit/HEAD/data/sample_griffinlim_iters50.wav -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rabbit 2 | Explore Vocoders 3 | 4 | 5 | - [x] Griffin-Lim Algorithm 6 | 7 | ### Install Deps 8 | ``` 9 | [sudo] pip install -r requirements.txt 10 | ``` 11 | ### Griffin-Lim Algorithm 12 | D. W. Griffin and J. S. Lim, "Signal estimation from modified short-time Fourier transform," IEEE Trans. ASSP, vol.32, no.2, pp.236–243, Apr. 1984. 13 | 14 | ``` 15 | GriffinLim_example.py data/sample.wav 16 | ``` 17 | 18 | ![GriffinLim](griffinlim.png) 19 | 20 | ### 21 | 22 | 23 | -------------------------------------------------------------------------------- /GriffinLim_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- encoding: utf-8 -*- 3 | __author__ = 'Feiteng' 4 | import scipy 5 | import shutil 6 | 7 | import numpy as np 8 | import librosa 9 | from librosa import display 10 | from optparse import OptionParser 11 | from matplotlib import pyplot as plt 12 | 13 | 14 | def griffin_lim(stftm_matrix, shape, min_iter=20, max_iter=50, delta=20): 15 | y = np.random.random(shape) 16 | y_iter = [] 17 | 18 | for i in range(max_iter): 19 | if i >= min_iter and (i - min_iter) % delta == 0: 20 | y_iter.append((y, i)) 21 | stft_matrix = librosa.core.stft(y) 22 | stft_matrix = stftm_matrix * stft_matrix / np.abs(stft_matrix) 23 | y = librosa.core.istft(stft_matrix) 24 | y_iter.append((y, max_iter)) 25 | 26 | return y_iter 27 | 28 | 29 | if __name__ == '__main__': 30 | cmd_parser = OptionParser(usage="usage: %prog ") 31 | 32 | cmd_parser.parse_args() 33 | (opts, argv) = cmd_parser.parse_args() 34 | 35 | if len(argv) != 1: 36 | cmd_parser.print_help() 37 | exit(-1) 38 | 39 | np.random.seed(0) 40 | # assume 1 channel wav file 41 | sr, data = scipy.io.wavfile.read(argv[0]) 42 | 43 | stftm_matrix = np.abs(librosa.core.stft(data)) 44 | stftm_matrix_modified = stftm_matrix + np.random.random(stftm_matrix.shape) 45 | 46 | y_iters = griffin_lim(stftm_matrix_modified, data.shape) 47 | n_figure = 1 + len(y_iters) 48 | 49 | plt.figure(figsize=(8, 14)) 50 | plt.subplot(n_figure, 1, 1) 51 | display.waveplot(data, sr=sr) 52 | plt.title('origin wave') 53 | 54 | for i in range(0, len(y_iters)): 55 | y, n_iters = y_iters[i] 56 | store_file = argv[0].replace('.wav', '_griffinlim_iters{iters}.wav'.format(iters=n_iters)) 57 | print('NumIters {}, Audio: {}'.format(n_iters, store_file)) 58 | plt.subplot(n_figure, 1, i + 2) 59 | display.waveplot(y.astype(np.int16), sr=sr) 60 | plt.title('reconstructed wave from STFT-M (Iter {})'.format(n_iters)) 61 | 62 | shutil.rmtree(store_file, ignore_errors=True) 63 | scipy.io.wavfile.write(store_file, sr, y.astype(np.int16)) 64 | 65 | store_file = argv[0].replace('.wav', '_griffinlim.png') 66 | print("Waveform image: {}".format(store_file)) 67 | plt.savefig(store_file, dpi=100) 68 | 69 | print('DONE') 70 | --------------------------------------------------------------------------------