import numpy as np import gradio as gr from bark import SAMPLE_RATE, generate_audio, preload_models from bark.generation import SUPPORTED_LANGS from share_btn import community_icon_html, loading_icon_html, share_js import spaces import torch DEBUG_MODE = False if not DEBUG_MODE: _ = preload_models() default_text = "This is a fork of Suno's Bark Spaces that allows you to supply your own voice." title = "# 🐶 Bark (with user-supplied voices)" description = """ This is a fork of Suno's [Bark Space](https://huggingface.co/spaces/suno/bark) that allows you to supply your own voice. You can use [GitMyLo's bark-voice-cloning Space](https://huggingface.co/spaces/GitMylo/bark-voice-cloning) to clone your own voice, or provide a voice file from [this Bark speaker directory](https://rsxdalv.github.io/bark-speaker-directory/), or use an alternate method to generate the same .npz format with semantic, coarse, and fine histories. Bark is a universal text-to-audio model created by [Suno](www.suno.ai), with code publicly available [here](https://github.com/suno-ai/bark). Bark can generate highly realistic, multilingual speech as well as other audio - including music, background noise and simple sound effects. This demo should be used for research purposes only. Commercial use is strictly prohibited. The model output is not censored and the authors do not endorse the opinions in the generated content. Use at your own risk. """ if torch.cuda.is_available(): device = 'cuda' device_dtype = torch.float16 xlp_kwargs['variant'] = 'fp16' else: device = 'cpu' device_dtype = torch.float32 description+=''' This Space appears to be running on a CPU; it may take over 30 minutes to get results. You may [duplicate this space](https://huggingface.co/spaces/clinteroni/bark-with-custom-voice?duplicate=true) and pay for an upgraded runtime instead. ''' article = """ ## 🌎 Foreign Language Bark supports various languages out-of-the-box and automatically determines language from input text. \ When prompted with code-switched text, Bark will even attempt to employ the native accent for the respective languages in the same voice. Try the prompt: ``` Buenos días Miguel. Tu colega piensa que tu alemán es extremadamente malo. But I suppose your english isn't terrible. ``` ## 🤭 Non-Speech Sounds Below is a list of some known non-speech sounds, but we are finding more every day. \ Please let us know if you find patterns that work particularly well on Discord! * [laughter] * [laughs] * [sighs] * [music] * [gasps] * [clears throat] * — or ... for hesitations * ♪ for song lyrics * capitalization for emphasis of a word * MAN/WOMAN: for bias towards speaker Try the prompt: ``` " [clears throat] Hello, my name is Suno. And, uh — and I like pizza. [laughs] But I also have other interests such as... ♪ singing ♪." ``` ## 🎶 Music Bark can generate all types of audio, and, in principle, doesn't see a difference between speech and music. \ Sometimes Bark chooses to generate text as music, but you can help it out by adding music notes around your lyrics. Try the prompt: ``` ♪ In the jungle, the mighty jungle, the lion barks tonight ♪ ``` ## 🧬 Voice Cloning Bark has the capability to fully clone voices - including tone, pitch, emotion and prosody. \ The model also attempts to preserve music, ambient noise, etc. from input audio. \ However, to mitigate misuse of this technology, we limit the audio history prompts to a limited set of Suno-provided, fully synthetic options to choose from. ## 👥 Speaker Prompts You can provide certain speaker prompts such as NARRATOR, MAN, WOMAN, etc. \ Please note that these are not always respected, especially if a conflicting audio history prompt is given. Try the prompt: ``` WOMAN: I would like an oatmilk latte please. MAN: Wow, that's expensive! ``` ## Details Bark model by [Suno](https://suno.ai/), including official [code](https://github.com/suno-ai/bark) and model weights. \ Gradio demo supported by 🤗 Hugging Face. Bark is licensed under a non-commercial license: CC-BY 4.0 NC, see details on [GitHub](https://github.com/suno-ai/bark). """ examples = [ ["I enjoy reading murder mysteries, long walks on the beach, sculpting mashed potatoes into the shape of a homicidal snowman, and telling you what's up.", 'examples/1.npz'], ['The space clown descended the long staircase and invaded New Jersey.', 'examples/2.npz'], ] @spaces.GPU def gen_tts(text, history_prompt): # , temp_semantic, temp_waveform): if DEBUG_MODE: audio_arr = np.zeros(SAMPLE_RATE) else: # , text_temp=temp_semantic, waveform_temp=temp_waveform) audio_arr = generate_audio(text, history_prompt=history_prompt) audio_arr = (audio_arr * 32767).astype(np.int16) return (SAMPLE_RATE, audio_arr) css = """ #share-btn-container { display: flex; padding-left: 0.5rem !important; padding-right: 0.5rem !important; background-color: #000000; justify-content: center; align-items: center; border-radius: 9999px !important; width: 13rem; margin-top: 10px; margin-left: auto; flex: unset !important; } #share-btn { all: initial; color: #ffffff; font-weight: 600; cursor: pointer; font-family: 'IBM Plex Sans', sans-serif; margin-left: 0.5rem !important; padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; right:0; } #share-btn * { all: unset !important; } #share-btn-container div:nth-child(-n+2){ width: auto !important; min-height: 0px !important; } #share-btn-container .wrap { display: none !important; } """ with gr.Blocks(css=css) as block: gr.Markdown(title) gr.Markdown(description) with gr.Row(): with gr.Column(): input_text = gr.Textbox( label="Input Text", lines=2, value=default_text, elem_id="input_text") options = gr.File(elem_id="speaker_option") run_button = gr.Button("Generate Audio") with gr.Column(): audio_out = gr.Audio(label="Generated Audio", type="numpy", elem_id="audio_out") with gr.Row(visible=False) as share_row: with gr.Group(elem_id="share-btn-container"): community_icon = gr.HTML(community_icon_html) loading_icon = gr.HTML(loading_icon_html) share_button = gr.Button( "Share to community", elem_id="share-btn") share_button.click(None, [], [], js=share_js) inputs = [input_text, options] outputs = [audio_out] gr.Examples(examples=examples, fn=gen_tts, inputs=inputs, outputs=outputs, cache_examples=True) gr.Markdown(article) run_button.click(fn=lambda: gr.update(visible=False), inputs=None, outputs=share_row, queue=False).then( fn=gen_tts, inputs=inputs, outputs=outputs, queue=True).then( fn=lambda: gr.update(visible=True), inputs=None, outputs=share_row, queue=False) block.queue() block.launch()