audio#
Apprenez à utiliser Xinference pour convertir l’audio en texte ou le texte en audio.
Introduction#
L’API Audio propose trois méthodes pour interagir avec l’audio :
Le terminal de transcription convertit l’audio en texte dans la langue d’entrée.
Traduire le point de terminaison pour convertir l’audio en anglais.
Le terminal de transcription convertit l’audio en langage d’entrée.
Point de terminaison API |
Point de terminaison compatible OpenAI |
|---|---|
API de transcription |
/v1/audio/transcriptions |
API |
/v1/audio/translations |
API vocal |
/v1/audio/speech |
Liste des modèles pris en charge#
Dans Xinference, les modèles suivants prennent en charge l’API audio :
Transcription vocale en texte#
Exclusivement pour les puces Mac de la série M :
Synthèse vocale (TTS)#
Modèles prenant en charge le zero-shot (sans audio de référence)
MeloTTS series
Modèles prenant en charge le clonage vocal (nécessite un fichier audio de référence)
Modèle prenant en charge le contrôle des émotions
Exclusivement pour les puces Mac de la série M :
Démarrage rapide#
Transcription#
L’API de transcription imite l”API de création de transcriptions d’OpenAI. Vous pouvez essayer l’API de transcription via cURL, le client OpenAI ou le client 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."
}
I am a strict technical documentation translator. Translate the given Simplified Chinese text into French. ABSOLUTE RULES: 1. Output ONLY the translation, nothing else. No explanations, no apologies. 2. Keep ALL Markdown syntax, reStructuredText directives, code blocks, URLs, and variable names unchanged. 3. If the input is a model name, identifier, or pure code string, output it verbatim. 4. Do not add any extra sentences or commentary.#
L’API de traduction imite le create translations API d’OpenAI. Vous pouvez essayer d’utiliser l’API de traduction via cURL, le client OpenAI ou le client 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?"
}
voix#
L’API de transcription imite l’API create speech API d’OpenAI. Vous pouvez essayer l’API Speech via cURL, le client OpenAI ou le client Python de Xinference :
L’API Speech utilise par défaut le mode non-streaming.
La sortie en streaming de ChatTTS n’est pas aussi efficace que la sortie non-streaming. Référence : 2noise/ChatTTS#564
Exigences 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 utilise#
Utilisation de base, voir la section sur l’utilisation vocale.
Timbre fixe. Nous pouvons utiliser le timbre fixe fourni par 6drf21e/ChatTTS_Speaker, télécharger evaluation_result.csv , en prenant le timbre seed_2155 comme exemple, nous utilisons les données de la colonne 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"]
Utilisez seed_2155 pour fixer le timbre vocal et créer la voix.
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>
)
Modèle CosyVoice#
CosyVoice a deux versions : CosyVoice 1.0 et CosyVoice 2.0. CosyVoice 1.0 dispose de 3 modèles différents :
CosyVoice-300M-SFT: Choisissez ce modèle si vous souhaitez simplement convertir du texte en audio. Des voix pré-entraînées sont disponibles : [“中文女”, “中文男”, “日语男”, “粤语女”, “英文女”, “英文男”, “韩语女”]
CosyVoice-300M : Si vous souhaitez cloner une voix ou convertir du texte en parole dans une autre langue, choisissez ce modèle. Pour utiliser ce modèle, vous devez fournir un fichier audio
prompt_speechau format WAV, en utilisant un taux d’échantillonnage de 16 000 Hz pour de meilleures performances.CosyVoice-300M-Instruct : Si vous souhaitez contrôler précisément le ton et le timbre, choisissez ce modèle.
Utilisation de base, chargement du modèle 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)
Clone la voix, charge le modèle 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,
)
Utilisation multilingue, chargement du modèle 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,
)
Synthèse vocale basée sur les instructions, chargement du modèle 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 ne contient qu’un seul modèle, mais il intègre toutes les capacités des trois modèles CosyVoice. Son utilisation est identique à celle de CosyVoice.
Utilisation en streaming de CosyVoice 2.0, chargement du modèle 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)
Pour plus d’instructions et d’exemples, veuillez consulter https://fun-audio-llm.github.io/ .
Modèle FishSpeech#
Utilisation de base, voir la section sur l’utilisation vocale.
Cloner la voix, lancer le modèle FishSpeech-1.5. Veuillez utiliser prompt_speech au lieu de reference_audio ainsi que prompt_text au lieu de reference_text pour fournir l’audio de référence au modèle FishSpeech. Ce paramètre est cohérent avec le clonage vocal 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
)
Instructions d’utilisation de Paraformer#
model |
Détection d’activité vocale (VAD) |
Restitution de la ponctuation (punc) |
horodatage |
Locuteur |
hotword |
|---|---|---|---|---|---|
Oui |
Oui |
non |
non |
non |
|
Oui |
Oui |
non |
non |
Oui |
|
Oui |
Oui |
Oui |
Oui |
non |
|
Oui |
Oui |
Oui |
Oui |
non |
|
seaco-paraformer-zh (recommandé) |
Oui |
Oui |
Oui |
Oui |
Oui |
Utilisation de la VAD et des signes de ponctuation
Tous les modèles Paraformer prennent en charge les fonctionnalités VAD et de ponctuation.
Instructions d’utilisation de l’horodatage et de l’identification du locuteur
Seuls les modèles suivants prennent en charge la reconnaissance de timestamp et locuteur :
paraformer-zh-spk
paraformer-zh-long
seaco-paraformer-zh
Parmi eux, seule la fonction de reconnaissance du locuteur est activée par défaut pour paraformer-zh-spk.
Si vous utilisez paraformer-zh-long ou seaco-paraformer-zh et devez activer la fonction de reconnaissance du locuteur :
Dans l’interface Web : ajoutez un paramètre nommé
spk_modelavec la valeurcam++.Dans la ligne de commande : ajoutez le paramètre
--spk_model cam++
Spécimen :
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")
Instructions d’utilisation de la fonctionnalité de mots-clés
Seuls les modèles suivants prennent en charge hotword (fonction de mot clé) :
paraformer-zh-hotword
seaco-paraformer-zh
Spécimen :
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="小艾 魔搭")
Utilisation hors ligne de SenseVoiceSmall#
Désormais, SenseVoiceSmall utilise un petit modèle VAD fsmn-vad, ce qui nécessite un réseau pour le téléchargement.
Pour un environnement hors ligne, vous pouvez télécharger ce modèle VAD à l’avance.
Téléchargez depuis huggingface ou modelscope. Supposez que le téléchargement se fait dans /path/to/fsmn-vad.
Ensuite, lors du chargement de SenseVoiceSmall avec l’interface Web UI, ajoutez une option supplémentaire, dont la clé est vad_model et la valeur est le chemin de téléchargement précédent /path/to/fsmn-vad. Lors du chargement en ligne de commande, ajoutez l’option --vad_model /path/to/fsmn-vad.
Modèle Kokoro utilisé#
Le modèle Kokoro prend en charge plusieurs langues, par défaut c’est l’anglais. Si vous souhaitez utiliser une langue non par défaut, comme le chinois, vous devez installer des dépendances supplémentaires et ajouter les paramètres correspondants lors du démarrage du modèle.
pip install misaki[zh]
Initialisez le modèle avec le paramètre lang_code=”z”. Vous pouvez consulter le code source de kokoro pour voir tous les lang_code pris en charge. Si vous démarrez le modèle via l’interface Web UI, vous devez ajouter un paramètre supplémentaire, avec la clé
lang_codeet la valeurz. Si vous démarrez le modèle via le client xinference, vous pouvez transmettre les paramètres en vous référant au code suivant :model_uid = client.launch_model( model_name="Kokoro-82M", model_type="audio", compile=False, download_hub="huggingface", lang_code="z", )
Lors de l’inférence, il est nécessaire d’utiliser une voix commençant par “z”, par exemple :
zf_xiaoyi. Les voix actuellement prises en charge peuvent être consultées sur https://huggingface.co/hexgrad/Kokoro-82M/tree/main/voices. La méthode d’utilisation est la suivante :input_string = "重新启动即可更新" response = model.speech(input_string, voice="zf_xiaoyi")
IndexTTS2 utilise#
Le modèle IndexTTS2 prend en charge le contrôle des émotions, et vous pouvez utiliser cette fonctionnalité en ajoutant quelques paramètres supplémentaires. Voici comment utiliser IndexTTS2 :
Audio de référence unique (clonage de voix) :
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, )
Spécifier l’audio de référence émotionnelle :
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 )
Lors de la définition d’un fichier audio de référence émotionnelle, vous pouvez choisir de régler le paramètre
emo_alphapour ajuster son degré d’influence sur la sortie. La plage valide est0.0 - 1.0, avec une valeur par défaut 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 )
Vous pouvez omettre la référence audio émotionnelle et fournir à la place une liste de 8 nombres à virgule flottante, spécifiant l’intensité de chaque émotion dans l’ordre suivant :
[joie, colère, tristesse, peur, dégoût, mélancolie, surprise, calme]. Vous pouvez également utiliser le paramètreuse_randompour introduire des émotions aléatoires lors de l’inférence ; la valeur par défaut estFalse, réglez-la surTruepour activer les émotions aléatoires.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 )
Vous pouvez également activer la fonction
use_emo_textpour guider l’expression émotionnelle en fonction du scripttextfourni. Votre script textuel sera automatiquement converti en vecteurs émotionnels. Lors de l’utilisation du mode émotionnel textuel, il est recommandé de définiremo_alphaautour de 0,6 (ou moins) pour un rendu vocal plus naturel. Vous pouvez introduire de l’aléatoire viause_random(valeur par défaut :False;Trueactive l’aléatoire) :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 )
Vous pouvez également fournir directement une description textuelle d’émotion spécifique via le paramètre
emo_text. Votre texte émotionnel sera automatiquement converti en vecteur émotionnel. Cela vous permet de contrôler séparément le script textuel et la description textuelle de l’émotion :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 hors ligne#
IndexTTS2 nécessite plusieurs petits modèles, qui seront automatiquement téléchargés lors de l’initialisation. Dans un environnement hors ligne, vous pouvez télécharger ces modèles dans un seul répertoire et spécifier le chemin de ce répertoire.
Méthode de configuration simple
La méthode la plus simple pour configurer une utilisation hors ligne est d’utiliser la commande hf download pour télécharger tous les petits modèles à l’avance.
# 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 structure de répertoire finale devrait ressembler à ceci :
/path/to/small_models/
├── w2v-bert-2.0/ # Feature extraction model
├── campplus/ # Speaker recognition model
├── bigvgan/ # Vocoder model
└── MaskGCT/ # Semantic codec model
Liste des modèles supportés
Les petits modèles seront automatiquement mappés comme suit :
w2v-bert-2.0 (
models--facebook--w2v-bert-2.0) - Modèle d’extraction de caractéristiquescampplus (
models--funasr--campplus) - modèle de reconnaissance du locuteurbigvgan (
models--nvidia--bigvgan_v2_22khz_80band_256x) - modèle d’encodeur vocalCodec sémantique (
models--amphion--MaskGCT) - Modèle de codage/décodage sémantique
Démarrer IndexTTS2 en mode hors ligne
Au démarrage d’IndexTTS2 via l’interface Web, vous pouvez ajouter un paramètre supplémentaire : - small_models_dir - le chemin du répertoire contenant tous les petits modèles
Lors du lancement en ligne de commande, vous pouvez ajouter les options suivantes :
xinference launch --model-name IndexTTS2 --model-type audio \
--small_models_dir /path/to/small_models
Lors du démarrage avec le client Python :
model_uid = client.launch_model(
model_name="IndexTTS2",
model_type="audio",
small_models_dir="/path/to/small_models"
)