Spaces:
Runtime error
Runtime error
| <script lang="ts"> | |
| import { onMount } from "svelte"; | |
| import type { I18nFormatter } from "@gradio/utils"; | |
| import WaveSurfer from "wavesurfer.js"; | |
| import RecordPlugin from "wavesurfer.js/dist/plugins/record.js"; | |
| export let recording = false; | |
| export let paused_recording = false; | |
| export let stop: () => void; | |
| export let record: () => void; | |
| export let i18n: I18nFormatter; | |
| export let waveform_settings = {}; | |
| let micWaveform: WaveSurfer; | |
| let waveformRecord: RecordPlugin; | |
| onMount(() => { | |
| create_mic_waveform(); | |
| }); | |
| const create_mic_waveform = (): void => { | |
| if (micWaveform !== undefined) micWaveform.destroy(); | |
| micWaveform = WaveSurfer.create({ | |
| ...waveform_settings, | |
| height: 100, | |
| container: "#microphone" | |
| }); | |
| waveformRecord = micWaveform.registerPlugin(RecordPlugin.create()); | |
| }; | |
| </script> | |
| <div class="mic-wrap"> | |
| <div id="microphone" style:display={recording ? "block" : "none"} /> | |
| {#if recording} | |
| <button | |
| class={paused_recording ? "stop-button-paused" : "stop-button"} | |
| on:click={() => { | |
| waveformRecord.stopMic(); | |
| stop(); | |
| }} | |
| > | |
| <span class="record-icon"> | |
| <span class="pinger" /> | |
| <span class="dot" /> | |
| </span> | |
| {paused_recording ? i18n("audio.pause") : i18n("audio.stop")} | |
| </button> | |
| {:else} | |
| <button | |
| class="record-button" | |
| on:click={() => { | |
| waveformRecord.startMic(); | |
| record(); | |
| }} | |
| > | |
| <span class="record-icon"> | |
| <span class="dot" /> | |
| </span> | |
| {i18n("audio.record")} | |
| </button> | |
| {/if} | |
| </div> | |
| <style> | |
| .mic-wrap { | |
| display: block; | |
| align-items: center; | |
| margin: var(--spacing-xl); | |
| } | |
| .stop-button-paused { | |
| display: none; | |
| height: var(--size-8); | |
| width: var(--size-20); | |
| background-color: var(--block-background-fill); | |
| border-radius: var(--radius-3xl); | |
| align-items: center; | |
| border: 1px solid var(--neutral-400); | |
| margin-right: 5px; | |
| } | |
| .stop-button-paused::before { | |
| content: ""; | |
| height: var(--size-4); | |
| width: var(--size-4); | |
| border-radius: var(--radius-full); | |
| background: var(--primary-600); | |
| margin: 0 var(--spacing-xl); | |
| } | |
| .stop-button::before { | |
| content: ""; | |
| height: var(--size-4); | |
| width: var(--size-4); | |
| border-radius: var(--radius-full); | |
| background: var(--primary-600); | |
| margin: 0 var(--spacing-xl); | |
| animation: scaling 1800ms infinite; | |
| } | |
| .stop-button { | |
| height: var(--size-8); | |
| width: var(--size-20); | |
| background-color: var(--block-background-fill); | |
| border-radius: var(--radius-3xl); | |
| align-items: center; | |
| border: 1px solid var(--primary-600); | |
| margin-right: 5px; | |
| display: flex; | |
| } | |
| .record-button::before { | |
| content: ""; | |
| height: var(--size-4); | |
| width: var(--size-4); | |
| border-radius: var(--radius-full); | |
| background: var(--primary-600); | |
| margin: 0 var(--spacing-xl); | |
| } | |
| .record-button { | |
| height: var(--size-8); | |
| width: var(--size-24); | |
| background-color: var(--block-background-fill); | |
| border-radius: var(--radius-3xl); | |
| display: flex; | |
| align-items: center; | |
| border: 1px solid var(--neutral-400); | |
| } | |
| </style> | |