| |
| |
| |
| |
| @@ -373,36 +373,24 @@ def make_video(tensor, fps): |
| |
| def audio(tag, tensor, sample_rate=44100): |
| tensor = make_np(tensor) |
| - tensor = tensor.squeeze() |
| if abs(tensor).max() > 1: |
| print('warning: audio amplitude out of range, auto clipped.') |
| tensor = tensor.clip(-1, 1) |
| - assert(tensor.ndim == 1), 'input tensor should be 1 dimensional.' |
| - |
| - tensor_list = [int(32767.0 * x) for x in tensor] |
| + assert(tensor.ndim == 2), 'input tensor should be 2 dimensional.' |
| + length_frames, num_channels = tensor.shape |
| + assert num_channels == 1 or num_channels == 2, f'Expected 1/2 channels, got {num_channels}' |
| + import soundfile |
| import io |
| - import wave |
| - import struct |
| - fio = io.BytesIO() |
| - Wave_write = wave.open(fio, 'wb') |
| - Wave_write.setnchannels(1) |
| - Wave_write.setsampwidth(2) |
| - Wave_write.setframerate(sample_rate) |
| - tensor_enc = b'' |
| - tensor_enc += struct.pack("<" + "h" * len(tensor_list), *tensor_list) |
| - |
| - Wave_write.writeframes(tensor_enc) |
| - Wave_write.close() |
| - audio_string = fio.getvalue() |
| - fio.close() |
| + with io.BytesIO() as fio: |
| + soundfile.write(fio, tensor, samplerate=sample_rate, format='wav') |
| + audio_string = fio.getvalue() |
| audio = Summary.Audio(sample_rate=sample_rate, |
| - num_channels=1, |
| - length_frames=len(tensor_list), |
| + num_channels=num_channels, |
| + length_frames=length_frames, |
| encoded_audio_string=audio_string, |
| content_type='audio/wav') |
| return Summary(value=[Summary.Value(tag=tag, audio=audio)]) |
| |
| - |
| def custom_scalars(layout): |
| categoriesnames = layout.keys() |
| categories = [] |
| |
| |
| |
| |
| @@ -716,7 +716,7 @@ class SummaryWriter(object): |
| sample_rate (int): sample rate in Hz |
| walltime (float): Optional override default walltime (time.time()) of event |
| Shape: |
| - snd_tensor: :math:`(1, L)`. The values should lie between [-1, 1]. |
| + snd_tensor: :math:`(L, c)`. The values should lie between [-1, 1]. |
| """ |
| if self._check_caffe2_blob(snd_tensor): |
| snd_tensor = workspace.FetchBlob(snd_tensor) |
|
|