ACloudCenter/moonshine-tiny-STT
2
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 