áudio#

Aprenda como usar o Xinference para converter áudio em texto ou texto em áudio.

Introdução#

A API de Áudio oferece três métodos para interagir com áudio:

  • O terminal de transcrição converte áudio no idioma de entrada.

  • O endpoint traduz áudio para inglês.

  • O terminal de transcrição converte o áudio no idioma de entrada.

Endpoint da API

Ponto de extremidade compatível com OpenAI

API de Transcrição

/v1/audio/transcriptions

API

/v1/audio/translations

API de Voz

/v1/audio/speech

Lista de modelos compatíveis#

Em Xinference, os seguintes modelos suportam a API de áudio:

Transcrição de fala para texto#

Apenas para chips da série Mac M:

Texto para Fala (TTS)#

Modelos que suportam zero-shot (sem necessidade de áudio de referência)

Modelos que suportam clonagem de voz (requer áudio de referência)

Modelos com suporte a controle emocional

Apenas para chips da série Mac M:

Guia de início rápido#

Transcrição#

A API de Transcrição imita a create transcriptions API do OpenAI. Você pode experimentar a API de Transcrição via cURL, Cliente OpenAI ou cliente Python do 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>",
  }'

I am a strict technical documentation translator. Please provide the Simplified Chinese text for me to translate into Brazilian Portuguese.#

A API de Tradução é inspirada na create translations API da OpenAI. Você pode testar a API de Tradução usando cURL, o OpenAI Client ou o cliente Python do 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>",
  }'

voz#

A API de Transcrição imita a API create speech da OpenAI. Você pode experimentar a Speech API via cURL, OpenAI Client ou pelo cliente Python do Xinference:

A API de Fala usa, por padrão, o modo não-streaming.

  1. O streaming do ChatTTS não é tão eficaz quanto o não streaming. Referência: 2noise/ChatTTS#564

  2. 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,
  }'

Uso do ChatTTS#

Uso básico, consulte a seção Uso de áudio e fala.

Timbre fixo. Podemos usar o timbre fixo fornecido por 6drf21e/ChatTTS_Speaker, baixar o evaluation_result.csv, e usar o timbre seed_2155 como exemplo, empregando os dados da coluna 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"]

Use seed_2155 para fixar o timbre e criar a 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 do modelo CosyVoice#

O CosyVoice possui duas versões: CosyVoice 1.0 e CosyVoice 2.0. O CosyVoice 1.0 tem 3 modelos diferentes:

  • CosyVoice-300M-SFT: Se você deseja apenas converter texto em fala, escolha este modelo. Ele oferece alguns timbres pré-treinados: [‘Voz Feminina Chinesa’, ‘Voz Masculina Chinesa’, ‘Voz Masculina Japonesa’, ‘Voz Feminina Cantonense’, ‘Voz Feminina Inglesa’, ‘Voz Masculina Inglesa’, ‘Voz Feminina Coreana’]

  • CosyVoice-300M: Se você deseja clonar voz ou converter texto em fala de outro idioma, selecione este modelo. Para usá-lo, você deve fornecer um arquivo de áudio prompt_speech no formato WAV, utilizando uma taxa de amostragem de 16.000 Hz para obter melhor desempenho.

  • CosyVoice-300M-Instruct: Se você deseja controlar com precisão o tom e o timbre, escolha este modelo.

Uso básico, carregue o 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": "中文女"
  }'

Clonar voz, carregar o 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 multilíngue, carregue o 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íntese de voz baseada em instruções, carregue o 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 possui apenas um modelo, mas contém todas as capacidades dos três modelos do CosyVoice. O método de uso é o mesmo do CosyVoice.

Uso em streaming do CosyVoice 2.0, carregando o 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)

Mais instruções e exemplos podem ser encontrados em https://fun-audio-llm.github.io/.

Modelo FishSpeech#

Uso básico, consulte a seção Uso de áudio e fala.

Clone a voz, iniciando o modelo FishSpeech-1.5. Use prompt_speech em vez de reference_audio e prompt_text em vez de reference_text para fornecer o áudio de referência para o modelo FishSpeech. Esse parâmetro é consistente com a clonagem de voz do 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
)

Instruções de uso do Paraformer#

model

Detecção de Atividade de Voz (VAD)

Recuperação de pontuação (punc)

timestamp

Falante

palavra quente

paraformer-zh

Sim

Sim

Não

Não

Não

paraformer-zh-hotword

Sim

Sim

Não

Não

Sim

paraformer-zh-spk

Sim

Sim

Sim

Sim

Não

paraformer-zh-long

Sim

Sim

Sim

Sim

Não

seaco-paraformer-zh (recomendado)

Sim

Sim

Sim

Sim

Sim

  1. Uso de VAD e Pontuação

    Todos os modelos Paraformer suportam as funcionalidades de VAD e pontuação.

  2. Instruções de uso de timestamp e identificação do falante

    Apenas os seguintes modelos suportam o reconhecimento de timestamp e falante:

    • paraformer-zh-spk

    • paraformer-zh-long

    • seaco-paraformer-zh

    Dentre eles, apenas o paraformer-zh-spk tem o reconhecimento de locutor ativado por padrão.

    Se você estiver usando paraformer-zh-long ou seaco-paraformer-zh e precisar ativar a funcionalidade de reconhecimento do falante:

    • Na Web UI: adicione um parâmetro chamado spk_model com o valor cam++.

    • Na linha de comando: adicione o parâmetro --spk_model cam++

    Exemplo:

    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")
    
  3. Instruções de uso da função de palavras quentes

    Apenas os seguintes modelos suportam hotword (função de palavra-chave ativada):

    • paraformer-zh-hotword

    • seaco-paraformer-zh

    Exemplo:

    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 offline#

Agora o SenseVoiceSmall usa um pequeno modelo VAD fsmn-vad, portanto ele precisa de uma rede para download.

Em ambientes offline, você pode baixar este modelo VAD com antecedência.

Baixe do huggingface ou modelscope. Suponha que o download seja feito para /path/to/fsmn-vad.

Em seguida, ao carregar o SenseVoiceSmall com a Web UI, adicione uma opção extra: a chave é vad_model, e o valor é o caminho de download anterior /path/to/fsmn-vad. Ao carregar via linha de comando, adicione a opção --vad_model /path/to/fsmn-vad.

Modelo Kokoro em uso#

O modelo Kokoro suporta vários idiomas, sendo o inglês o padrão. Se você quiser usar um idioma não padrão, como o chinês, será necessário instalar pacotes de dependência adicionais e adicionar os parâmetros correspondentes ao iniciar o modelo.

  1. pip install misaki[zh]

  2. Inicialize o modelo usando o parâmetro lang_code=’z’. Consulte o código fonte do kokoro para ver todos os lang_code suportados. Se você iniciou o modelo pela Web UI, é necessário adicionar um parâmetro extra, onde a chave é lang_code e o valor é z. Se você iniciou o modelo pelo xinference client, consulte o código a seguir para passar o parâmetro:

    model_uid = client.launch_model(
        model_name="Kokoro-82M",
        model_type="audio",
        compile=False,
        download_hub="huggingface",
        lang_code="z",
    )
    
  3. Durante a inferência, é necessário usar uma voice que comece com ‘z’, por exemplo: zf_xiaoyi. As voices atualmente suportadas podem ser consultadas em https://huggingface.co/hexgrad/Kokoro-82M/tree/main/voices. O método de uso é o seguinte:

    input_string = "重新启动即可更新"
    response = model.speech(input_string, voice="zf_xiaoyi")
    

IndexTTS2#

O modelo IndexTTS2 suporta controle de emoções. Você pode utilizar esse recurso através de alguns parâmetros adicionais. Abaixo está a forma de uso do IndexTTS2:

  1. Tradução para português brasileiro: Áudio de referência único (clonagem 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,
    )
    
  2. Especificar o áudio de referência 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
    )
    
  3. Ao especificar um áudio de referência emocional, é possível ajustar o parâmetro emo_alpha para controlar sua influência na saída. O intervalo válido é 0.0 - 1.0, com valor padrão de 1.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
    )
    
  4. É possível omitir o áudio de referência emocional fornecendo uma lista de 8 números de ponto flutuante, especificando a intensidade de cada emoção na seguinte ordem: [alegria, raiva, tristeza, medo, nojo, melancolia, surpresa, calma]. Você também pode usar o parâmetro use_random para introduzir emoções aleatórias durante o processo de inferência; o valor padrão é False, e defini-lo como True ativa emoções aleatórias.

    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
    )
    
  5. Alternativamente, você pode ativar a funcionalidade use_emo_text para orientar a expressão emocional com base no script text fornecido. Seu script de texto será automaticamente convertido em vetores emocionais. Ao usar o modo de emoção por texto, recomenda-se definir emo_alpha em torno de 0.6 (ou menos) para obter um efeito de fala mais natural. Você pode introduzir aleatoriedade usando use_random (valor padrão: False; True ativa a aleatoriedade):

    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
    )
    
  6. Você também pode fornecer uma descrição específica de emoção textual diretamente através do parâmetro emo_text. Seu texto de emoção será automaticamente convertido em um vetor de emoção. Isso permite que você controle separadamente o roteiro de texto e a descrição da emoção textual:

    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 offline use#

IndexTTS2 requer múltiplos modelos pequenos, que são baixados automaticamente durante a inicialização. Em ambientes off-line, você pode baixar esses modelos para um único diretório e especificar o caminho desse diretório.

Método de configuração simplificado

A maneira mais simples de configurar o uso offline é usar o comando: hf download para baixar todos os modelos pequenos com antecedência.

# 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

A estrutura final do diretório deve ser a seguinte:

/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 suportados

Pequenos modelos serão mapeados automaticamente da seguinte forma:

  1. w2v-bert-2.0 (models--facebook--w2v-bert-2.0) - modelo de extração de características

  2. campplus (models--funasr--campplus) - Modelo de reconhecimento de falante

  3. bigvgan (models--nvidia--bigvgan_v2_22khz_80band_256x) - modelo de codificador de fala

  4. Semantic Codec (models--amphion--MaskGCT) - Modelo de codificação/decodificação semântica

Iniciando o IndexTTS2 no modo offline

Ao iniciar o IndexTTS2 via interface web, você pode adicionar parâmetros extras: - small_models_dir - Caminho do diretório contendo todos os modelos pequenos.

Ao iniciar pela linha de comando, você pode adicionar as seguintes opções:

xinference launch --model-name IndexTTS2 --model-type audio \
    --small_models_dir /path/to/small_models

Ao iniciar com o cliente Python:

model_uid = client.launch_model(
    model_name="IndexTTS2",
    model_type="audio",
    small_models_dir="/path/to/small_models"
)