File size: 6,813 Bytes
590e824
 
d6ea04b
 
 
d7e32f5
8db5cd4
 
d7e32f5
d6ea04b
db2559b
 
590e824
d6ea04b
 
 
 
 
 
 
590e824
 
1b7f7aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
590e824
d6ea04b
d7e32f5
1b7f7aa
8db5cd4
 
 
 
1b7f7aa
 
 
 
 
 
8db5cd4
 
 
 
 
 
1b7f7aa
8db5cd4
 
 
 
1b7f7aa
8db5cd4
3ac1c11
1b7f7aa
 
8db5cd4
1b7f7aa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d7e32f5
 
 
 
 
 
 
 
8db5cd4
d7e32f5
8db5cd4
 
 
 
 
d6ea04b
1b7f7aa
 
a710bbe
1b7f7aa
d6ea04b
a710bbe
0dade2f
a710bbe
3ac1c11
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import gradio as gr
from transformers import pipeline
import scipy
import torchaudio
from speechbrain.pretrained import SepformerSeparation as separator
from shialifube import transliterate
import tempfile
import os

# Chargement des modèles Whisper pour la transcription
model_roman = pipeline("automatic-speech-recognition", model="nairaxo/whisper-shikomori-latin")
model_arabic = pipeline("automatic-speech-recognition", model="nairaxo/whisper-shikomori-arabic")

# Chargement du modèle Text-to-Speech
model_id = "nairaxo/mms-tts-zdj"
synthesiser = pipeline("text-to-speech", model_id, device=0)

# Chargement du modèle d'amélioration audio
model_enh = separator.from_hparams(source="speechbrain/sepformer-wham16k-enhancement", savedir='pretrained_models/sepformer-wham16k-enhancement')

# Fonction de transcription avec sélection du modèle
def transcribe(audio, model_choice):
    try:
        # Vérifier si l'audio est valide
        if audio is None:
            return "Erreur : Aucun fichier audio n'a été fourni."

        # Transcrire l'audio
        if model_choice == "Modèle en alphabet latin":
            transcription = model_roman(audio)["text"]
        else:
            transcription = model_arabic(audio)["text"]

        return transcription

    except Exception as e:
        return f"Erreur lors de la transcription : {str(e)}"

# Fonction de génération et d'amélioration audio
def generate_and_enhance_audio(text, script_choice):
    try:
        # Vérifier si le texte est vide
        if not text.strip():
            return None, None, "Erreur : Le texte d'entrée est vide."

        # Translittérer le texte si l'utilisateur a choisi l'arabe
        if script_choice == "Alphabet arabe":
            text = transliterate(text)  # Translittération de l'arabe en latin

        # Synthétiser la parole (audio original)
        speech = synthesiser(text)
        sampling_rate = speech["sampling_rate"]

        # Créer des fichiers temporaires pour l'audio original et amélioré
        with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as original_file:
            original_output = original_file.name
            scipy.io.wavfile.write(original_output, rate=sampling_rate, data=speech["audio"][0])

        with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as enhanced_file:
            enhanced_output = enhanced_file.name
            est_sources = model_enh.separate_file(path=original_output)
            torchaudio.save(enhanced_output, est_sources[:, :, 0].detach().cpu(), sampling_rate)

        # Retourner les fichiers audio au format attendu par Gradio
        return original_output, enhanced_output, None

    except Exception as e:
        return None, None, f"Erreur lors de la génération ou de l'amélioration de l'audio : {str(e)}"

# Interface pour la transcription via microphone
with gr.Blocks() as mf_transcribe:
    gr.Markdown("## Transcription Audio en Shikomori (Microphone)")
    gr.Markdown("<p style='color: #555;'>Sélectionnez une méthode et un modèle pour transcrire l'audio en langue Shikomori. Ce service (en version bêta) prend en charge les transcriptions en alphabet latin et arabe (système Kamar-Eddine). Les modèles ont été entraîné sur la base de données construites à partir d'un algorithme d'alignement forcé. Pour une bonne expérience et afin de mieux transcrire vos audios, assurez-vous de prononcer clairement les mots et d'être dans un environnement ayant peu de bruits.</p>")
    with gr.Row():
        audio_input = gr.Audio(sources=["microphone"], type="filepath", label="🎤 Entrée Audio (Microphone)")
        model_choice = gr.Radio(choices=["Modèle en alphabet latin", "Modèle en alphabet arabe"], label="Sélection du modèle de transcription", value="Modèle en alphabet latin")
    transcription_output = gr.Textbox(label="📄 Transcription en Shikomori", lines=5, max_lines=10)
    transcribe_button = gr.Button("Transcrire")
    transcribe_button.click(fn=transcribe, inputs=[audio_input, model_choice], outputs=transcription_output)

# Interface pour la transcription via fichier audio
with gr.Blocks() as file_transcribe:
    gr.Markdown("## Transcription Audio en Shikomori (Fichier)")
    gr.Markdown("<p style='color: #555;'>Chargez un fichier audio et sélectionnez une méthode et un modèle pour transcrire l'audio en langue Shikomori. Ce service (en version bêta) prend en charge les transcriptions en alphabet latin et arabe (système Kamar-Eddine). Les modèles ont été entraîné sur la base de données construites à partir d'un algorithme d'alignement forcé. Pour une bonne expérience et afin de mieux transcrire vos audios, assurez-vous de prononcer clairement les mots et d'être dans un environnement ayant peu de bruits.</p>")
    with gr.Row():
        audio_input = gr.Audio(type="filepath", label="📂 Entrée Audio (Fichier)")
        model_choice = gr.Radio(choices=["Modèle en alphabet latin", "Modèle en alphabet arabe"], label="Sélection du modèle de transcription", value="Modèle en alphabet latin")
    transcription_output = gr.Textbox(label="📄 Transcription en Shikomori", lines=5, max_lines=10)
    transcribe_button = gr.Button("Transcrire")
    transcribe_button.click(fn=transcribe, inputs=[audio_input, model_choice], outputs=transcription_output)

# Interface pour la synthèse et amélioration audio
with gr.Blocks() as tts_interface:
    gr.Markdown("## 🎙️ Synthèse et amélioration de la parole")
    gr.Markdown("<p style='color: #555;'>Entrez du texte pour générer de la parole en Shikomori. Si le texte est en alphabet arabe, il sera automatiquement translittéré en alphabet latin avant la synthèse. L'audio original et l'audio amélioré seront affichés côte à côte.</p>")
    with gr.Row():
        text_input = gr.Textbox(label="Entrez votre texte", lines=3, placeholder="Écrivez ici...")
        script_choice = gr.Radio(choices=["Alphabet latin", "Alphabet arabe"], label="Sélection du script d'entrée", value="Alphabet latin")
    with gr.Row():
        original_audio = gr.Audio(label="Audio original", type="filepath")
        enhanced_audio = gr.Audio(label="Audio amélioré", type="filepath")
    error_output = gr.Textbox(label="Erreur", visible=False)
    generate_button = gr.Button("Générer l'audio")
    generate_button.click(
        fn=generate_and_enhance_audio,
        inputs=[text_input, script_choice],
        outputs=[original_audio, enhanced_audio, error_output]
    )

# Interface principale avec onglets
with gr.Blocks() as demo:
    gr.TabbedInterface(
        [mf_transcribe, file_transcribe, tts_interface],
        ["🔊 Microphone", "📁 Fichier Audio", "🎙️ Text-to-Speech"]
    )

# Lancement de l'application
demo.launch(share=True, debug=True)