[asterisk-dev] adjusting the playback speed of voicemail messages.

Steve Underwood steveu at coppice.org
Tue Apr 15 07:06:25 CDT 2008


Travis Hein wrote:
>>> <snip>
>>>
>>>     
>>>       
>>>> I don't know 
>>>> enough about how JACK works to say what a filter would look like to 
>>>> slow down or speed up audio without distorting the pitch.  Let us 
>>>> know if this is the right solution, and the methods and details of 
>>>> any successful tests!
>>>>       
>>>>         
>> Jack just passes blocks of floating point samples around, what DSP is
>> done is entirely up to the jack applications.
>>
>> There are two open source libraries doing the constant pitch at variable
>> speed thing that I know of, Rubberband (written in C++) and
>> libsoundtouch which is in C. 
>>
>> Both are fundamentally phase vocoders but they have different tradeoffs,
>> they both work and may be worth looking into. 
>>
>>   
>>     
> Hi all,
>
> Thank you all for your feedback and ideas on this.
>
> The JACK API in the 1.6/trunk sounds interesting, however we are still 
> on 1.4 and likely will be slow to transition. Plus it was not clear to 
> me how I would be able to in real time increase or decrease the speed of 
> playback with the phone keypad (like how is currently done to skip ahead 
> / back with the #, * keys,  (those call the seek() function of the 
> ast_format interface).
>
> And the libsoundtouch looked nice as well, but we decided it was just ok 
> to have chipmunk sounding voices, in favoring of the reduced CPU effort 
> (by not needing to FFT the samples in the vocoder algorithm), and just 
> transform the sample rates in a small window buffer, plus that needing 
> to make separate offline temporary files, I just couldn't think of good 
> sensible ways to do that so that there would be that real time experience.
>
> What I ended up using for now was libsamplerate, (and although not 
> entirely necessary, libsndfile, because it has an API for reading the 
> samples data values as floats, instead of the simple .wav file 
> implementation, which is convenient when working with small buffered 
> windows for the libsamplerate). Actually the libsamplerate comes with an 
> example to vary the speed of playback of an audio file. It does make the 
> voice sound like chipmunks when it is faster, and lower pitch when 
> slower, but for the purposes of our current needs, that is acceptable, 
> our clients old voicemail system apparently did that, and apparently 
> they are used to and prefer to hear it that way. And it was important 
> that I get something of useable quality working sooner than it would 
> take me to brush the dust off of my calculus books to understand and 
> develop a custom built vocoder, and the libsamplerate seems to do 
> resampling good-enough with its API.  And to be considerate for those 
> concerns about patents, hopefully the existing and commonly available 
> GNU licensed projects that make libsamplerate would be done in a way 
> that is mindful of any patents.
>
> To make this concept work in asterisk, I created new version of the 
> ast_control_streamfile (i called it vm_control_streamfile and stuffed it 
> into apps/app_voicemail.c for now, added additional parameters for the 
> input keys for speed up / slow down.) I avoided having to extend the 
> ast_format structure to have a speedup() and slowdown() functions, (and 
> thus every file format implementation) by adding a variable to the 
> ast_filestream, which is a float of the ratio for which the file should 
> be played back. This gets set from the keypress on the 
> vm_control_streamfile and is read from the libsamplerate api that is now 
> inside the wav_read() in formats/format_wav.c . So existing formats that 
> do not support or know about play back at a different ratio, would just 
> ignore the src_ratio variable in the ast_filestream structure,
>
> To fuel the the immediate discussion to follow on if it is a good idea 
> or not to include libsamplerate and libsndfile as an optional dependency 
> into asterisk,  I was thinking
>  - using some #ifdef HAVE_LIBSAMPLERATE  things where there would be the 
> new alternate code to make this work,
>  - a new option to the configure script for --with-libsamplerate=..... 
> and if libsamplerate is not detected / enabled on the configure script, 
> then the ability to do this is not available, furthermore, not having 
> these (GPL licensed) third party library files causes everything to 
> compile and work as it already does now.
>
> This is just for the basic low-level (wav) file playback manipulation 
> support, And then in the app_voicemail would still have a voicemail 
> option to use speedup = on/off, so the current means of skipping ahead 
> can be done instead if desired. though currently both classical skip 
> ahead and increase speed options should be possible.
>   
Interesting choice. You say you want low compute, but you choose a 
fairly high compute solution that gives horrible results. :-\

Steve




More information about the asterisk-dev mailing list