|
import tempfile |
|
import typing |
|
import zipfile |
|
from pathlib import Path |
|
|
|
import markdown2 as md |
|
import matplotlib.pyplot as plt |
|
import torch |
|
from IPython.display import HTML |
|
|
|
|
|
def audio_table( |
|
audio_dict: dict, |
|
first_column: str = None, |
|
format_fn: typing.Callable = None, |
|
**kwargs, |
|
): |
|
"""Embeds an audio table into HTML, or as the output cell |
|
in a notebook. |
|
|
|
Parameters |
|
---------- |
|
audio_dict : dict |
|
Dictionary of data to embed. |
|
first_column : str, optional |
|
The label for the first column of the table, by default None |
|
format_fn : typing.Callable, optional |
|
How to format the data, by default None |
|
|
|
Returns |
|
------- |
|
str |
|
Table as a string |
|
|
|
Examples |
|
-------- |
|
|
|
>>> audio_dict = {} |
|
>>> for i in range(signal_batch.batch_size): |
|
>>> audio_dict[i] = { |
|
>>> "input": signal_batch[i], |
|
>>> "output": output_batch[i] |
|
>>> } |
|
>>> audiotools.post.audio_zip(audio_dict) |
|
|
|
""" |
|
from audiotools import AudioSignal |
|
|
|
output = [] |
|
columns = None |
|
|
|
def _default_format_fn(label, x, **kwargs): |
|
if torch.is_tensor(x): |
|
x = x.tolist() |
|
|
|
if x is None: |
|
return "." |
|
elif isinstance(x, AudioSignal): |
|
return x.embed(display=False, return_html=True, **kwargs) |
|
else: |
|
return str(x) |
|
|
|
if format_fn is None: |
|
format_fn = _default_format_fn |
|
|
|
if first_column is None: |
|
first_column = "." |
|
|
|
for k, v in audio_dict.items(): |
|
if not isinstance(v, dict): |
|
v = {"Audio": v} |
|
|
|
v_keys = list(v.keys()) |
|
if columns is None: |
|
columns = [first_column] + v_keys |
|
output.append(" | ".join(columns)) |
|
|
|
layout = "|---" + len(v_keys) * "|:-:" |
|
output.append(layout) |
|
|
|
formatted_audio = [] |
|
for col in columns[1:]: |
|
formatted_audio.append(format_fn(col, v[col], **kwargs)) |
|
|
|
row = f"| {k} | " |
|
row += " | ".join(formatted_audio) |
|
output.append(row) |
|
|
|
output = "\n" + "\n".join(output) |
|
return output |
|
|
|
|
|
def in_notebook(): |
|
"""Determines if code is running in a notebook. |
|
|
|
Returns |
|
------- |
|
bool |
|
Whether or not this is running in a notebook. |
|
""" |
|
try: |
|
from IPython import get_ipython |
|
|
|
if "IPKernelApp" not in get_ipython().config: |
|
return False |
|
except ImportError: |
|
return False |
|
except AttributeError: |
|
return False |
|
return True |
|
|
|
|
|
def disp(obj, **kwargs): |
|
"""Displays an object, depending on if its in a notebook |
|
or not. |
|
|
|
Parameters |
|
---------- |
|
obj : typing.Any |
|
Any object to display. |
|
|
|
""" |
|
from audiotools import AudioSignal |
|
|
|
IN_NOTEBOOK = in_notebook() |
|
|
|
if isinstance(obj, AudioSignal): |
|
audio_elem = obj.embed(display=False, return_html=True) |
|
if IN_NOTEBOOK: |
|
return HTML(audio_elem) |
|
else: |
|
print(audio_elem) |
|
if isinstance(obj, dict): |
|
table = audio_table(obj, **kwargs) |
|
if IN_NOTEBOOK: |
|
return HTML(md.markdown(table, extras=["tables"])) |
|
else: |
|
print(table) |
|
if isinstance(obj, plt.Figure): |
|
plt.show() |
|
|