audio#
Aprende a usar Xinference para convertir audio a texto o texto a audio.
Introducción#
La API de Audio proporciona tres métodos para interactuar con el audio:
El terminal de transcripción transcribe el audio al idioma de entrada.
El punto final traduce audio a inglés.
El terminal de transcripción transcribe el audio al idioma de entrada.
API endpoint |
Punto final compatible con OpenAI |
|---|---|
API de Transcripción |
/v1/audio/transcriptions |
API |
/v1/audio/translations |
API de Voz |
/v1/audio/speech |
Lista de modelos compatibles#
En Xinference, los siguientes modelos admiten la API de audio:
Transcripción de voz a texto#
Solo para los chips de la serie Mac M:
texto a voz (TTS)#
Modelos compatibles con zero-shot (sin necesidad de audio de referencia)
MeloTTS series
Modelos que admiten clonación de voz (se requiere audio de referencia)
Modelos que soportan control emocional
Solo para los chips de la serie Mac M:
Guía de inicio rápido#
Transcripción#
La API de Transcripción imita la API de transcripciones de OpenAI. Puedes probar la API de Transcripción mediante cURL, el Cliente de OpenAI o el cliente Python de Xinference:
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/transcriptions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "<MODEL_UID>",
"file": "<audio bytes>",
}'
import openai
client = openai.Client(
api_key="cannot be empty",
base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1"
)
with open("speech.mp3", "rb") as audio_file:
client.audio.transcriptions.create(
model=<MODEL_UID>,
file=audio_file,
)
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
with open("speech.mp3", "rb") as audio_file:
model.transcriptions(audio=audio_file.read())
{
"text": "Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger. This is a place where you can get to do that."
}
Translate the following Simplified Chinese text into Spanish: [User’s original text would go here]#
La API de traducción imita la API de traducciones create translations API de OpenAI. Puedes probar la API de traducción mediante cURL, el Cliente OpenAI o el cliente Python de Xinference:
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/translations' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "<MODEL_UID>",
"file": "<audio bytes>",
}'
import openai
client = openai.Client(
api_key="cannot be empty",
base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1"
)
with open("speech.mp3", "rb") as audio_file:
client.audio.translations.create(
model=<MODEL_UID>,
file=audio_file,
)
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
with open("speech.mp3", "rb") as audio_file:
model.translations(audio=audio_file.read())
{
"text": "Hello, my name is Wolfgang and I come from Germany. Where are you heading today?"
}
voz#
La API de Transcription imita la create speech API de OpenAI. Puedes probar la API de Speech mediante cURL, el Cliente de OpenAI o el cliente Python de Xinference.
La API de voz utiliza por defecto el modo no streaming.
La salida en streaming de ChatTTS no es tan efectiva como la salida no streaming, referencia: 2noise/ChatTTS#564
Requisitos de streaming ffmpeg<7: https://pytorch.org/audio/stable/installation.html#optional-dependencies
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/speech' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "<MODEL_UID>",
"input": "<The text to generate audio for>",
"voice": "echo",
"stream": True,
}'
import openai
client = openai.Client(
api_key="cannot be empty",
base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1"
)
client.audio.speech.create(
model=<MODEL_UID>,
input=<The text to generate audio for>,
voice="echo",
)
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
model.speech(
input=<The text to generate audio for>,
voice="echo",
stream: True,
)
The output will be an audio binary.
ChatTTS use#
Uso básico, consulte el capítulo de uso de voz.
Timbre fijo. Podemos usar el timbre fijo proporcionado por 6drf21e/ChatTTS_Speaker, descargar evaluation_result.csv , tomando como ejemplo el timbre seed_2155, utilizamos los datos de la columna emb_data.
import pandas as pd
df = pd.read_csv("evaluation_results.csv")
emb_data_2155 = df[df['seed_id'] == 'seed_2155'].iloc[0]["emb_data"]
Usa seed_2155 para fijar el timbre y crear la voz.
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
resp_bytes = model.speech(
voice=emb_data_2155,
input=<The text to generate audio for>
)
Uso del modelo CosyVoice#
CosyVoice tiene dos versiones: CosyVoice 1.0 y CosyVoice 2.0. CosyVoice 1.0 cuenta con 3 modelos diferentes:
CosyVoice-300M-SFT: Elige este modelo si solo quieres convertir texto a audio. Hay voces preentrenadas disponibles: [中文女], [中文男], [日语男], [粤语女], [英文女], [英文男], [韩语女].
CosyVoice-300M: Si deseas clonar una voz o convertir texto en habla de otro idioma, selecciona este modelo. Para usar este modelo, debes proporcionar un archivo de audio
prompt_speechen formato WAV. Utiliza una frecuencia de muestreo de 16,000 Hz para obtener un mejor rendimiento.CosyVoice-300M-Instruct: Si deseas controlar con precisión el tono y el timbre, elige este modelo.
Uso básico, cargar el modelo CosyVoice-300M-SFT.
curl -X 'POST' \
'http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1/audio/speech' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"model": "<MODEL_UID>",
"input": "<The text to generate audio for>",
# ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女']
"voice": "中文女"
}'
import openai
client = openai.Client(
api_key="cannot be empty",
base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1"
)
response = client.audio.speech.create(
model=<MODEL_UID>,
input=<The text to generate audio for>,
# ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女']
voice="中文女",
)
response.stream_to_file('1.mp3')
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
speech_bytes = model.speech(
input=<The text to generate audio for>,
# ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女']
voice="中文女"
)
with open('1.mp3', 'wb') as f:
f.write(speech_bytes)
Clona la voz, carga el modelo CosyVoice-300M.
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
zero_shot_prompt_text = ("<the words in the text exactly match "
"the audio file of the zero-shot prompt>")
# The words said in the audio file should be identical
# to zero_shot_prompt_text.
#
# The audio input file must be in WAV format.
# For optimal performance, use a 16,000 Hz sample rate.
#
# Files with different sample rates will be resampled to 16,000 Hz,
# which may increase processing time.
with open(zero_shot_prompt_file, "rb") as f:
zero_shot_prompt = f.read()
speech_bytes = model.speech(
"<The text to generate audio for>",
prompt_text=zero_shot_prompt_text,
prompt_speech=zero_shot_prompt,
)
Uso multilingüe, carga el modelo CosyVoice-300M.
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
# The audio input file must be in WAV format.
# For optimal performance, use a 16,000 Hz sample rate.
#
# Files with different sample rates will be resampled to 16,000 Hz,
# which may increase processing time.
with open(cross_lingual_prompt_file, "rb") as f:
cross_lingual_prompt = f.read()
speech_bytes = model.speech(
"<The text to generate audio for>", # text could be another language
prompt_speech=cross_lingual_prompt,
)
Síntesis de voz basada en instrucciones, carga el modelo CosyVoice-300M-Instruct.
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
response = model.speech(
"在面对挑战时,他展现了非凡的<strong>勇气</strong>与<strong>智慧</strong>。",
voice="中文男",
instruct_text="Theo 'Crimson', is a fiery, passionate rebel leader. "
"Fights with fervor for justice, but struggles with impulsiveness.",
)
CosyVoice 2.0 solo tiene un modelo, pero contiene todas las capacidades de los tres modelos de CosyVoice. El método de uso es el mismo que el de CosyVoice.
Uso en streaming de CosyVoice 2.0, cargando el modelo CosyVoice2-0.5B.
# Launch model
from xinference.client import Client
model_uid = client.launch_model(
model_name=model_name,
model_type="audio",
download_hub="modelscope",
)
endpoint = "http://127.0.0.1:9997"
input_string = "你好,我是通义生成式语音大模型,请问有什么可以帮您的吗?"
# Stream request by openai client
import openai
import tempfile
openai_client = openai.Client(api_key="not empty", base_url=f"{endpoint}/v1")
# ['中文女', '中文男', '日语男', '粤语女', '英文女', '英文男', '韩语女']
response = openai_client.audio.speech.with_streaming_response.create(
model=model_uid, input=input_string, voice="英文女"
)
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f:
response.stream_to_file(f.name)
assert os.stat(f.name).st_size > 0
# Stream request by xinference client
response = model.speech(input_string, stream=True)
assert inspect.isgenerator(response)
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as f:
for chunk in response:
f.write(chunk)
Para más instrucciones y ejemplos, consulte https://fun-audio-llm.github.io/ .
Modelo FishSpeech en uso#
Uso básico, consulte el capítulo de uso de voz.
Clonar voz, iniciar el modelo FishSpeech-1.5. Utilice prompt_speech en lugar de reference_audio y prompt_text en lugar de reference_text para proporcionar audio de referencia al modelo FishSpeech. Este parámetro es consistente con la clonación de voz de CosyVoice.
from xinference.client import Client
client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>")
model = client.get_model("<MODEL_UID>")
# The reference audio file is the voice file
# the words said in the file should be identical to reference_text
with open(reference_audio_file, "rb") as f:
reference_audio = f.read()
reference_text = "" # text in the audio
speech_bytes = model.speech(
"<The text to generate audio for>",
prompt_speech=reference_audio,
prompt_text=reference_text
)
Instrucciones de uso de Paraformer#
model |
Detección de actividad de voz (VAD) |
Reconstrucción de puntuación (punc) |
timestamp |
orador |
palabra caliente |
|---|---|---|---|---|---|
Sí |
Sí |
No |
No |
No |
|
Sí |
Sí |
No |
No |
Sí |
|
Sí |
Sí |
Sí |
Sí |
No |
|
Sí |
Sí |
Sí |
Sí |
No |
|
seaco-paraformer-zh (recomendado) |
Sí |
Sí |
Sí |
Sí |
Sí |
Uso de VAD y signos de puntuación
Todos los modelos de Paraformer admiten funciones de VAD y puntuación.
Instrucciones de uso de marcas de tiempo e identificación del hablante
Solo los siguientes modelos admiten el reconocimiento de marca de tiempo y hablante:
paraformer-zh-spk
paraformer-zh-long
seaco-paraformer-zh
Entre ellos, solo paraformer-zh-spk tiene habilitada la función de reconocimiento de hablante de forma predeterminada.
Si usas paraformer-zh-long o seaco-paraformer-zh y necesitas habilitar la función de reconocimiento de hablantes:
En la interfaz web: agregue el parámetro llamado
spk_modelcon el valorcam++.En la línea de comandos: añada el parámetro
--spk_model cam++
Ejemplo:
from xinference.client import Client client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") model = client.get_model("seaco-paraformer-zh") with open("asr_example.wav", "rb") as audio_file: audio = audio_file.read() model.transcriptions(audio, response_format="verbose_json")
Instrucciones de uso de la función de palabras clave
Solo los siguientes modelos admiten hotword (función de palabra clave):
paraformer-zh-hotword
seaco-paraformer-zh
Ejemplo:
from xinference.client import Client client = Client("http://<XINFERENCE_HOST>:<XINFERENCE_PORT>") model = client.get_model("seaco-paraformer-zh") with open("asr_example.wav", "rb") as audio_file: audio = audio_file.read() model.transcriptions(audio, hotword="小艾 魔搭")
SenseVoiceSmall sin conexión#
Ahora SenseVoiceSmall utiliza un pequeño modelo VAD fsmn-vad, por lo que necesita la red para descargarlo.
Para entornos fuera de línea, puedes descargar este modelo VAD con anticipación.
Descárguelo desde huggingface o modelscope. Suponga que la descarga se realiza en /path/to/fsmn-vad.
Luego, al cargar SenseVoiceSmall con la Web UI, agregue una opción adicional, cuya clave es vad_model y cuyo valor es la ruta de descarga anterior /path/to/fsmn-vad. Al cargar con la línea de comandos, agregue la opción --vad_model /path/to/fsmn-vad.
El modelo Kokoro utiliza#
El modelo Kokoro admite múltiples idiomas, siendo el inglés el predeterminado. Si deseas usar un idioma no predeterminado, como el chino, necesitas instalar paquetes de dependencias adicionales y agregar los parámetros correspondientes al iniciar el modelo.
pip install misaki[zh]
Inicializa el modelo con el parámetro lang_code=”z”. Puedes consultar el código fuente de kokoro para ver todos los lang_code admitidos. Si iniciaste el modelo a través de la interfaz web, necesitas agregar un parámetro adicional, donde la clave es
lang_codey el valor esz. Si iniciaste el modelo a través del cliente xinference, puedes consultar el siguiente código para pasar el parámetro:model_uid = client.launch_model( model_name="Kokoro-82M", model_type="audio", compile=False, download_hub="huggingface", lang_code="z", )
Al inferir, se debe usar una voz que comience con “z”, por ejemplo:
zf_xiaoyi. Las voces actualmente compatibles se pueden consultar en https://huggingface.co/hexgrad/Kokoro-82M/tree/main/voices. El método de uso es el siguiente:input_string = "重新启动即可更新" response = model.speech(input_string, voice="zf_xiaoyi")
IndexTTS2 usage#
El modelo IndexTTS2 admite control emocional. Puede utilizar esta función mediante algunos parámetros adicionales. El siguiente es el método de uso de IndexTTS2:
Audio de referencia única (clonación de timbre):
from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() response = model.speech( input="Translate for me, what is a surprise!", prompt_speech=test_prompt_speech, )
Especificar el audio de referencia emocional:
from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() with open("example/emo_sad.wav", "rb") as f: emo_prompt_speech = f.read() response = model.speech( input="It's such a shame the singer didn't make it to the finals.", prompt_speech=test_prompt_speech, emo_audio_prompt=emo_prompt_speech )
Al especificar un audio de referencia emocional, se puede configurar el parámetro
emo_alphapara ajustar su nivel de influencia en la salida. El rango válido es0.0 - 1.0, con un valor predeterminado de1.0(100%).from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() with open("example/emo_sad.wav", "rb") as f: emo_prompt_speech = f.read() response = model.speech( input="It's such a shame the singer didn't make it to the finals.", prompt_speech=test_prompt_speech, emo_audio_prompt=emo_prompt_speech, emo_alpha=0.9 )
Puede omitir el audio de referencia de emociones y, en su lugar, proporcionar una lista de 8 números de punto flotante que especifique la intensidad de cada emoción en el siguiente orden:
[felicidad, ira, tristeza, miedo, asco, melancolía, sorpresa, calma]. También puede usar el parámetrouse_randompara introducir emociones aleatorias durante la inferencia; el valor predeterminado esFalse, y configurarlo comoTruehabilita las emociones aleatorias.from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() response = model.speech( input="Wow, I'm so lucky!", prompt_speech=test_prompt_speech, emo_vector=[0, 0, 0, 0, 0, 0, 0.45, 0], use_random=False )
Alternativamente, puede habilitar la función
use_emo_textpara guiar la expresión emocional según el scripttextque proporcione. Su script de texto se convertirá automáticamente en vectores emocionales. Al usar el modo de emoción de texto, se recomienda estableceremo_alphaalrededor de 0.6 (o menos) para obtener un efecto de voz más natural. Puede introducir aleatoriedad medianteuse_random(valor predeterminado:False;Truepara habilitar aleatoriedad):from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() response = model.speech( input="Quick, hide! He's coming! He's coming to get us!", prompt_speech=test_prompt_speech, emo_alpha=0.6, use_emo_text=True, use_random=False )
También puede proporcionar directamente una descripción textual de la emoción específica a través del parámetro
emo_text. Su texto emocional se convertirá automáticamente en un vector de emoción. Esto le permite controlar por separado el guion de texto y la descripción textual de la emoción:from xinference.client import Client client = Client("http://0.0.0.0:6735") model = client.get_model("IndexTTS2") with open("../mp3_test_voice.mp3", "rb") as f: test_prompt_speech = f.read() response = model.speech( input="Quick, hide! He's coming! He's coming to get us!", prompt_speech=test_prompt_speech, emo_alpha=0.6, use_emo_text=True, emo_text="You scared the hell out of me! Are you a ghost?", use_random=False )
IndexTTS2 uso sin conexión#
IndexTTS2 requiere varios modelos pequeños, que se descargan automáticamente durante el proceso de inicialización. En un entorno fuera de línea, puede descargar estos modelos en un único directorio y especificar la ruta de dicho directorio.
Método de configuración simple
La forma más sencilla de configurar el uso sin conexión es usar el comando hf download para descargar todos los modelos pequeños con anticipación.
# Create your local models directory
mkdir -p /path/to/small_models
# Download models from Hugging Face
hf download facebook/w2v-bert-2.0 --local-dir /path/to/small_models/w2v-bert-2.0
hf download funasr/campplus --local-dir /path/to/small_models/campplus
hf download nvidia/bigvgan_v2_22khz_80band_256x --local-dir /path/to/small_models/bigvgan
hf download amphion/MaskGCT --local-dir /path/to/small_models/MaskGCT
La estructura final del directorio debería verse de la siguiente manera:
/path/to/small_models/
├── w2v-bert-2.0/ # Feature extraction model
├── campplus/ # Speaker recognition model
├── bigvgan/ # Vocoder model
└── MaskGCT/ # Semantic codec model
Lista de modelos compatibles
Los modelos pequeños se asignarán automáticamente de la siguiente manera:
w2v-bert-2.0 (
models--facebook--w2v-bert-2.0) - modelo de extracción de característicascampplus (
models--funasr--campplus) - Modelo de reconocimiento de locutorbigvgan (
models--nvidia--bigvgan_v2_22khz_80band_256x) - modelo de codificador de vozCodificador/decodificador semántico (
models--amphion--MaskGCT) - Modelo de codificación/decodificación semántica
Inicie IndexTTS2 en modo fuera de línea
Al iniciar IndexTTS2 a través de la interfaz web, se puede agregar un parámetro adicional: - small_models_dir - ruta del directorio que contiene todos los modelos pequeños.
Al iniciar desde la línea de comandos, puede agregar las siguientes opciones:
xinference launch --model-name IndexTTS2 --model-type audio \
--small_models_dir /path/to/small_models
Al iniciar con el cliente Python:
model_uid = client.launch_model(
model_name="IndexTTS2",
model_type="audio",
small_models_dir="/path/to/small_models"
)