File size: 4,257 Bytes
3c7858a
 
8d491d1
08132ae
022f864
 
d4083a0
07459bd
df2191f
d4c7a2e
df2191f
fc76259
d4fa0b1
f9abde7
cfd2660
 
f9abde7
8d491d1
 
 
4294b59
07459bd
cc1910c
29d3942
f852bda
1b5cd44
0829f56
9ad392d
df2191f
 
 
 
8f928e3
df2191f
09cbba9
fc76259
 
df2191f
30f1ebe
d4cdf1c
e30de93
df2191f
b5d3b73
6ab1a8b
 
30f1ebe
2dd3795
6ab1a8b
 
 
47ca323
b53f29f
d4cdf1c
6ab1a8b
 
807f737
9e18978
6ab1a8b
26e9fae
8f89d03
b64c6fc
ebcd408
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# from: https://gradio.app/real_time_speech_recognition/

from transformers import pipeline, WhisperProcessor, WhisperForConditionalGeneration
import torch
import gradio as gr
import librosa
import os
import time


#Loading the model and the tokenizer
token_key = os.environ.get("HUGGING_FACE_HUB_TOKEN")
print("key length:", len(token_key.strip()))

model_name = "pgilles/whisper-large-v2-lb_cased_04"
#model_name = "pgilles/whisper-large-10_Chamber" # model too bad

processor = WhisperProcessor.from_pretrained(model_name, language="lb", task="transcribe")
tokenizer = processor.tokenizer
model = WhisperForConditionalGeneration.from_pretrained(model_name, use_auth_token=token_key)
#p = pipeline("automatic-speech-recognition", model=model, tokenizer=tokenizer, feature_extractor=processor.feature_extractor, decoder=processor.decoder, use_auth_token=token_key)

pipe = pipeline("automatic-speech-recognition", model=model, tokenizer=processor.tokenizer, feature_extractor=processor.feature_extractor, device=0)
#pipe = pipeline("automatic-speech-recognition", model=model_name, device=0, use_auth_token=token_key)
#pipe.model.config.forced_decoder_ids = pipe.tokenizer.get_decoder_prompt_ids(language= "Luxembourgish", task="transcribe")
#pipe.model.config.forced_decoder_ids = None

    
def load_data(input_file):
  
  """ Function for resampling to ensure that the speech input is sampled at 16KHz.
  """
  sampling_rate = 16_000
  #read the file
  speech, sample_rate = librosa.load(input_file, sr=sampling_rate, mono=True)
  #speech = librosa.effects.trim(speech, top_db= 10)
  return speech
    
def asr_pipe(input_file, input_file_microphone, chunks):
  input_file = input_file_microphone if input_file_microphone else input_file
  transcription = pipe(input_file, chunk_length_s=chunks)["text"]
  return transcription

inputs = [gr.inputs.Audio(source="upload", type='filepath', label="Eng Audio-Datei eroplueden...", optional = True),
          gr.inputs.Audio(source="microphone", type="filepath", label="... oder direkt mam Mikro ophuelen", optional = True),
          gr.Slider(minimum=3, maximum=32, value=29, step=0.5, label="Chunk Length")
         ]

outputs = [gr.outputs.Textbox(label="Erkannten Text")]

samples = [["Chamber2022_1.wav", "Chamber2022_1.wav", 15.5], ["Chamber2022_2.wav", "Chamber2022_2.wav", 20], ["Chamber2022_3.wav", "Chamber2022_3.wav", 30], ["Erlieft-a-Verzielt.wav", "Erlieft-a-Verzielt.wav", 28.5]]

gr.Interface(fn = asr_pipe,
             inputs = inputs,
             outputs = outputs,
             title="Sproocherkennung fir d'Lëtzebuergescht @uni.lu, based on Whisper-large-v2",
             description = "Dës App convertéiert Är geschwate Sprooch an de (méi oder manner richtegen ;-)) Text!",
             examples = samples,
             examples_per_page = 10,
             article = "Beschreiwung: Dir kënnt Iech selwer iwwer de Mikro ophuelen, eng Datei eroplueden oder e Beispill auswielen. Dëse Modell ass trainéiert mam neisten Sproocherkennungsalgorithmus vun OpenAI: Whisper. Anescht wéi bei deene meeschten Applikatiounen, déi op dem Whisper baséieren, ass dëse lëtzebuergeschen zousätzlech mat enger grousser, kontrolléierter Datebasis trainéiert ginn ('fine-tuning' mat 70 Stonne Lëtzebuergesch aus verschiddene sproochleche Genren). Domat ass eng niddereg Feelerquote méiglech, déi virdrun net denkbar war. D'Grouss- a Klengschreiwung an och d'Punktuatioun gi gréisstendeels richteg ëmgesat. Am Géigesaz zum Wav2vec 2.0-Algorithmus, deen och héich Erkennungsraten huet an och op ville Sproochen trainéiert ass, ass beim Whisper fir vill Sproochen net nëmmen d'Akustik mee och den Text mattrainéiert ginn ('weak-supervised pre-training'). Domat ass net nëmmen déi allgemeng Erkennungsrat méi héich wéi beim Wav2vec 2.0, mee och méisproocheg Schwätze gëtt däitlech besser erkannt. Et kann een also z.B. tëscht Lëtzebuergescht a Franséisch (oder Däitsch, Englesch, Spuenesch, Chineesesch) hin- an hierwiesselen an de System produzéiert de richtegen Text. 't dauert ongeféier e Fënneftel bis e Véierel vun der Dauer vun der Opnam, bis d'Transkriptioun verschafft ass.",
             theme="default").launch(share=False, show_error=True)