Audio#
Lernen Sie, wie Sie mit Xinference Audio in Text oder Text in Audio umwandeln.
N/A#
Die Audio-API bietet drei Methoden zur Interaktion mit Audio:
Das Transkriptionsterminal wandelt Audio in die Eingabesprache um.
Der Übersetzungsendpunkt konvertiert Audio in Englisch.
Der Transkriptionsterminal wandelt Audio in die Eingabesprache um.
API-Endpunkt |
OpenAI-kompatibler Endpunkt |
|---|---|
Übersetzungs-API |
/v1/audio/transcriptions |
API |
/v1/audio/translations |
Sprach-API |
/v1/audio/speech |
Unterstützte Modellliste#
In Xinference unterstützen die folgenden Modelle die Audio-API:
Sprache-zu-Text#
Nur für Mac M-Serie Chips:
Text-to-Speech (TTS)#
Zero-Shot-fähige Modelle (kein Referenzaudio erforderlich)
MeloTTS series
Modelle mit Sprachklon-Unterstützung (Referenzaudio erforderlich)
Unterstützung von Emotionskontrollmodellen
Nur für Mac M-Serie Chips:
Schnellstart#
Transkription#
Transcription API imitiert die create transcriptions API von OpenAI. Sie können die Transcription API über cURL, den OpenAI-Client oder den Python-Client von Xinference ausprobieren:
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 German. 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.#
Translation API ahmt die create translations API von OpenAI nach. Du kannst die Translation API über cURL, den OpenAI Client oder den Python-Client von Xinference ausprobieren:
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?"
}
Sprache#
Transcription API ist eine Nachbildung von OpenAIs create speech API. Du kannst die Speech API über cURL, den OpenAI Client oder den Python-Client von Xinference ausprobieren:
Die Speech API verwendet standardmäßig den nicht-streaming Modus.
Der Streaming-Output von ChatTTS ist nicht so gut wie der Non-Streaming-Output, Referenz: 2noise/ChatTTS#564
Streaming erfordert 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 Verwendung#
Grundlegende Verwendung, siehe Abschnitt zur Sprachverwendung.
Feste Timbre. Wir können das feste Timbre von 6drf21e/ChatTTS_Speaker verwenden. Laden Sie evaluation_result.csv herunter. Nehmen Sie das Timbre seed_2155 als Beispiel, wir verwenden die Daten der Spalte 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"]
Verwende die feste Klangfarbe seed_2155, um die Stimme zu erzeugen.
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>
)
Verwendung des CosyVoice-Modells#
CosyVoice bietet zwei Versionen: CosyVoice 1.0 und CosyVoice 2.0. CosyVoice 1.0 umfasst 3 verschiedene Modelle:
CosyVoice-300M-SFT: Wählen Sie dieses Modell, wenn Sie nur Text in Sprache umwandeln möchten. Es bietet einige vortrainierte Stimmen: [中文女], [中文男], [日语男], [粤语女], [英文女], [英文男], [韩语女].
CosyVoice-300M: Wenn Sie eine Stimme klonen oder Text in die Sprache einer anderen Stimme umwandeln möchten, wählen Sie dieses Modell. Bei Verwendung dieses Modells müssen Sie eine
prompt_speechWAV-Audiodatei bereitstellen; verwenden Sie eine Abtastrate von 16.000 Hz für eine bessere Leistung.CosyVoice-300M-Instruct: Falls du die Tonhöhe und Klangfarbe präzise steuern möchtest, wähle dieses Modell.
Grundlegende Verwendung, laden des Modells 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)
Klonen Sie die Stimme, laden Sie das Modell 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,
)
Sprachübergreifende Nutzung, laden des Modells 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,
)
Basierend auf der instruktionsbasierten Sprachsynthese wird das Modell CosyVoice-300M-Instruct geladen.
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 hat nur ein Modell, enthält aber alle Fähigkeiten der drei CosyVoice-Modelle. Die Verwendungsmethode ist dieselbe wie bei CosyVoice.
CosyVoice 2.0 Streaming-Verwendung, Modell CosyVoice2-0.5B laden.
# 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)
Weitere Anweisungen und Beispiele finden Sie unter https://fun-audio-llm.github.io/.
FishSpeech-Modellverwendung#
Grundlegende Verwendung, siehe Abschnitt zur Sprachverwendung.
Stimmenklonen, starte das Modell FishSpeech-1.5. Bitte verwende prompt_speech anstelle von reference_audio und prompt_text anstelle von reference_text, um dem FishSpeech-Modell Referenzaudio bereitzustellen. Dieser Parameter ist mit dem Stimmenklonen von CosyVoice konsistent.
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
)
Paraformer Bedienungsanleitung#
model |
Sprachaktivitätserkennung (VAD) |
Interpunktion (Punctuation Restoration) |
Timestamp |
Sprecher |
Hotwort |
|---|---|---|---|---|---|
Ja |
Ja |
Nein |
Nein |
Nein |
|
Ja |
Ja |
Nein |
Nein |
Ja |
|
Ja |
Ja |
Ja |
Ja |
Nein |
|
Ja |
Ja |
Ja |
Ja |
Nein |
|
seaco-paraformer-zh (empfohlen) |
Ja |
Ja |
Ja |
Ja |
Ja |
Verwendung von VAD und Satzzeichen
Alle Paraformer-Modelle unterstützen VAD- und Interpunktionsfunktionen.
Anleitung zur Verwendung von Zeitstempeln und Sprechererkennung
Nur die folgenden Modelle unterstützen die Erkennung von Zeitstempel und Sprecher:
paraformer-zh-spk
paraformer-zh-long
seaco-paraformer-zh
Dabei ist die Sprechererkennungsfunktion standardmäßig nur bei paraformer-zh-spk aktiviert.
Wenn Sie paraformer-zh-long oder seaco-paraformer-zh verwenden und die Sprechererkennungsfunktion aktivieren müssen:
In der Web-Benutzeroberfläche: Fügen Sie einen Parameter mit dem Namen
spk_modelund dem Wertcam++hinzu.Verwenden Sie in der Befehlszeile: Fügen Sie den Parameter
--spk_model cam++hinzu
Beispiel:
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")
Anleitung zur Nutzung der Hotword-Funktion
Nur die folgenden Modelle unterstützen hotword (Hotword-Funktion):
paraformer-zh-hotword
seaco-paraformer-zh
Beispiel:
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-Verwendung#
Jetzt verwendet SenseVoiceSmall ein kleines VAD-Modell fsmn-vad, daher benötigt es ein Netzwerk zum Herunterladen.
Für Offline-Umgebungen können Sie dieses VAD-Modell vorab herunterladen.
Laden Sie von huggingface oder modelscope herunter. Angenommen, der Download erfolgt unter /path/to/fsmn-vad.
Wenn Sie SenseVoiceSmall über die Web-Benutzeroberfläche laden, fügen Sie eine zusätzliche Option hinzu: Der Schlüssel ist vad_model, der Wert ist der vorherige Download-Pfad /path/to/fsmn-vad. Beim Laden über die Befehlszeile fügen Sie die Option --vad_model /path/to/fsmn-vad hinzu.
Kokoro-Modellverwendung#
Das Kokoro-Modell unterstützt mehrere Sprachen, standardmäßig ist Englisch eingestellt. Wenn Sie eine andere als die Standardsprache verwenden möchten, z. B. Chinesisch, müssen Sie zusätzliche Abhängigkeitspakete installieren und beim Start des Modells die entsprechenden Parameter hinzufügen.
pip install misaki[zh]
Initialisieren Sie das Modell mit dem Parameter lang_code=‘z‘. Sie können unter kokoro source code alle unterstützten lang_code-Werte einsehen. Wenn Sie das Modell über die Web-Benutzeroberfläche starten, müssen Sie einen zusätzlichen Parameter hinzufügen, wobei der Schlüssel
lang_codeund der Wertzist. Wenn Sie das Modell über den xinference-Client starten, können Sie den Parameter wie im folgenden Codebeispiel übergeben:model_uid = client.launch_model( model_name="Kokoro-82M", model_type="audio", compile=False, download_hub="huggingface", lang_code="z", )
Wenn Sie Rückschlüsse ziehen, verwenden Sie eine Stimme, die mit ‚z‘ beginnt, z. B.
zf_xiaoyi. Derzeit unterstützte Stimmen finden Sie unter https://huggingface.co/hexgrad/Kokoro-82M/tree/main/voices. Die Verwendungsmethode ist wie folgt:input_string = "重新启动即可更新" response = model.speech(input_string, voice="zf_xiaoyi")
IndexTTS2 verwendet#
Das IndexTTS2-Modell unterstützt die Emotionssteuerung. Sie können diese Funktion nutzen, indem Sie zusätzliche Parameter verwenden. Nachfolgend wird die Verwendung von IndexTTS2 beschrieben:
Single-Referenz-Audio (Klonen der Klangfarbe):
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, )
Referenz-Audio zur Emotionsvorgabe:
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 )
Wenn eine Referenzaudio für die Emotion festgelegt ist, kann der Parameter
emo_alphaoptional eingestellt werden, um dessen Einfluss auf die Ausgabe anzupassen. Der gültige Bereich liegt zwischen0.0 - 1.0, der Standardwert ist1.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 )
Sie können die emotionale Referenzaudio-Datei weglassen und stattdessen eine Liste mit 8 Gleitkommazahlen angeben, die die Intensität jeder Emotion in der folgenden Reihenfolge festlegt:
[Freude, Wut, Trauer, Angst, Ekel, Melancholie, Überraschung, Ruhe]. Sie können auch den Parameteruse_randomverwenden, um während der Inferenz zufällige Emotionen einzuführen; der Standardwert istFalse, setzen Sie ihn aufTrue, um zufällige Emotionen zu aktivieren.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 )
Alternativ können Sie die Funktion
use_emo_textaktivieren, um die emotionale Ausdrucksweise basierend auf Ihrem bereitgestelltentext-Skript zu steuern. Ihr Textskript wird automatisch in Emotionsvektoren umgewandelt. Bei Verwendung des Text-Emotionsmodus wird empfohlen,emo_alphaauf etwa 0,6 (oder niedriger) einzustellen, um einen natürlicheren Stimmklang zu erzielen. Sie können überuse_randomZufälligkeit einführen (Standardwert:False;Trueaktiviert die Zufälligkeit):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 )
Sie können auch über den Parameter
emo_texteine spezifische textuelle Emotionsbeschreibung direkt angeben. Ihr Emotionstext wird automatisch in einen Emotionsvektor umgewandelt. Dadurch können Sie das Textskript und die textuelle Emotionsbeschreibung getrennt steuern: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-Nutzung#
IndexTTS2 benötigt mehrere kleine Modelle, die während der Initialisierung automatisch heruntergeladen werden. In einer Offline-Umgebung können Sie diese Modelle in ein einziges Verzeichnis herunterladen und den Pfad zu diesem Verzeichnis angeben.
Einfache Einrichtungsmethode
Der einfachste Weg, die Offline-Nutzung einzurichten, ist die Verwendung des Befehls hf download, um alle kleinen Modelle vorab herunterzuladen.
# 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
Die endgültige Verzeichnisstruktur sollte wie folgt aussehen:
/path/to/small_models/
├── w2v-bert-2.0/ # Feature extraction model
├── campplus/ # Speaker recognition model
├── bigvgan/ # Vocoder model
└── MaskGCT/ # Semantic codec model
Liste der unterstützten Modelle
Kleine Modelle werden automatisch wie folgt zugeordnet:
w2v-bert-2.0 (
models--facebook--w2v-bert-2.0) - Merkmalsextraktionsmodellcampplus (
models--funasr--campplus) – Sprechererkennungsmodellbigvgan (
models--nvidia--bigvgan_v2_22khz_80band_256x) - SprachcodierermodellSemantischer Codec (models–amphion–MaskGCT) - Semantisches Kodierungs-/Dekodierungsmodell
IndexTTS2 im Offline-Modus starten
Beim Start von IndexTTS2 über die Web-Benutzeroberfläche können zusätzliche Parameter hinzugefügt werden: - small_models_dir - Der Verzeichnispfad, der alle kleinen Modelle enthält
Beim Start über die Befehlszeile können Sie die folgenden Optionen hinzufügen:
xinference launch --model-name IndexTTS2 --model-type audio \
--small_models_dir /path/to/small_models
Beim Starten mit dem Python-Client:
model_uid = client.launch_model(
model_name="IndexTTS2",
model_type="audio",
small_models_dir="/path/to/small_models"
)