Spaces:
Build error
Build error
import base64 | |
import io | |
from typing import List, Tuple | |
import numpy as np | |
import soundfile | |
from scipy.signal import resample | |
class ConnectBase64WavesException(Exception): | |
def __init__(self, message: str): | |
self.message = message | |
def decode_base64_waves(waves: List[str]) -> List[Tuple[np.ndarray, int]]: | |
""" | |
base64エンコードされた複数のwavデータをデコードする | |
Parameters | |
---------- | |
waves: list[str] | |
base64エンコードされたwavデータのリスト | |
Returns | |
------- | |
waves_nparray_sr: List[Tuple[np.ndarray, int]] | |
(NumPy配列の音声波形データ, サンプリングレート) 形式のタプルのリスト | |
""" | |
if len(waves) == 0: | |
raise ConnectBase64WavesException("wavファイルが含まれていません") | |
waves_nparray_sr = [] | |
for wave in waves: | |
try: | |
wav_bin = base64.standard_b64decode(wave) | |
except ValueError: | |
raise ConnectBase64WavesException("base64デコードに失敗しました") | |
try: | |
_data = soundfile.read(io.BytesIO(wav_bin)) | |
except Exception: | |
raise ConnectBase64WavesException("wavファイルを読み込めませんでした") | |
waves_nparray_sr.append(_data) | |
return waves_nparray_sr | |
def connect_base64_waves(waves: List[str]) -> Tuple[np.ndarray, int]: | |
waves_nparray_sr = decode_base64_waves(waves) | |
max_sampling_rate = max([sr for _, sr in waves_nparray_sr]) | |
max_channels = max([x.ndim for x, _ in waves_nparray_sr]) | |
assert 0 < max_channels <= 2 | |
waves_nparray_list = [] | |
for nparray, sr in waves_nparray_sr: | |
if sr != max_sampling_rate: | |
nparray = resample(nparray, max_sampling_rate * len(nparray) // sr) | |
if nparray.ndim < max_channels: | |
nparray = np.array([nparray, nparray]).T | |
waves_nparray_list.append(nparray) | |
return np.concatenate(waves_nparray_list), max_sampling_rate | |