á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)
MeloTTS series
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>",
}'
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."
}
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>",
}'
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#
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.
O streaming do ChatTTS não é tão eficaz quanto o não streaming. Referência: 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.
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_speechno 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": "中文女"
}'
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)
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 |
|---|---|---|---|---|---|
Sim |
Sim |
Não |
Não |
Não |
|
Sim |
Sim |
Não |
Não |
Sim |
|
Sim |
Sim |
Sim |
Sim |
Não |
|
Sim |
Sim |
Sim |
Sim |
Não |
|
seaco-paraformer-zh (recomendado) |
Sim |
Sim |
Sim |
Sim |
Sim |
Uso de VAD e Pontuação
Todos os modelos Paraformer suportam as funcionalidades de VAD e pontuação.
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_modelcom o valorcam++.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")
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.
pip install misaki[zh]
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_codee 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", )
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:
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, )
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 )
Ao especificar um áudio de referência emocional, é possível ajustar o parâmetro
emo_alphapara controlar sua influência na saída. O intervalo válido é0.0 - 1.0, com valor padrão 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 )
É 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âmetrouse_randompara introduzir emoções aleatórias durante o processo de inferência; o valor padrão éFalse, e defini-lo comoTrueativa 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 )
Alternativamente, você pode ativar a funcionalidade
use_emo_textpara orientar a expressão emocional com base no scripttextfornecido. Seu script de texto será automaticamente convertido em vetores emocionais. Ao usar o modo de emoção por texto, recomenda-se definiremo_alphaem torno de 0.6 (ou menos) para obter um efeito de fala mais natural. Você pode introduzir aleatoriedade usandouse_random(valor padrão:False;Trueativa 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 )
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:
w2v-bert-2.0 (
models--facebook--w2v-bert-2.0) - modelo de extração de característicascampplus (
models--funasr--campplus) - Modelo de reconhecimento de falantebigvgan (
models--nvidia--bigvgan_v2_22khz_80band_256x) - modelo de codificador de falaSemantic 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"
)