adf0d17497
publish / version_or_publish (push) Has been cancelled
storybook-build / changes (push) Has been cancelled
storybook-build / :storybook-build (push) Has been cancelled
Sync Gradio Skills to Hugging Face / sync-skills (push) Has been cancelled
functional / changes (push) Has been cancelled
functional / build-frontend (push) Has been cancelled
functional / functional-test-SSR=false (push) Has been cancelled
functional / functional-reload (push) Has been cancelled
js / changes (push) Has been cancelled
js / js-test (push) Has been cancelled
docs-build / changes (push) Has been cancelled
docs-build / docs-build (push) Has been cancelled
docs-build / website-build (push) Has been cancelled
functional / functional-test-SSR=true (push) Has been cancelled
hygiene / hygiene-test (push) Has been cancelled
python / changes (push) Has been cancelled
python / build (push) Has been cancelled
python / test-ubuntu-latest-flaky (push) Has been cancelled
python / test-ubuntu-latest-not-flaky (push) Has been cancelled
python / test-windows-latest-flaky (push) Has been cancelled
python / test-windows-latest-not-flaky (push) Has been cancelled
53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
from math import log2, pow
|
|
|
|
import numpy as np
|
|
from scipy.fftpack import fft # ty: ignore[unresolved-import]
|
|
|
|
import gradio as gr
|
|
from gradio.media import get_audio
|
|
|
|
A4 = 440
|
|
C0 = A4 * pow(2, -4.75)
|
|
name = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]
|
|
|
|
def get_pitch(freq):
|
|
h = round(12 * log2(freq / C0))
|
|
n = h % 12
|
|
return name[n]
|
|
|
|
def main_note(audio):
|
|
rate, y = audio
|
|
if len(y.shape) == 2:
|
|
y = y.T[0]
|
|
N = len(y)
|
|
T = 1.0 / rate
|
|
yf = fft(y)
|
|
yf2 = 2.0 / N * np.abs(yf[0 : N // 2])
|
|
xf = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)
|
|
|
|
volume_per_pitch = {}
|
|
total_volume = np.sum(yf2)
|
|
for freq, volume in zip(xf, yf2):
|
|
if freq == 0:
|
|
continue
|
|
pitch = get_pitch(freq)
|
|
if pitch not in volume_per_pitch:
|
|
volume_per_pitch[pitch] = 0
|
|
volume_per_pitch[pitch] += 1.0 * volume / total_volume
|
|
volume_per_pitch = {k: float(v) for k, v in volume_per_pitch.items()}
|
|
return volume_per_pitch
|
|
|
|
demo = gr.Interface(
|
|
main_note,
|
|
gr.Audio(sources=["microphone"]),
|
|
gr.Label(num_top_classes=4),
|
|
examples=[
|
|
[get_audio("recording1.wav")],
|
|
[get_audio("cantina.wav")],
|
|
],
|
|
api_name="predict"
|
|
)
|
|
|
|
if __name__ == "__main__":
|
|
demo.launch()
|