Saya menggunakan specgram()
fungsi dalam matplotlib
untuk menghasilkan spektogram file gelombang suara dalam Python, tetapi hasilnya selalu dengan kualitas yang jauh lebih rendah daripada yang dapat dihasilkan oleh perangkat lunak transkripsi normal saya, Praat. Misalnya, panggilan berikut:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Buat ini:
Saat Praat, mengerjakan sampel audio yang sama dengan pengaturan berikut:
- Rentang tampilan: 0-8000Hz
- Panjang jendela: 0,005s
- Rentang dinamis: 70dB
- Langkah waktu: 1000
- Langkah frekuensi: 250
- Bentuk jendela: Gaussian
Buat ini:
Apa yang saya lakukan salah? Saya sudah mencoba mengutak-atik semua specgram()
parameter, tetapi sepertinya tidak ada yang memperbaiki resolusi. Saya hampir tidak memiliki pengalaman dengan FFT.
fft
spectrogram
python
Badai Alek
sumber
sumber
Jawaban:
Berikut adalah parameter matplotlib.specgram
Parameter yang disediakan dalam deskripsi pertanyaan perlu dikonversi ke parameter mpl.specgram yang sebanding. Berikut ini adalah contoh pemetaan:
Jika Anda menggunakan 8ms Anda akan mendapatkan kekuatan 2 FFT (128). Berikut ini adalah deskripsi pengaturan Praat dari situs web mereka
Tautan ke pengaturan Praat
Pertanyaan OP mungkin mengenai perbedaan kontras antara specgram Praat dan mpl (matplotlib). Praat memiliki pengaturan Rentang Dinamis yang memengaruhi kontras. Fungsi mpl tidak memiliki pengaturan / parameter yang serupa. Mpl.specgram mengembalikan array tingkat daya 2D (spektrogram) yang rentang dinamis dapat diterapkan ke array kembali dan diplot ulang.
Berikut ini adalah cuplikan kode untuk membuat plot di bawah ini. Contohnya adalah ~ 1m15s pidato dengan kicauan dari 20Hz-8000Hz.
sumber
Tampaknya menjadi masalah resolusi waktu / frekuensi. Plot Praat Anda memiliki resolusi frekuensi yang lebih buruk (Anda bahkan tidak dapat melihat dengan jelas harmonik) dan resolusi waktu yang lebih baik. Coba kurangi ukuran jendela (NFFT) menjadi 16000 x 0,05 = 80 sampel. Saya sarankan menggunakan kekuatan 2 yang lebih besar di pad_to (128 atau 256).
sumber