CoolFace
Apppublic

ACloudCenter/moonshine-tiny-STT

sourceHugging Faceapache-2.0updated 11mo agoView on Hugging Face
2likes
app.py69 linesDownload Raw Back to root
1import gradio as gr2import spaces3import torch4import soundfile as sf5import numpy as np6import librosa7import math8from transformers import MoonshineForConditionalGeneration, AutoProcessor9 10device = "cuda:0" if torch.cuda.is_available() else "cpu"11torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float3212 13model = MoonshineForConditionalGeneration.from_pretrained("UsefulSensors/moonshine-tiny").to(device).to(torch_dtype)14processor = AutoProcessor.from_pretrained("UsefulSensors/moonshine-tiny")15 16TOKENS_PER_SEC = 12.017MIN_NEW_TOKENS = 4818MAX_NEW_TOKENS_CAP = 160019 20@spaces.GPU21def transcribe_audio(audio_file):22    if not audio_file:23        return "No audio provided."24    audio_array, sr = sf.read(audio_file)25    if audio_array.ndim > 1:26        audio_array = np.mean(audio_array, axis=1)27    target_sr = processor.feature_extractor.sampling_rate28    if sr != target_sr:29        audio_array = librosa.resample(audio_array, orig_sr=sr, target_sr=target_sr)30    inputs = processor(audio_array, sampling_rate=target_sr, return_tensors="pt")31    inputs = {k: v.to(device=device, dtype=torch_dtype) for k, v in inputs.items()}32    duration_sec = len(audio_array) / float(target_sr)33    max_new_tokens = min(MAX_NEW_TOKENS_CAP, max(MIN_NEW_TOKENS, int(math.ceil(duration_sec * TOKENS_PER_SEC))))34    generated_ids = model.generate(**inputs, do_sample=False, max_new_tokens=max_new_tokens, no_repeat_ngram_size=4, repetition_penalty=1.05)35    return processor.decode(generated_ids[0], skip_special_tokens=True)36 37theme = gr.themes.Ocean(primary_hue="indigo", secondary_hue="fuchsia", neutral_hue="slate").set(button_large_radius="*radius_sm")38 39with gr.Blocks(theme=theme) as demo:40    gr.Markdown("## Moonshine Tiny STT - 27M Parameters")41    gr.HTML("""42        <div style="width: 100%; margin-bottom: 20px;">43            <img src="https://huggingface.co/spaces/ACloudCenter/moonshine-tiny-STT/resolve/main/public/images/banner.png" 44                style="width: 100%; height: auto; border-radius: 15px; box-shadow: 0 10px 40px rgba(0,0,0,0.2);"45                alt="VibeVoice Banner">46        </div>47        """)48    with gr.Tabs():49        with gr.TabItem("Upload Audio"):50            audio_file = gr.Audio(sources=["upload"], type="filepath", label="Upload Audio File")51            output_text1 = gr.Textbox(label="Transcription", placeholder="Transcription will appear here...", lines=10, autoscroll=True)52            upload_button = gr.Button("Transcribe Uploaded Audio")53            upload_button.click(fn=transcribe_audio, inputs=audio_file, outputs=output_text1)54        with gr.TabItem("Record Audio"):55            audio_mic = gr.Audio(sources=["microphone"], type="filepath", label="Record Audio")56            output_text2 = gr.Textbox(label="Transcription", placeholder="Transcription will appear here...", lines=10, autoscroll=True)57            record_button = gr.Button("Transcribe Recorded Audio")58            record_button.click(fn=transcribe_audio, inputs=audio_mic, outputs=output_text2)59    gr.Markdown("""60    ### Instructions:61    1. Choose either 'Upload Audio' or 'Record Audio' tab62    2. Upload an audio file or record using your microphone63    3. Click the respective 'Transcribe' button64    4. Wait for the transcription to appear65    """)66 67if __name__ == "__main__":68    demo.launch()69