[aubio-user] Fwd: aubio help

Илья ilya at perevoznik.name
Wed Nov 23 10:34:42 CET 2016



> Начало переадресованного сообщения:
> 
> Отправитель: Илья <ilya at perevoznik.name>
> Тема: Ответ: [aubio-user] Fwd: aubio help
> Дата: 23 ноября 2016 г., 11:46:26 GMT+3
> Получатель: Paul Brossier <piem at aubio.org>
> 
> I can’t believe and i don’t not how BUT IT’S WORK. Thank You very much, it was really helpful, but i must note that 
> 
> np.append(sink_out, stretched) 
> 
> not works cuz np.append function returns new ndarray. it means to use it like this
> 
> sink_out = np.append(sink_out, stretched).
> 
> 
> Thank You very much again. Now I have only to add stereo support :D
> 
> 
>> 23 нояб. 2016 г., в 0:45, Paul Brossier <piem at aubio.org <mailto:piem at aubio.org>> написал(а):
>> 
>> Hi Ilya,
>> 
>> First, note that I am currently working on integrating time-stretch in
>> the C library (see the timestretch git branch). In a future release
>> (probably one release after the upcoming one), this will become much
>> easier, including in Python.
>> 
>> Also, I would suggest that you start from `demo_timestretch_online.py`,
>> which is much more memory efficient than `demo_timestretch.py`.
>> 
>> A few notes from from reading your code, I would suggest:
>> 
>> - initializing sink_out as an array, not as a list:
>> 
>>    import numpy as np	
>>    sink_out = np.ndarray([])
>> 
>> - append each produced frames with numpy.stack (list.append would
>> create a list of arrays, so it's not really what you want):
>> 
>>    if t > warmup:  # skip the first few frames to warm up phase vocoder
>>        # write to sink
>>        np.append(sink_out, stretched_samples)
>> 
>> The final conversion of your list to an array needs to be checked. If
>> you need the output as integers, you most likely want to multiply the
>> float samples by a constant. With the above modifications, it could
>> become something like:
>> 
>>    sink_out_int = (sink_out * 32768).astype(np.int16)
>> 
>> To debug your code, you could add print statements to each steps to
>> check the size of the sink_out array, which you should see grow at each
>> step. Also, make sure to avoid not overwriting local variables by using
>> the same name (self._samples, samples, samples_proc...).
>> 
>> Let us know how it works out for you,
>> 
>> Best, Paul
>> 
>> On 11/22/2016 08:43 PM, Илья wrote:
>>> 
>>> 
>>>> Начало переадресованного сообщения:
>>>> 
>>>> *Отправитель: *Илья <ilya at perevoznik.name <mailto:ilya at perevoznik.name> <mailto:ilya at perevoznik.name <mailto:ilya at perevoznik.name>>>
>>>> *Тема: **aubio help*
>>>> *Дата: *22 ноября 2016 г., 19:25:41 GMT+3
>>>> *Получатель: *piem at piem.org <mailto:piem at piem.org> <mailto:piem at piem.org <mailto:piem at piem.org>>
>>>> 
>>>> Hello, i’m coding app, that use `aubio` in it and i want to make a
>>>> time-stretch of sound. (i’m using python module)
>>>> 
>>>> i found a demo (in you’re python/demos folder) that actually what I’m
>>>> looking for, but i need to rewrite it to compatibility with my already
>>>> existing functions etc.
>>>> I have a trouble with sink_out, i tried to look in clang code of it,
>>>> but anyway i can’t understand, but i can’t use it cause i have my own
>>>> file saving system. i tried to emulate sink_out with a list (that
>>>> would convert to ndarray after stretching) and it doesn’t works, cuz i
>>>> have just 1279 samples at the out, but at in it was 352800 :D
>>>> 
>>>> please, help me to understand how to rewrite it without sink_out. i
>>>> need to write all to ndarray. my code below:
>>>> 
>>>> def time_stretch(self, rate):
>>>> win_s = self._win_size
>>>>    hop_s = self._hop_size
>>>> 
>>>>    warmup = win_s // hop_s - 1
>>>> 
>>>> p = pvoc(win_s, hop_s)
>>>> 
>>>> # allocate memory to store norms and phases
>>>> n_blocks = len(self._samples) // hop_s + 1
>>>> # adding an empty frame at end of spectrogram
>>>> norms = np.zeros((n_blocks + 1, win_s // 2 + 1), dtype=float_type)
>>>> phases = np.zeros((n_blocks + 1, win_s // 2 + 1), dtype=float_type)
>>>> 
>>>> block_read = 0
>>>> samples = self._samples
>>>>    steps_max = len(samples) - (len(samples) % hop_s)
>>>> 
>>>> for i in range(0, steps_max, hop_s):
>>>> # pitchin = pitch_o(samples[i:i + self._hop_size])
>>>> # read from source
>>>> samples_proc = np.asarray(samples[i:i + hop_s]).astype(np.float32)
>>>> # compute fftgrain
>>>> spec = p(samples_proc)
>>>> # store current grain
>>>> norms[block_read] = spec.norm
>>>>        phases[block_read] = spec.phas
>>>>        # increment block counter
>>>> block_read += 1
>>>> 
>>>> # just to make sure
>>>> # source_in.close()
>>>> 
>>>> sink_out = []
>>>> 
>>>> # interpolated time steps (j = alpha * i)
>>>> steps = np.arange(0, n_blocks, rate, dtype=float_type)
>>>> # initial phase
>>>> phas_acc = phases[0]
>>>> # excepted phase advance in each bin
>>>> phi_advance = np.linspace(0, np.pi * hop_s, win_s / 2 + 1).astype(float_type)
>>>> 
>>>> new_grain = cvec(win_s)
>>>> 
>>>> for (t, step) in enumerate(steps):
>>>> 
>>>> frac = 1. - np.mod(step, 1.0)
>>>> # get pair of frames
>>>> t_norms = norms[int(step):int(step + 2)]
>>>> t_phases = phases[int(step):int(step + 2)]
>>>> 
>>>> # compute interpolated frame
>>>> new_grain.norm = frac * t_norms[0] + (1. - frac) * t_norms[1]
>>>> new_grain.phas = phas_acc
>>>>        # print t, step, new_grain.norm
>>>> # print t, step, phas_acc
>>>> 
>>>> # psola
>>>> samples_proc = p.rdo(new_grain)
>>>> if t > warmup: # skip the first few frames to warm up phase vocoder
>>>> # write to sink
>>>> sink_out.append(samples_proc[:hop_s])
>>>> 
>>>> # calculate phase advance
>>>> dphas = t_phases[1] - t_phases[0] - phi_advance
>>>>        # unwrap angle to [-pi; pi]
>>>> dphas = unwrap2pi(dphas)
>>>> # cumulate phase, to be used for next frame
>>>> phas_acc += phi_advance + dphas
>>>> 
>>>>    for t in range(warmup + 1): # purge the last frames from the phase vocoder
>>>> new_grain.norm[:] = 0
>>>> new_grain.phas[:] = 0
>>>> samples_proc = p.rdo(new_grain)
>>>> sink_out.append(samples_proc[:hop_s])
>>>> 
>>>> self._samples = np.asarray(sink_out).astype(np.int16)
>>>> P.S. Sorry for my bad English.
>>>> 
>>>> Thank You!
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> aubio-user mailing list
>>> aubio-user at aubio.org <mailto:aubio-user at aubio.org>
>>> https://lists.aubio.org/listinfo/aubio-user <https://lists.aubio.org/listinfo/aubio-user>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.aubio.org/pipermail/aubio-user/attachments/20161123/ffd3bae3/attachment-0001.html>


More information about the aubio-user mailing list