Bark. Generar audio texto a voz usando prompts

Vamos a ver el proyecto Bark que permite convertir de texto a voz, pero nos da capacidad de modificar ese audio con indicaciones de texto. Veamos como funciona.

Instalación

Necesitaras tener python y pip para realizar la instalación, requiere unas cuantas librerías para que todo funcione, dejo aquí todos los comandos que necesite hasta que lo hice funcionar

git clone https://github.com/suno-ai/bark
cd bark
pip install .

pip install scipy
pip install -U encodec 
pip install funcy
pip install tqdm
pip install transformers

¡Listo!

Uso

Como cualquier otro programa que convierte de texto a audio tienes que pasarle el texto. Por ejemplo:

Hola me llamo Paco y tengo de risas un rato
Me llamo Paco y me voy a por tabaco

Pero un prompt muy pobre seria si no te permitiera añadir «algo más» que solo el texto y asi es, te permite añadir «ambiente»usando diferente modificadores, por ejemplo podemos decirle que cante añadiendo ♪ o que haya risas añadiendo [laughs], por lo general estos modificares funcionan mejor para el idioma inglés, en español muchas veces se convierten en ruidos raros.

Hola me llamo Paco y tengo de risas un rato [laughs],
♪ Me llamo Paco y me voy a por tabaco ♪

Algunos modificadores que se pueden usar en el prompt:

[laughter]
[laughs]
[sighs]
[music]
[gasps]
[clears throat]
—  (pausa)
... (para una pausa)
♪ (cantar)
MAYUSCULAS (enfasis)
[MAN] (voz de hombre)
[WOMAN] (voz de mujer)
emoticonos (no tengo claro si funcionan)

Ejemplos de código

Vamos a ver como usar Bark, estos ejemplos están pensados para usar la CPU y el modelo pequeño, esto se puede configurar con las siguientes variables, poniéndolas a 0 o 1:

#Usar modelos pequeños 1 
os.environ["SUNO_USE_SMALL_MODELS"] = '1'
#1 Usar CPU 0 Usar GPU
os.environ["SUNO_OFFLOAD_CPU"] = '1'

Veamos el caso más sencillo:

import os
#Usar modelos pequeños 1 
os.environ["SUNO_USE_SMALL_MODELS"] = '1'
#1 Usar CPU 0 Usar GPU
os.environ["SUNO_OFFLOAD_CPU"] = '1'

from bark import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav

#descargar modelos
preload_models()

text_prompt = """
     Hola me llamo Paco y tengo de risas un rato
     ♪ Me llamo Paco y me voy a por tabaco ♪ 
"""
audio_array = generate_audio(text_prompt)

# guardar audio
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)

El problema de este ejemplo es que elige automáticamente la voz que considera adecuada, ahora veremos con elegirla nosotros, es tan simple como pasar el nombre de la voz en el parámetro history_prompt al llamar a la función generate_audio. Para saber que voces podemos elegir puedes mirar aquí.

Veamos un ejemplo de código:

import os
#Usar modelos pequeños 1 
os.environ["SUNO_USE_SMALL_MODELS"] = '1'
#1 Usar CPU 0 Usar GPU
os.environ["SUNO_OFFLOAD_CPU"] = '1'

from bark import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav

#descargar modelos
preload_models()

text_prompt = """
     Hola me llamo Paco y tengo de risas un rato
     ♪ Me llamo Paco y me voy a por tabaco ♪ 
"""
audio_array = generate_audio(text_prompt, history_prompt="v2/es_speaker_1")

# guardar audio
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)

Uno de los limites de Bark es que puede generar audios de unos 13 segundo de duración. Ese problema se puede resolver creando varios resultados para luego concatenarlos. En el siguiente ejemplo usaremos dos voces y añadiremos un silencio entre ellas, el truco aquí es generar varios arrays y concatenarlos:

import os
#Usar modelos pequeños 1 
os.environ["SUNO_USE_SMALL_MODELS"] = '1'
#1 Usar CPU 0 Usar GPU
os.environ["SUNO_OFFLOAD_CPU"] = '1'

from bark import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav

import numpy as np

#descargar modelos
preload_models()

#primera voz
text_prompt1 = """
     Hola me llamo Paco y tengo de risas un rato
     ♪ Me llamo Paco y me voy a por tabaco ♪ 
"""
audio_array1 = generate_audio(text_prompt1, history_prompt="v2/es_speaker_1")

#crear silencio
silence = np.zeros(int(0.5 * SAMPLE_RATE)) 

#segunda voz
text_prompt2 = """
     Hola me llamo SUSANA... 😦 y todo me sale rana
"""
audio_array2 = generate_audio(text_prompt2, history_prompt="v2/es_speaker_8")
audio_array = np.concatenate([audio_array1, silence.copy(), audio_array2])

# guardar audio
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)

Puede ver todo estos ejemplos funcionando en el siguiente vídeo de mi canal de Youtube:

Haz click para ver el vídeo en mi canal de Youtube