- Fixed bug #168 and added a regression test for it
- Added option
-f, --full
toaeneas.tools.read_audio
and tests for it
- Added MacOS TTS Wrapper (courtesy of Chris Vaughn)
- Removed dependency from
pafy
, usingyoutube-dl
directly (#159) - Added retry mechanism to
Downloader
, includingDOWNLOADER_SLEEP
andDOWNLOADER_RETRY_ATTEMPTS
inRuntimeConfiguration
- Fixed bug #160
- Fixed a latent bug with arbitrary shifts in aba when using the
task_adjust_boundary_no_zero
option - Fixed a latent bug in AWS Polly and Nuance wrappers
- Updated copyright strings with 2017
- Updated
INSTALL.md
to brew install from Daniel Bair's tap instead of official brew repo since they removed the formula for aeneas (#165)
- Fix bug #151
- Downgraded dependency on lxml to lxml>=3.6.0 to help packaging the Windows installer
- Added aeneas version to log
- Changed default voice for Festival TTS Wrapper to
eng-USA
to help people installing from source on Mac OS X
- Moved syncmap I/O functions in
aeneas.syncmap
subpackage - Renamed
aeneas.timevalue
intoaeneas.exacttiming
- Renamed
audio_duration
intolength
inSyncMapFragment
for consistency withTimeInterval
- Renamed
os_task_file_no_zero
(PPN_OS_TASK_FILE_NO_ZERO
) totask_adjust_boundary_no_zero
(PPN_TASK_ADJUST_BOUNDARY_NO_ZERO
) inTaskConfiguration
- Renamed
nuance_tts_api_sleep
(NUANCE_TTS_API_SLEEP
) totts_api_sleep
(TTS_API_SLEEP
) inRuntimeConfiguration
- Renamed
nuance_tts_api_retry_attempts
(NUANCE_TTS_API_RETRY_ATTEMPTS
) totts_api_retry_attempts
(TTS_API_RETRY_ATTEMPTS
) inRuntimeConfiguration
- Renamed
--rates
to--rate
inExecuteTaskCLI
- Renamed
--example-rates
to--example-rate
inExecuteTaskCLI
- Changed
config_string()
to property inaeneas.configuration.Configuration
- Changed the default value of
TASK_MAX_AUDIO_LENGTH
to0
(i.e., process audio file with arbitrary audio length) - Added two new output formats:
TEXTGRID
(Praat long TextGrid) andTEXTGRID_SHORT
(Praat short TextGrid) - More robust and generic reading of SRT-like files, especially WebVTT
- Fixed typos in
SyncMapFormat
docstrings - Added
safety_checks
parameter toRuntimeConfiguration
that can be disabled to trade safety for speed (issue #117) - Added Makefile files to C/C++ extensions, replacing previous Bash scripts
- Simplified
ExecuteTask
, offloading some sub-tasks toSyncMap
,SyncMapFragmentList
, andAdjustBoundaryAlgorithm
- Simplified
AdjustBoundaryAlgorithm
- Added method
sync_map_vleaves
inTask
for quick access to sync map fragments (vleaves) - Added
aeneas.exacttiming.TimeInterval
class to represent time intervals and act upon them - Added tests for
TimeInterval
- Added
has_zero_length
inSyncMapFragment
- Added comparison functions to
SyncMapFragment
, based onTimeInterval
- Added
aeneas.syncmap.fragmentlist.SyncMapFragmentList
class to represent a list of sync map fragments, sorted and with positional/timing constraints - Added tests for
SyncMapFragmentList
- Added
clone()
method toaeneas.configuration.Configuration
- Removed
clone()
method toaeneas.runtimeconfiguration.RuntimeConfiguration
(now it inherits fromConfiguration
) - Added
clone()
method toaeneas.tree.Tree
- Added more tests for
Tree
- Added
PPN_TASK_ADJUST_BOUNDARY_NONSPEECH_MIN
andPPN_TASK_ADJUST_BOUNDARY_NONSPEECH_STRING
toTaskConfiguration
- Added
ABA_NONSPEECH_TOLERANCE
andABA_NO_ZERO_DURATION
parameters toRuntimeConfiguration
- Added more tests for
Configuration
andRuntimeConfiguration
- Added map from language code to human-readable name for TTS wrappers and for
Language
, usable byaeneas.tools.execute_task
- Marked Afrikaans (
afr
) language as tested - Added more examples to
aeneas.tools.execute_task
- Added more tool and long tests
- Added bench tests
- Added
wiki/TESTING.md
- Added
venvs
directory with scripts to automate testing with virtual environments - Added
RuntimeConfiguration
parameters to switch MFCC masking on, including per level in multilevel tasks - Modified
DTWAligner
,AudioFileMFCC
,ExecuteTask
, andVAD
to allow MFCC masking - Added field human-readable descriptions in
Configuration
and its subclasses - Better
--list-parameters
inExecuteTask
- Added
--list-parameters
inExecuteJob
- Added
--help-rconf
option to all tools - Added check in
ExecuteTask
on the consistency of the computed sync map - Added
RuntimeConfiguration
parametersDTW_MARGIN_L1
,DTW_MARGIN_L2
,DTW_MARGIN_L3
, to change DTW margin of each level - Added
FFMPEG_PARAMETERS_SAMPLE_48000
toffmpegwrapper.py
- Fixes issue with
gf.relative_path()
in Windows, if executed from a drive different than the install drive - Fixed a bug with empty fragments when using subprocess TTS with TTS cache enabled
- Added
--presets-word
switch toaeneas.tools.execute_task
- Added
AWSTTSWrapper
wrapper for AWS Polly TTS API - Revised docs
- Fixed a bug in reading SMIL files with machine-readable timings
- Fixed a bug in
SyncMapFragmentList
which caused sync map to contain overlapping fragments
- Fixes bug in Nuance TTS wrapper
- Fixed bug #102 by checking that the audio file produced by the TTS engine is mono WAVE and has correct sample rate: slightly slower but safe
- Created
aeneas.ttswrappers
subpackage - Renamed
aeneas.ttswrapper
toaeneas.ttswrappers.basettswrapper
, andTTSWrapper
toBaseTTSWrapper
- Renamed
aeneas.espeakwrapper
toaeneas.ttswrappers.espeakttswrapper
, andESPEAKWrapper
toESPEAKTTSWrapper
- Renamed
aeneas.festivalwrapper
toaeneas.ttswrappers.festivalttswrapper
, andFESTIVALWrapper
toFESTIVALTTSWrapper
- Renamed
aeneas.nuancettsapiwrapper
toaeneas.ttswrappers.nuancettswrapper
, andNuanceTTSAPIWrapper
toNuanceTTSWrapper
- Modified the value for using the Nuance TTS API from
nuancettsapi
tonuance
inaeneas.synthesizer.SYNTHESIZER
- Now each TTS wrapper must declare the format (codec, channels, sample rate) of its output
- Now each TTS wrapper can declare the default path for the TTS engine executable, using
DEFAULT_TTS_PATH
- Changed the constructor of
BaseTTSWrapper
and derived classes, moving call method flags from constructor parameters to class fields - Added check when synthesizing multiple: at least one fragment should be not empty
- Simplified writing custom TTS wrappers by providing the "multiple generic" method in
BaseTTSWrapper
- Removed
synthesize_single()
function in all TTS wrappers and incew
- When working on multilevel sync, user can specify a different TTS for each level
- Added an optional TTS caching mechanism to reduce subprocess/API calls to the TTS engine (closes #87)
- Added wrapper for eSpeak-ng (subprocess only)
- Added
cfw
Python C++ Extension to callFestival
via its C++ API, disabled by default (closes #106) - Unified unit tests for eSpeak, eSpeak-ng, and Festival
- Python C extension compilation can be disabled/forced in setup.py via env vars
- Added check on head/process/tail length which should not exceed the audio file length (closes #80)
- Moved package metadata from
setup.py
intosetupmeta.py
- Added AGPL header to all source files
- Removed metadata (e.g., version) from all source files, except those directly facing the user
- PEP 8 compliance for all Python files (except for E501 "line too long")
- Added
wiki/CONTRIBUTING.md
explaining the contribution rules (branch policy, code style, etc.) - Using Sphinx theme from readthedocs.org if available
- Updated dependencies: BeautifulSoup4>=4.5.1 and lxml>=3.6.4 (see discussion in #93)
- Updated documentation
- Several other minor code improvements
- Added
invoke
parameter toAbstractCLIProgram
constructor and modified tools consequently - Added
aeneas.tools.hydra
tool to run all other aeneas.tools.* scripts - Added
pyinstaller-*
configuration files forpyinstaller
- Added the
PYINSTALLER.md
file documenting how to compile an executable with PyInstaller - Added rconf
CDTW
,CEW
, andCMFCC
parameters to prevent running a single C extension - Added
PPN_TASK_OS_FILE_EAF_AUDIO_REF
to specify audio file URI for EAF output sync maps - Added function to output current date and time in EAF output sync maps
- Removed copies of
cint.[ch]
andcwave.[ch]
in other C extensions, changed include paths - Removed unused keys from
JobConfiguration
and related source files - Moved import statements for
lxml
andbs4
inside the functions actually using them (better isolation for future purposes) - Fixed a numerical issue in
dtw.py
by explicit statingdtype=int
incenters
initializer, pure Python code only - Extension
cew
compiled for Mac OS X and Windows - Added links to installers for Mac OS X and Windows in the documentation
- Explicitly requiring lxml v3.6.0 and BeautifulSoup4 v4.4.1 due to a change in BeautifulSoup4 v4.5.0 API (to be investigated later)
- Fix an issue in
sd
withfloat
returned instead ofTimeValue
- Fix an issue in
dtw
withnumpy.searchsorted
returning an invalid index
- Fix an issue with compiling C extensions on Windows
- Rewritten
vad.py
- Rewritten
sd.py
, removedSDMetric
- Rewritten
adjustboundaryalgorithm.py
- Simplified
executetask.py
- Added
Loggable
tologger.py
, now most classes derive from it - Added
timevalue.py
containing an arbitrary-precision type to represent time values (instead offloat
) - Added
ttswrapper.py
to support generic TTS engine invocation - Added
festivalwrapper.py
- Added
nuancettsapiwrapper.py
- Modified
espeakwrapper.py
to fit in the new TTS architecture - Renamed
espeak_path
totts_path
inRuntimeConfiguration
- Deleted
aeneas.tools.espeak_wrapper
CLI tool, useaeneas.tools.synthesize_text
instead - Added
CEWSubprocess
to runaeneas.cew
in a separate process to work around a bug in libespeak - Added
aeneas/extra
directory, containing some custom TTS wrappers - Changed meaning of
language.py
and added list of supported languages inside TTS wrappers - Added
plotter.py
to plot waveforms and sets of labels to image file - Added
aeneas.tools.plot_waveform
CLI tool - Added
tree.py
to support the new tree-like structure ofTextFile
andSyncMap
- Modified
textfile.py
with the new tree-like structure - Added
multilevel
input text format - Added initial support for outputting multilevel JSON, SMIL, TTML, and XML sync maps
- Added README files and documentation to the C extensions subdirectories
- Added Bash scripts to compile and run C drivers
- Added usage messages to C drivers
- Converted all
malloc()
calls tocalloc()
calls to avoid dirty allocations, added checks on the returned pointers - Introduced fixed-size int types in C extensions, with explicit definitions for the MS C compiler
- Merged
AudioFileMonoWAVE
back intoAudioFile
- More efficient append/prepend operations in
AudioFile
thanks to preallocated memory and space doubling - Created
AudioFileMFCC
to handle the MFCC representation of audio files - Added
run_vad()
toAudioFileMFCC
,VAD
is just an "algorithm-switcher" class now - Added
detect_head_tail()
toAudioFileMFCC
,SD
is just an "algorithm-switcher" class now - Listed supported keys in
RuntimeConfiguration
documentation - Renamed
ConfigurationObject
toConfiguration
- Renamed
append_*
functions toadd_*
in several classes - Removed
computed_path
property inDTWAligner
,compute_path()
now returns it - Fixed a bug with logger and rconf initialization in all classes
- Added
--cewsubprocess
option toaeneas.tools.execute_job
- Fixed a bug in
aeneas.tools.execute_job
that prevented processing uncompressed containers - Added
--faster-rate
,--rates
, and--zero
options toaeneas.tools.execute_task
- More
--example-*
shortcuts inaeneas.tools.execute_task
- Added list of supported language codes to
--list-values
inaeneas.tools.execute_task
- All
aeneas.tools.*
CLI tools now print messages in color on POSIX OSes - Added
gc.PPN_TASK_OS_FILE_NO_ZERO
(i.e.,os_task_file_no_zero
) to avoid fragments with zero duration in sync maps - Added
"TRUE"
and"YES"
as aliases forTrue
value inConfiguration
- Added
AUD
,AUDH
andAUDM
sync map output format for use withAudacity
- Added
EAF
sync map output format for use withELAN
- Deprecated
RBSE
sync map output format - More unit tests
- More uniform documentation: unless
byte
is specified,string
indicates a Unicode string (unicode
in Python 2,str
in Python 3)
- Added
DFXP
sync map output format, alias forTTML
- Added
SBV
sync map output format (SubViewer format with newline, used by YouTube) - Added
SUB
sync map output format (SubViewer format with[br]
) - Added
aeneas.diagnostics
to perform setup check, modifiedaeneas_check_setup.py
accordingly - Marked Czech (
cs
) language as tested - Optimizated computation of MFCCs if no head/tail has been cut
- Fixed the
numpy deprecated API warning
for C extensions - Fixed a few bugs and cleaned the source code of the
cmfcc
C extension, added a C driver program - Cleaned the source code of the
cew
C extension, added a C driver program - Cleaned the source code of the
cdtw
C extension, added a C driver program - Added
cwave
C extension (currently not used), added a C driver program - Added
write
method toLogger
to dump log to file - Added
ConfigurationObject
to represent a dictionary with a fixed set of keys, default values, and aliases - Now
JobConfiguration
andTaskConfiguration
extendConfigurationObject
- Added
RuntimeConfiguration
, extendingConfigurationObject
, to keep the runtime settings, tunable by (expert) users - Added to
AbstractCLIProgram
support for specifying log file path - Added to
AbstractCLIProgram
support for specifying runtime configuration - Changed
FFMPEG_PARAMETERS_DEFAULT
inffmpeg.py
toFFMPEG_PARAMETERS_SAMPLE_16000
(i.e., from 22050 Hz to 16000 Hz) - Added support for specifying the temporary directory path in the
RuntimeConfiguration
- Refactored
mfcc.py
to better fit into the library structure - Moved the original
mfcc.py
into thethirdparty/
directory for clarity and attribution - Nicer
aeneas_check_setup.py
script - More unit tests covering runtime configuration options
- Slimmed the
README.md
down
- Now running on both Python 2.7.x and Python 3.4.x or later, including C extensions
- For XML-based sync map formats, now using
UTF-8
encoding instead ofASCII
- Unified
aeneas.tools.*
structure, with better help messages and exit codes - All
aeneas.tools.*
can be run interactively or called from Python code by passing a list of arguments aeneas.tools.convert_syncmap
has slightly different option namesaeneas.tools.read_text
has a different order of arguments and different option namesaeneas.tools.synthesize_text
has a different order of arguments and different option namesaeneas.tools.run_sd
has a different order of arguments and different option names- Added
bin/
scripts - Added a flag to disable checking a language code string against listed (supported) ones, allowing for testing with custom espeak voices
- Ported the unit test launcher
run_all_unit_tests.py
in Python, with more options thanunittest discover
- Added unit test
aeneas.tests.test_idsortingalgorithm
- Added unit tests for
aeneas.tools.*
(--tool-tests
) - Added unit tests for
executejob.py
andexecutetask.py
(--long-tests
) - Added unit tests for
downloader.py
andaeneas.tools.download
(--net-tests
) - Better and more unit tests
- Changed all
IOError
toOSError
, per Python 3 recommendation - Changed
parameters=None
default value in the constructor ofFFMPEGWrapper
- Renamed
AudioFileMonoWAV
toAudioFileMonoWAVE
- Renamed
best_audio
parameter tolargest_audio
indownloader.py
and inaeneas.tools.execute_task
andaeneas.tools.download
- Renamed
get_rel_path
(resp.,get_abs_path
) intorelative_path
(resp.,absolute_path
) inaeneas.globalfunctions
- Fixed a potential bug in
relative_path
: now getting the cwd path usingos.getcwd()
- Fixed a bug in
cew.c
triggered when passing espeak voices with variants (e.g.,en-gb
)
- Added all voice variants (e.g.,
en-gb
tolanguage.py
) supported by espeak v1.48.03
- Added
is_text_file_ignore_regex
parameter to ignore text from the input file - Added
is_text_file_transliterate_map
parameter to read a transliteration map from file and apply it to the input text - Added
thirdparty/transliteration.map
sample transliteration map (courtesy of Steve Gallagher and Richard Margetts) - Edited
README.md
, stating the optional dependency frompafy
- Renamed
check_dependencies.py
intoaeneas_check_setup.py
- Added
debian/
directory containing files for creating a Debian/Ubuntu.deb
package (courtesy of Chris Hubbard) - Removed
pafy
from required dependencies
- Added
os_task_file_id_regex
parameter to add user-definedid
values forplain
andsubtitles
input files - Added the HTML file
finetuneas.html
for manually fine tuning the sync maps (courtesy of Firat Özdemir) - Added an option to
aeneas.tools.convert_syncmap
andaeneas.tools.execute_task
to outputfinetuneas
HTML file
- Added
cew
C module for synthesizing text withespeak
much faster than in pure Python (only available on Linux at the moment) - Added
wavfile.py
fromscipy.io
to replacescikits.audiolab
- Added
AudioFileMonoWAV
, containing all the mono WAV functions previously inAudioFile
- Added
is_audio_file_tail_length
parameter - Added exception handling, especially in
aeneas.tools.*
- Added
Downloader
to download files from Web sources (currently, audio from YouTube) - Added the corresponding
aeneas.tools.download
utility - Added
pafy
as a Python dependency, and removedscikits.audiolab
- Added third party licenses
- Unified the I/O of
aeneas.tools.*
, creating theaeneas/tools/res/
andoutput/
directories - Better and more unit tests
- Improved documentation, especially the
README.md
- Added
licenses/
directory, containing the licenses of third party code
- Added
sd.py
to automatically detect the head/tail/interval of an audio file - Added the corresponding
aeneas.tools.run_sd
utility - Added the corresponding Task configuration parameters:
is_audio_file_detect_head_min
,is_audio_file_detect_head_max
,is_audio_file_detect_tail_min
,is_audio_file_detect_tail_max
, andos_task_file_head_tail_format
- Added
SMILH
andSMILM
sync map output formats (SMIL
becoming an alias ofSMILH
) - Added
CSVM
,SSVM
,TSVM
, andTXTM
formats (CSV
,SSV
,TSV
, andTXT
becoming their aliases) - Renamed the previous
JSON
sync map output format toRBSE
- Added a new
JSON
format - Renamed the previous
XML
sync map output format toXML_LEGACY
- Changed
JSON
(andRBSE
) write function, now using thejson
library - Added a new
XML
format - Changed
SMIL
,TTML
, andXML
write functions, now using thelxml
library - Added functions to read sync map files
- Added the
aeneas.tools.convert_syncmap
utility to convert sync maps - Added
reverse
,trim
, andwrite
functions toAudioFile
- Added all the languages that espeak v1.48.03 supports to the
Language
enumeration (those not tested yet are marked as such) - Marked Persian (
fa
) and Swahili (sw
) languages as tested - Added the
aeneas.tools.synthesize_text
utility to synthesize multiple fragments into a single wave file - Changed
FFMPEG_PARAMETERS_DEFAULT
inffmpeg.py
toFFMPEG_PARAMETERS_SAMPLE_22050
(i.e., from 44100 Hz to 22050 Hz) - Fixed the
TTML
output - Fixed a
KeyError
bug inffprobewrapper.py
when probing a file not recognized as audio file - Fixed a bug in
cdtw.c
: int overflow when computing thecenters
array on long (>30 minutes) audio files - Many unit tests have been rewritten, extended, or refactored
- Other minor fixes and code/documentation improvements
- Better
setup.py
, especially for Windows users (courtesy of David Smith)
- Added
compile_c_extensions.bat
and directions for Windows users (courtesy of Richard Margetts) - Added warning to
aeneas.tools.*
when running without Python C extensions compiled - Improved
README.md
- Added
cdtw
C module for running the DTW much faster than in pure Python (falling back to Python ifcdtw
cannot be load) - Added
cmfcc
C module for extracting the MFCCs much faster than in pure Python (falling back to Python ifcmfcc
cannot be load) - Moved code for extracting MFCCs into
AudioFile
, and rewrittendtw.py
andvad.py
accordingly - Added
aeneas.tools.extract_mfcc
utility - Rewritten the
STRIPE
andEXACT
(Python) algorithms to compute the accumulated cost matrix in place - Renamed
ALIGNER_USE_EXACT_ALGO_WHEN_MARGIN_TOO_LARGE
toALIGNER_USE_EXACT_ALGORITHM_WHEN_MARGIN_TOO_LARGE
- Removed
STRIPE_NOT_OPTIMIZED
algorithm fromdtw.py
- Added the
OFFSET
andRATEAGGRESSIVE
boundary adjustment algorithms - Cleaned the code for
RATE
boundary adjustment algorithm - Other minor fixes and code/docs improvements
- Added boundary adjustment algorithm
- Added VAD algorithm and
aeneas.tools.run_vad
utility - Added
subtitles
input text format and the ability of dealing with multiline text fragments - Added
SSV
output format - Added
CSVH
,SSVH
,TSVH
,TXTH
output formats (i.e., human-readable variants) - Added
-v
option toaeneas.tools.execute_task
andaeneas.tools.execute_job
to produce verbose output - Added
install_dependencies.sh
- Added this changelog
- Sanitized log messages, fixing a problem with
tee=True
crashing in non UTF-8 shells (tested in a POSIX shell) - Improved unit tests
- Other minor fixes and code/docs improvements
- Added
TSV
output format - Added reference to
aeneas-vagrant
- Added
run_all_unit_tests.sh
- Corrected typos
- Merged
requirements.txt
- Initial version