File size: 6,524 Bytes
33d9042
 
a68da21
33d9042
a68da21
33d9042
a68da21
 
e8d0c6b
33d9042
c4d7f81
85d5a02
c4d7f81
33d9042
c4d7f81
 
 
 
67dbfa2
c4b4e50
33d9042
 
94d2571
 
a68da21
 
 
 
 
 
 
94d2571
d29782d
c4d7f81
f7b03d4
 
 
 
 
 
 
 
c4d7f81
540a7bb
a68da21
 
 
 
 
 
 
 
 
 
 
 
 
 
c4d7f81
 
4c8a999
a68da21
4c8a999
a68da21
4743f10
a68da21
 
 
 
c4d7f81
33d9042
 
a68da21
 
 
 
 
 
 
a479a3f
a68da21
 
 
 
 
 
 
 
94d2571
a68da21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import spaces
import gradio as gr
import io
import os
import re
import torch
import torchaudio
from pathlib import Path
from whisperspeech.pipeline import Pipeline

title = """# ๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ Welcome to๐ŸŒŸCollabora๐ŸŒฌ๏ธ๐Ÿ’ฌ๐Ÿ“WhisperSpeech

You can use this ZeroGPU Space to test out the current model [๐ŸŒฌ๏ธ๐Ÿ’ฌ๐Ÿ“collabora/whisperspeech](https://huggingface.co/collabora/whisperspeech). ๐ŸŒฌ๏ธ๐Ÿ’ฌ๐Ÿ“collabora/whisperspeech is An Open Source text-to-speech system built by inverting Whisper. Install it and use your command line interface locally with `pip install whisperspeech`. It's like Stable Diffusion but for speech โ€“ both powerful and easily customizable : so you can use it programmatically in your own pipelines! [Contribute to whisperspeech here](https://github.com/collabora/WhisperSpeech) 
You can also use ๐ŸŒฌ๏ธ๐Ÿ’ฌ๐Ÿ“WhisperSpeech by cloning this space. ๐Ÿงฌ๐Ÿ”ฌ๐Ÿ” Simply click here: <a style="display:inline-block" href="https://huggingface.co/spaces/Tonic/laion-whisper?duplicate=true"><img src="https://img.shields.io/badge/-Duplicate%20Space-blue?labelColor=white&style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAP5JREFUOE+lk7FqAkEURY+ltunEgFXS2sZGIbXfEPdLlnxJyDdYB62sbbUKpLbVNhyYFzbrrA74YJlh9r079973psed0cvUD4A+4HoCjsA85X0Dfn/RBLBgBDxnQPfAEJgBY+A9gALA4tcbamSzS4xq4FOQAJgCDwV2CPKV8tZAJcAjMMkUe1vX+U+SMhfAJEHasQIWmXNN3abzDwHUrgcRGmYcgKe0bxrblHEB4E/pndMazNpSZGcsZdBlYJcEL9Afo75molJyM2FxmPgmgPqlWNLGfwZGG6UiyEvLzHYDmoPkDDiNm9JR9uboiONcBXrpY1qmgs21x1QwyZcpvxt9NS09PlsPAAAAAElFTkSuQmCC&logoWidth=14" alt="Duplicate Space"></a></h3> 

We're **celebrating the release of the whisperspeech** at [the LAION community, if you love open source ai learn more here : https://laion.ai/](https://laion.ai/) big thanks to the folks at huggingface for the community grant ๐Ÿค—

### How to Use
Input text with tahe language identifiers provided to create a multilingual speech. Optionally you can add an audiosample to make a voice print.Scroll down and try the api <3 Gradio.
This space runs on ZeroGPU, so **you need to be patient** while you acquire the GPU and load the model the first time you make a request !
"""


text_examples = [
    ["This is the first demo of Whisper Speech, a fully open source text-to-speech model trained by Collabora and Lion on the Juwels supercomputer.", None],
    ["World War II or the Second World War was a global conflict that lasted from 1939 to 1945. The vast majority of the world's countries, including all the great powers, fought as part of two opposing military alliances: the Allies and the Axis.", "https://upload.wikimedia.org/wikipedia/commons/7/75/Winston_Churchill_-_Be_Ye_Men_of_Valour.ogg"],
    ["<pl>To jest pierwszy test wielojฤ™zycznego <en>Whisper Speech <pl>, modelu zamieniajฤ…cego tekst na mowฤ™, ktรณry Collabora i Laion nauczyli na superkomputerze <en>Jewels.", None],
    ["<en> WhisperSpeech is an Open Source library that helps you convert text to speech. <pl>Teraz takลผe po Polsku! <en>I think I just tried saying \"now also in Polish\", don't judge me...", None],
    # ["<de> WhisperSpeech is multi-lingual <es> y puede cambiar de idioma <hi> เคฎเคงเฅเคฏ เคตเคพเค•เฅเคฏ เคฎเฅ‡เค‚"],
    ["<pl>To jest pierwszy test naszego modelu. Pozdrawiamy serdecznie.", None],
    # ["<en> The big difference between Europe <fr> et les Etats Unis <pl> jest to, ลผe mamy tak wiele jฤ™zykรณw <uk> ั‚ัƒั‚, ะฒ ะ„ะฒั€ะพะฟั–"]
]

def parse_multilingual_text(input_text):
    pattern = r"(?:<(\w+)>)|([^<]+)"
    cur_lang = 'en'
    segments = []
    for i, (lang, txt) in enumerate(re.findall(pattern, input_text)):
        if lang: cur_lang = lang
        else: segments.append((cur_lang, f"  {txt}  ")) # add spaces to give it some time to switch languages
    if not segments: return [("en", "")]
    return segments

@spaces.GPU(enable_queue=True)
def generate_audio(pipe, segments, speaker, speaker_url, cps=14):
    if isinstance(speaker, (str, Path)): speaker = pipe.extract_spk_emb(speaker)
    elif speaker_url: speaker = pipe.extract_spk_emb(speaker_url)
    else: speaker = pipe.default_speaker
    langs, texts = [list(x) for x in zip(*segments)]
    print(texts, langs)
    stoks = pipe.t2s.generate(texts, cps=cps, lang=langs)[0]
    atoks = pipe.s2a.generate(stoks, speaker.unsqueeze(0))
    audio = pipe.vocoder.decode(atoks)
    return audio.cpu()

def whisper_speech_demo(multilingual_text, speaker_audio, speaker_url, cps):
    if len(multilingual_text) == 0:
        raise gr.Error("Please enter some text for me to speak!")

    segments = parse_multilingual_text(multilingual_text)

    audio = generate_audio(pipe, segments, speaker_audio, speaker_url, cps)

    return (24000, audio.T.numpy())

    # Did not work for me in Safari:
    # mp3 = io.BytesIO()
    # torchaudio.save(mp3, audio, 24000, format='mp3')
    # return mp3.getvalue()

with gr.Blocks() as demo:
    gr.Markdown(title)
    with gr.Row(equal_height=True):
        with gr.Column(scale=2):
            text_input = gr.Textbox(label="Enter multilingual text๐Ÿ’ฌ๐Ÿ“",
                                    value=text_examples[0][0],
                                    info="You can use `<en>` for English and `<pl>` for Polish, see examples below.")
            cps = gr.Slider(value=14, minimum=10, maximum=15, step=.25,
                            label="Tempo (in characters per second)")
            speaker_input = gr.Audio(label="Upload or Record Speaker Audio (optional)๐ŸŒฌ๏ธ๐Ÿ’ฌ", 
                                     sources=["upload", "microphone"],
                                     type='filepath')
            gr.Markdown("  \n  ") # fixes the bottom overflow from Audio
            url_input = gr.Textbox(label="alternatively, you can paste in an audio file URL:")
            generate_button = gr.Button("Try Collabora's WhisperSpeech๐ŸŒŸ")
        with gr.Column(scale=1):
            output_audio = gr.Audio(label="WhisperSpeech saysโ€ฆ")

    with gr.Row():
        gr.Examples(
            examples=text_examples,
            inputs=[text_input, url_input],
            outputs=[output_audio],
            fn=whisper_speech_demo,
            cache_examples=False,
            label="Try these to get started !๐ŸŒŸ๐ŸŒฌ๏ธ"
        )

    generate_button.click(whisper_speech_demo, inputs=[text_input, speaker_input, url_input, cps], outputs=output_audio)

pipe = Pipeline()#torch_compile=True)
pipe.generate("WhisperSpeech warmup")

demo.launch(server_port=3000)#, share=True)