Praat-compatible acoustic analysis in Python (Rust implementation)
Project description
praatfan-gpl
Praat-compatible acoustic analysis in Python, powered by Rust.
This package provides exact reimplementations of Praat's acoustic analysis algorithms, designed to produce bit-accurate output matching Praat/parselmouth.
Installation
pip install praatfan-gpl
Building from source
Requires Rust and maturin:
cd python
pip install maturin
maturin develop --release
Quick Start
import praatfan_gpl as pc
# Load an audio file
sound = pc.Sound.from_file("speech.wav")
# Or create from numpy array
import numpy as np
samples = np.sin(2 * np.pi * 440 * np.arange(44100) / 44100)
sound = pc.Sound(samples, 44100.0)
# Compute pitch (F0)
pitch = sound.to_pitch(0.01, 75.0, 600.0)
print(f"Pitch at 0.5s: {pitch.get_value_at_time(0.5, 'hertz', 'linear')}")
# Get all pitch values as numpy array
f0_values = pitch.values() # NaN for unvoiced frames
times = pitch.times()
# Compute formants
formant = sound.to_formant_burg(
time_step=0.01,
max_num_formants=5,
max_formant_hz=5500.0, # Use 5000 for female speakers
window_length=0.025,
pre_emphasis_from=50.0
)
# Get F1, F2 at specific time
f1 = formant.get_value_at_time(1, 0.5, "hertz", "linear")
f2 = formant.get_value_at_time(2, 0.5, "hertz", "linear")
# Get all F1 values
f1_values = formant.formant_values(1) # numpy array
# Compute intensity
intensity = sound.to_intensity(100.0, 0.01)
db_values = intensity.values()
# Compute spectrum (single-frame FFT)
spectrum = sound.to_spectrum(fast=True)
cog = spectrum.get_center_of_gravity(2.0)
std = spectrum.get_standard_deviation(2.0)
# Compute spectrogram
spectrogram = sound.to_spectrogram(
effective_analysis_width=0.005,
max_frequency=5000.0,
time_step=0.002,
frequency_step=20.0,
window_shape="gaussian"
)
spec_data = spectrogram.values() # 2D numpy array [freq, time]
# Compute harmonicity (HNR)
hnr = sound.to_harmonicity_ac(0.01, 75.0, 0.1, 1.0)
# Or cross-correlation method:
hnr_cc = sound.to_harmonicity_cc(0.01, 75.0, 0.1, 1.0)
API Reference
Sound
# Loading
Sound.from_file(path) # Load from WAV, MP3, FLAC, OGG
Sound(samples, sample_rate) # From numpy array
# Properties
sound.sample_rate # Sample rate in Hz
sound.duration # Duration in seconds
sound.num_samples # Number of samples
sound.start_time, sound.end_time # Time bounds
# Methods
sound.samples() # Get samples as numpy array
sound.get_value_at_time(time) # Linear interpolation
sound.extract_part(start, end, ...) # Extract segment
sound.pre_emphasis(from_freq) # High-pass filter
sound.rms(), sound.peak() # Amplitude measures
# Analysis
sound.to_pitch(dt, floor, ceil) # Pitch extraction
sound.to_formant_burg(...) # Formant analysis
sound.to_intensity(min_pitch, dt) # Intensity contour
sound.to_spectrum(fast) # Single-frame FFT
sound.to_spectrogram(...) # Time-frequency analysis
sound.to_harmonicity_ac/cc(...) # HNR analysis
Pitch
pitch.get_value_at_time(time, unit, interp) # Query pitch
pitch.values() # All values (NaN=unvoiced)
pitch.times() # Frame times
pitch.num_frames, pitch.time_step # Frame info
pitch.pitch_floor, pitch.pitch_ceiling # Analysis parameters
Formant
formant.get_value_at_time(n, time, unit, interp) # Fn frequency
formant.get_bandwidth_at_time(n, time, unit, interp) # Fn bandwidth
formant.formant_values(n) # All Fn values
formant.bandwidth_values(n) # All Bn values
formant.times() # Frame times
Intensity
intensity.get_value_at_time(time, interp) # Query dB
intensity.values() # All values
intensity.times() # Frame times
intensity.min(), intensity.max(), intensity.mean()
Spectrum
spectrum.get_band_energy(f_min, f_max) # Energy in band (Pa² s)
spectrum.get_center_of_gravity(power) # Spectral centroid
spectrum.get_standard_deviation(power) # Spectral spread
spectrum.get_skewness(power) # Spectral skewness
spectrum.get_kurtosis(power) # Spectral kurtosis
spectrum.num_bins, spectrum.df # Frequency info
Spectrogram
spectrogram.values() # 2D array [freq, time]
spectrogram.get_time_from_frame(i) # Frame time
spectrogram.get_frequency_from_bin(i) # Bin frequency
spectrogram.num_frames, spectrogram.num_freq_bins
spectrogram.time_step, spectrogram.freq_step
Harmonicity
harmonicity.get_value_at_time(time, interp) # Query HNR (dB)
harmonicity.values() # All values
harmonicity.times() # Frame times
harmonicity.min(), harmonicity.max(), harmonicity.mean()
Unit Options
- Pitch units:
"hertz","mel","semitones","erb" - Frequency units:
"hertz","bark","mel","erb" - Interpolation:
"nearest","linear","cubic" - Window shapes:
"gaussian","hanning","hamming","rectangular"
Comparison with parselmouth
praatfan-gpl aims for bit-accurate compatibility with Praat/parselmouth:
import parselmouth
import praatfan_gpl as pc
import numpy as np
sound_pm = parselmouth.Sound("speech.wav")
sound_pc = pc.Sound.from_file("speech.wav")
# Formant comparison
formant_pm = sound_pm.to_formant_burg(0.01, 5, 5500, 0.025, 50)
formant_pc = sound_pc.to_formant_burg(0.01, 5, 5500.0, 0.025, 50.0)
for t in np.arange(0, sound_pm.duration, 0.01):
f1_pm = formant_pm.get_value_at_time(1, t)
f1_pc = formant_pc.get_value_at_time(1, t, "hertz", "linear")
if f1_pm is not None and f1_pc is not None:
assert abs(f1_pm - f1_pc) < 1.0 # Within 1 Hz
License
GPL-3.0 (same as Praat)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file praatfan_gpl-0.1.4-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: praatfan_gpl-0.1.4-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7390aaf642ecc627c613baaa76435306bc34395f219881ab9ffe5ff4e6fa3ad2
|
|
| MD5 |
b787626400b14c806cc44eecadde1b7a
|
|
| BLAKE2b-256 |
841034311360766b6ec4522819205c6543cb34a7c5475b53172afbd7f1099579
|
File details
Details for the file praatfan_gpl-0.1.4-cp312-cp312-manylinux_2_35_aarch64.whl.
File metadata
- Download URL: praatfan_gpl-0.1.4-cp312-cp312-manylinux_2_35_aarch64.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.12, manylinux: glibc 2.35+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a38ca26b2239b6e40d764c735b5da3d4e9742453d3f24de1ec9968ed32354ae0
|
|
| MD5 |
6772a63791eee25fb7948e9a66a53e62
|
|
| BLAKE2b-256 |
8fc6be857bbb6cbaadc5f6026d306069ad8aa3f9be8428320d69d4f030c3d8d6
|
File details
Details for the file praatfan_gpl-0.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: praatfan_gpl-0.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.4 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7d250942820b3c4199c240cc1863eccfbd4c74cfa590963206c548e0f93a593
|
|
| MD5 |
aa41dbef2cbd42c0d60f0e65ff09b7d2
|
|
| BLAKE2b-256 |
18bdcd6273f43040c053046f6136e3924eee73d8bef4df6bdd13ad9b8a26ad8c
|
File details
Details for the file praatfan_gpl-0.1.4-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: praatfan_gpl-0.1.4-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f28111fd9b42af93fd03c6e983b13aac472a13c9d13f8e3dcf8fa0834b742bd
|
|
| MD5 |
96a2de36794136445e588e8d281710ed
|
|
| BLAKE2b-256 |
9c1ba214620b5e3648177a68bd6dac188b488a38d2e706a9f1a2022aa96c4ce7
|
File details
Details for the file praatfan_gpl-0.1.4-cp312-cp312-macosx_10_12_x86_64.whl.
File metadata
- Download URL: praatfan_gpl-0.1.4-cp312-cp312-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.3 MB
- Tags: CPython 3.12, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f48f139ee952ee2881d359d3cd21234b4c8ab75e5c5272ec4626076eedc474bd
|
|
| MD5 |
0b3a022935dd33c4bf7a4aa896f6a68b
|
|
| BLAKE2b-256 |
4087f2dc0f941fb8793287e49966bea3efe57391c8d1444c6c67300e7eb5f26f
|