1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| import av
import numpy as np
def clip_convert(audio_samples: np.ndarray[numbers.Real]) -> np.ndarray[numbers.Real]:
"""
** Converts sound samples into float between -1 and 1. **
Minimizes copying and reallocations.
Examples
--------
>>> import numpy as np
>>> import clip_convert
>>> clip_convert(np.array([-1.5, -1.0, -.5, .5, 1.0, 1.5], dtype=np.float64))
array([-1. , -1. , -0.5, 0.5, 1. , 1. ])
>>> clip_convert(np.array([-1.5, -1.0, -.5, .5, 1.0, 1.5], dtype=np.float32))
array([-1. , -1. , -0.5, 0.5, 1. , 1. ], dtype=float32)
>>> clip_convert(np.array([-1.5, -1.0, -.5, .5, 1.0, 1.5], dtype=np.float16))
array([-1. , -1. , -0.5, 0.5, 1. , 1. ], dtype=float16)
>>> clip_convert(np.array([-2147483648, -1073741824, 1073741824, 2147483647], dtype=np.int32))
array([-1. , -0.5, 0.5, 1. ])
>>> clip_convert(np.array([-32768, -16384, 16384, 32767], dtype=np.int16))
array([-1. , -0.49999237, 0.50002289, 1. ])
>>> clip_convert(np.array([0, 64, 192, 255], dtype=np.uint8))
array([-1. , -0.49803922, 0.50588235, 1. ])
>>>
"""
assert isinstance(audio_samples, np.ndarray), audio_samples.__class__.__name__
if issubclass(audio_samples.dtype.type, numbers.Integral):
iinfo = np.iinfo(audio_samples.dtype)
audio_samples = audio_samples.astype(np.float64)
audio_samples -= .5*np.float64(iinfo.min + iinfo.max)
audio_samples /= .5*np.float64(iinfo.max - iinfo.min)
else:
np.clip(audio_samples, -1, 1, out=audio_samples)
return audio_samples |
Partager