PyWORLD - A Python wrapper of WORLD Vocoder
Linux |
Windows |
---|---|
WORLD Vocoder is a fast and high-quality vocoder which parameterizes speech into three components:
f0
: Pitch contoursp
: Harmonic spectral envelopeap
: Aperiodic spectral envelope (relative to the harmonic spectral envelope)
It can also (re)synthesize speech using these features (see examples below).
For more information, please visit Dr. Morise's WORLD repository and the official website of WORLD Vocoder
APIs
Vocoder Functions
import pyworld as pw
_f0, t = pw.dio(x, fs) # raw pitch extractor
f0 = pw.stonemask(x, _f0, t, fs) # pitch refinement
sp = pw.cheaptrick(x, f0, t, fs) # extract smoothed spectrogram
ap = pw.d4c(x, f0, t, fs) # extract aperiodicity
y = pw.synthesize(f0, sp, ap, fs) # synthesize an utterance using the parameters
Utility
# Convert speech into features (using default arguments)
f0, sp, ap = pw.wav2world(x, fs)
You can change the default arguments of the function, too. See more info using help
.
Installation
Using Pip
pip install pyworld
Building from Source
git clone https://github.com/JeremyCCHsu/Python-Wrapper-for-World-Vocoder.git
cd Python-Wrapper-for-World-Vocoder
git submodule update --init
pip install -U pip
pip install -r requirements.txt
pip install .
It will automatically git clone
Morise's World Vocoder (C++ version).
(It seems to me that using virtualenv
or conda
is the best practice.)
Installation Validation
You can validate installation by running
cd demo
python demo.py
to see if you get results in test/
direcotry. (Please avoid writing and executing codes in the Python-Wrapper-for-World-Vocoder
folder for now.)
Environment/Dependencies
- Operating systems
- Linux Ubuntu 14.04+
- Windows (thanks to wuaalb)
- WSL
- Python
- 2.7 (Windows is currently not supported)
- 3.7/3.6/3.5
You can install dependencies these by pip install -r requirements.txt
Notice
- WORLD vocoder is designed for speech sampled ≥ 16 kHz. Applying WORLD to 8 kHz speech will fail. See a possible workaround here.
- When the SNR is low, extracting pitch using
harvest
instead ofdio
is a better option.
Troubleshooting
- Upgrade your Cython version to 0.24.
(I failed to build it on Cython 0.20.1post0)
It'll require you to download Cython form http://cython.org/
Unzip it, andpython setup.py install
it.
(I triedpip install Cython
but the upgrade didn't seem correct)
(Again, add--user
if you don't have root access.) - Upon executing
demo/demo.py
, the following code might be needed in some environments (e.g. when you're working on a remote Linux server):
import matplotlib
matplotlib.use('Agg')
-
If you encounter
library not found: sndfile
error upon executingdemo.py
,
you might have to install it byapt-get install libsoundfile1
.
You can also replacepysoundfile
withscipy
orlibrosa
, but some modification is needed:- librosa:
- load(fiilename, dtype=np.float64)
- output.write_wav(filename, wav, fs)
- remember to pass
dtype
argument to ensure that the method gives you adouble
.
- scipy:
- You'll have to write a customized utility function based on the following methods
- scipy.io.wavfile.read (but this gives you
short
) - scipy.io.wavfile.write
- librosa:
-
If you have installation issue on Windows, I probably could not provide much help because my development environment is Ubuntu and Windows Subsystem for Linux (read this if you are interested in installing it).
Other Installation Suggestions
- Use
pip install .
is safer and you can easily uninstall pyworld bypip uninstall pyworld
- For Mac users: You might need to do
MACOSX_DEPLOYMENT_TARGET=10.9 pip install .
See issue.
- Another way to install pyworld is via
python setup.py install
- Add
--user
if you don't have root access - Add
--record install.txt
to track the installation dir
- Add
- If you just want to try out some experiments, execute
python setup.py build_ext --inplace
Then you can use PyWorld from this directory.
You can also copy the resulting pyworld.so (pyworld.{arch}.pyd on Windows) file to~/.local/lib/python2.7/site-packages
(or corresponding Windows directory) so that you can use it everywhere like an installed package.
Alternatively you can copy/symlink the compiled files using pip, e.g.pip install -e .
Acknowledgement
Thank all contributors (tats-u, wuaalb, r9y9, rikrd, kudan2510) for making this repo better and sotelo whose world.py inspired this repo.