audio#
Impara come utilizzare Xinference per convertire audio in testo o testo in audio.
Introduzione#
L’API Audio offre tre metodi per interagire con l’audio:
Il terminale di trascrizione trascrive l’audio nella lingua di input.
Traduci l’audio in inglese utilizzando l’endpoint.
Il terminale di trascrizione converte l’audio nella lingua di input.
Punto finale API |
Endpoint compatibile con OpenAI |
|---|---|
API di trascrizione |
/v1/audio/transcriptions |
API |
/v1/audio/translations |
API vocale |
/v1/audio/speech |
Elenco dei modelli supportati#
In Xinference, i seguenti modelli supportano l’API audio:
Trascrizione vocale#
Solo per chip della serie Mac M:
Sintesi vocale (TTS)#
Modelli che supportano zero-shot (senza necessità di audio di riferimento)
MeloTTS series
Modelli che supportano la clonazione vocale (richiedono un audio di riferimento)
Modello con supporto al controllo emotivo
Solo per chip della serie Mac M:
Guida rapida#
Trascrizione#
L’API di trascrizione imita l”API create transcriptions di OpenAI. Puoi provare l’API di trascrizione tramite cURL, il client OpenAI o il client Python di 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 you would like me to translate into Italian.#
L’API di Traduzione imita l”API di creazione traduzioni di OpenAI. Puoi provare a utilizzare l’API di Traduzione tramite cURL, OpenAI Client o il client Python di 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?"
}
Voce#
L’API di Trascrizione replica la create speech API di OpenAI. Puoi provare l’API Speech tramite cURL, il Client OpenAI o il client Python di Xinference.
Le API di Speech utilizzano la modalità non streaming per impostazione predefinita.
L’output in streaming di ChatTTS non è efficace quanto quello non in streaming, riferimento: 2noise/ChatTTS#564
Requisiti per lo 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 è utilizzato.#
Uso base, fare riferimento alla sezione Uso vocale.
Timbro fisso. Possiamo utilizzare il timbro fisso fornito da 6drf21e/ChatTTS_Speaker, scaricare evaluation_result.csv , prendendo come esempio il timbro seed_2155, utilizziamo i dati della colonna 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 per fissare il timbro vocale e creare la voce.
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>
)
Modello CosyVoice in uso#
CosyVoice ha due versioni: CosyVoice 1.0 e CosyVoice 2.0. CosyVoice 1.0 ha 3 modelli diversi:
CosyVoice-300M-SFT: Scegli questo modello se vuoi semplicemente convertire testo in audio. Sono disponibili voci pre-addestrate: [“中文女”, “中文男”, “日语男”, “粤语女”, “英文女”, “英文男”, “韩语女”]
CosyVoice-300M: Se desideri clonare una voce o convertire un testo in parlato di un’altra lingua, scegli questo modello. Per utilizzarlo, devi fornire un file audio in formato WAV
prompt_speech, utilizza una frequenza di campionamento di 16.000 Hz per ottenere prestazioni migliori.CosyVoice-300M-Instruct: Se desideri controllare con precisione il tono e il timbro della voce, scegli questo modello.
Uso base, caricare il modello 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 voce, carica il modello 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,
)
Utilizzo multilingue, carica il modello 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,
)
Basato sulla sintesi vocale basata su comandi, carica il modello 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 ha un solo modello, ma racchiude tutte le capacità dei tre modelli di CosyVoice. Le modalità d’uso sono le stesse di CosyVoice.
CosyVoice 2.0 utilizzo in streaming, caricamento del modello 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)
Per ulteriori istruzioni ed esempi, fare riferimento a https://fun-audio-llm.github.io/.
Modello FishSpeech in uso#
Uso base, fare riferimento alla sezione Uso vocale.
Clona la voce, avvia il modello FishSpeech-1.5. Utilizza prompt_speech invece di reference_audio e prompt_text invece di reference_text per fornire l’audio di riferimento al modello FishSpeech. Questo parametro è coerente con la clonazione vocale di 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
)
Istruzioni per l’uso di Paraformer#
model |
Rilevamento dell’attività vocale (VAD) |
Punteggiatura (punc) |
timestamp |
Parlante |
Hot words |
|---|---|---|---|---|---|
Sì |
Sì |
No |
No |
No |
|
Sì |
Sì |
No |
No |
Sì |
|
Sì |
Sì |
Sì |
Sì |
No |
|
Sì |
Sì |
Sì |
Sì |
No |
|
seaco-paraformer-zh (consigliato) |
Sì |
Sì |
Sì |
Sì |
Sì |
Uso di VAD e punteggiatura
Tutti i modelli Paraformer supportano le funzionalità VAD e di punteggiatura.
Istruzioni per l’uso dei timestamp e del riconoscimento del parlante
Solo i seguenti modelli supportano il riconoscimento di timestamp e parlante:
paraformer-zh-spk
paraformer-zh-long
seaco-paraformer-zh
Tra questi, solo paraformer-zh-spk abilita per default la funzione di riconoscimento del parlante.
Se stai utilizzando paraformer-zh-long o seaco-paraformer-zh e devi abilitare la funzione di riconoscimento del parlante:
Nell’interfaccia Web: aggiungi un parametro chiamato
spk_modelcon valorecam++.Sulla riga di comando: aggiungere il parametro
--spk_model cam++
Esempio:
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")
Istruzioni per l’uso della funzionalità parole calde
Solo i seguenti modelli supportano hotword (funzione di parole chiave):
paraformer-zh-hotword
seaco-paraformer-zh
Esempio:
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="小艾 魔搭")
SoloSenseVoiceSmall#
Ora SenseVoiceSmall utilizza un piccolo modello VAD fsmn-vad, pertanto necessita di una rete per il download.
Per gli ambienti offline, puoi scaricare in anticipo questo modello VAD.
Scarica da huggingface o modelscope. Supponi di aver scaricato in /path/to/fsmn-vad.
Poi, quando si carica SenseVoiceSmall con Web UI, aggiungere un’opzione extra, la chiave è vad_model, il valore è il percorso di download precedente /path/to/fsmn-vad. Quando si carica con la riga di comando, aggiungere l’opzione --vad_model /path/to/fsmn-vad.
Modello Kokoro utilizzato#
Il modello Kokoro supporta più lingue, di default è in inglese. Se si desidera utilizzare una lingua non predefinita, ad esempio il cinese, è necessario installare pacchetti di dipendenze aggiuntivi e aggiungere i parametri corrispondenti all’avvio del modello.
pip install misaki[zh]
Inizializza il modello con il parametro lang_code=”z”. Puoi consultare il codice sorgente di kokoro per vedere tutti i lang_code supportati. Se hai avviato il modello tramite l’Interfaccia Web, devi aggiungere un parametro aggiuntivo: la chiave è
lang_codee il valore èz. Se hai avviato il modello tramite il client xinference, puoi passare il parametro facendo riferimento al seguente codice:model_uid = client.launch_model( model_name="Kokoro-82M", model_type="audio", compile=False, download_hub="huggingface", lang_code="z", )
Durante l’inferenza, è necessario utilizzare una voce che inizia con “z”, ad esempio:
zf_xiaoyi. Per le voci attualmente supportate, fare riferimento a https://huggingface.co/hexgrad/Kokoro-82M/tree/main/voices. Il metodo di utilizzo è il seguente:input_string = "重新启动即可更新" response = model.speech(input_string, voice="zf_xiaoyi")
IndexTTS2 uso#
Il modello IndexTTS2 supporta il controllo delle emozioni. Puoi utilizzare questa funzione aggiungendo alcuni parametri extra. Di seguito è riportato il metodo di utilizzo di IndexTTS2:
Referenza audio singola (clonazione timbrica):
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, )
Specificare il riferimento audio per le emozioni:
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 )
Quando si specifica un riferimento audio per l’emozione, è possibile impostare il parametro
emo_alphaper regolare il suo grado di influenza sull’output. Il range valido è0.0 - 1.0, con un valore predefinito di1.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 )
Puoi omettere l’audio di riferimento per le emozioni e fornire invece una lista di 8 numeri in virgola mobile, che specifica l’intensità di ciascuna emozione nel seguente ordine:
[felicità, rabbia, tristezza, paura, disgusto, malinconia, sorpresa, calma]. Puoi anche utilizzare il parametrouse_randomper introdurre emozioni casuali durante l’inferenza; il valore predefinito èFalse, impostalo suTrueper abilitare le emozioni casuali.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 )
In alternativa, è possibile abilitare la funzione
use_emo_textper guidare l’espressione emotiva in base allo scripttextfornito. Il vostro script testuale verrà automaticamente convertito in un vettore emotivo. Quando si utilizza la modalità emotiva testuale, si consiglia di impostareemo_alphasu circa 0,6 (o inferiore) per ottenere un effetto vocale più naturale. È possibile introdurre casualità tramiteuse_random(valore predefinito:False;Trueabilita la casualità).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 )
Puoi anche fornire una descrizione testuale specifica dell’emozione tramite il parametro
emo_text. Il testo della tua emozione verrà automaticamente convertito in un vettore emotivo. Questo ti permette di controllare separatamente lo script testuale e la descrizione testuale dell’emozione: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#
IndexTTS2 richiede diversi modelli di piccole dimensioni, che vengono scaricati automaticamente durante il processo di inizializzazione. In un ambiente offline, è possibile scaricare questi modelli in una singola directory e specificare il percorso di tale directory.
Metodo di configurazione semplice
Il metodo più semplice per configurare l’uso offline è utilizzare il comando hf download per scaricare in anticipo tutti i modelli piccoli.
# 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 struttura delle directory finale dovrebbe apparire come segue:
/path/to/small_models/
├── w2v-bert-2.0/ # Feature extraction model
├── campplus/ # Speaker recognition model
├── bigvgan/ # Vocoder model
└── MaskGCT/ # Semantic codec model
Elenco dei modelli supportati
I modelli di piccole dimensioni saranno automaticamente mappati nel modo seguente:
w2v-bert-2.0 (
models--facebook--w2v-bert-2.0) - Modello di estrazione delle caratteristichecampplus (
models--funasr--campplus) - Modello di riconoscimento del parlantebigvgan (
models--nvidia--bigvgan_v2_22khz_80band_256x) - modello encoder vocaleDecodificatore semantico (
models--amphion--MaskGCT) - Modello di codifica/decodifica semantica
Avviare IndexTTS2 in modalità offline
All’avvio di IndexTTS2 tramite Web UI, è possibile aggiungere parametri aggiuntivi: - small_models_dir - percorso della directory contenente tutti i modelli di piccole dimensioni.
Quando si avvia tramite riga di comando, è possibile aggiungere le seguenti opzioni:
xinference launch --model-name IndexTTS2 --model-type audio \
--small_models_dir /path/to/small_models
Usando il client Python all’avvio:
model_uid = client.launch_model(
model_name="IndexTTS2",
model_type="audio",
small_models_dir="/path/to/small_models"
)