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)

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>",
  }'

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>",
  }'

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.

  1. Der Streaming-Output von ChatTTS ist nicht so gut wie der Non-Streaming-Output, Referenz: 2noise/ChatTTS#564

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

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_speech WAV-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": "中文女"
  }'

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

paraformer-zh

Ja

Ja

Nein

Nein

Nein

paraformer-zh-hotword

Ja

Ja

Nein

Nein

Ja

paraformer-zh-spk

Ja

Ja

Ja

Ja

Nein

paraformer-zh-long

Ja

Ja

Ja

Ja

Nein

seaco-paraformer-zh (empfohlen)

Ja

Ja

Ja

Ja

Ja

  1. Verwendung von VAD und Satzzeichen

    Alle Paraformer-Modelle unterstützen VAD- und Interpunktionsfunktionen.

  2. 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_model und dem Wert cam++ 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")
    
  3. 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.

  1. pip install misaki[zh]

  2. 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_code und der Wert z ist. 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",
    )
    
  3. 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:

  1. 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,
    )
    
  2. 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
    )
    
  3. Wenn eine Referenzaudio für die Emotion festgelegt ist, kann der Parameter emo_alpha optional eingestellt werden, um dessen Einfluss auf die Ausgabe anzupassen. Der gültige Bereich liegt zwischen 0.0 - 1.0, der Standardwert ist 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. 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 Parameter use_random verwenden, um während der Inferenz zufällige Emotionen einzuführen; der Standardwert ist False, setzen Sie ihn auf True, 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
    )
    
  5. Alternativ können Sie die Funktion use_emo_text aktivieren, um die emotionale Ausdrucksweise basierend auf Ihrem bereitgestellten text-Skript zu steuern. Ihr Textskript wird automatisch in Emotionsvektoren umgewandelt. Bei Verwendung des Text-Emotionsmodus wird empfohlen, emo_alpha auf etwa 0,6 (oder niedriger) einzustellen, um einen natürlicheren Stimmklang zu erzielen. Sie können über use_random Zufälligkeit einführen (Standardwert: False; True aktiviert 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
    )
    
  6. Sie können auch über den Parameter emo_text eine 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:

  1. w2v-bert-2.0 (models--facebook--w2v-bert-2.0) - Merkmalsextraktionsmodell

  2. campplus (models--funasr--campplus) – Sprechererkennungsmodell

  3. bigvgan (models--nvidia--bigvgan_v2_22khz_80band_256x) - Sprachcodierermodell

  4. Semantischer 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"
)