QwenCloudBRASIL
Tradução de apoio para consulta. Código e identificadores técnicos preservados. Consultar referência original ↗

SSML e LaTeX

Controle a velocidade de fala, pausas e pronúncia com SSML, ou converta fórmulas LaTeX para a fala natural

Ambos os recursos funcionam com CosyVoice Modelos.

Visão geral

SSML é uma linguagem de marcação baseada em XML para síntese de fala. Incorpore etiquetas SSML em seu texto para controlar a velocidade de fala, pitch, pausas e volume, e para adicionar música de fundo e efeitos sonoros para uma produção de fala mais rica.

CosyVoice Também analisa fórmulas de LaTeX inseridas em texto e as lê como uma pessoa faria. Isso combina com educação online, audiolivros e outros conteúdos que contêm fórmulas matemáticas.

Casos típicos de uso:

Ambas as características funcionam com o CosyVoice Série de modelos. Para ajudar a escolher um modelo, veja [Modelos de síntese de voz] (/developer-guides/speech/tts-models).

Língua de marcação SSML

Limitações

Começando.

Para pré-requisitos e tutoriais, veja Texto-para-falar - CosyVoice. Verifique as [Limitações] (#limitations) seção para modelos, vozes e APIs suportados antes de usar SSML.

Java SDK

import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.utils.Constants;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;

// See SSML support requirements in the note above
public class Main {
  private static String model = "cosyvoice-v3-flash";
  private static String voice = "longanyang";

  public static void main(String[] args) {
    Constants.baseWebsocketApiUrl = "wss://maas.qwencloudapi.com/api-ws/v1/inference";
    streamAudioDataToSpeaker();
    System.exit(0);
  }

  public static void streamAudioDataToSpeaker() {
    SpeechSynthesisParam param =
        SpeechSynthesisParam.builder()
            // If you have not configured an environment variable, replace the following line with: .apiKey("sk-xxx")
            .apiKey(System.getenv("DASHSCOPE_API_KEY"))
            .model(model)
            .voice(voice)
            .build();

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
    ByteBuffer audio = null;
    try {
      // Non-streaming call; blocks until audio is returned
      // Escape special characters
      audio = synthesizer.call("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>");
    } catch (Exception e) {
      throw new RuntimeException(e);
    } finally {
      // Close the WebSocket connection after the task ends
      synthesizer.getDuplexApi().close(1000, "bye");
    }
    if (audio != null) {
      // Save the audio data to a local file named "output.mp3"
      File file = new File("output.mp3");
      try (FileOutputStream fos = new FileOutputStream(file)) {
        fos.write(audio.array());
      } catch (IOException e) {
        throw new RuntimeException(e);
      }
    }

    // The first packet latency includes the time required to establish the WebSocket connection
    System.out.println(
        "[Metric] Request ID: "
            + synthesizer.getLastRequestId()
            + ", First packet latency (ms): "
            + synthesizer.getFirstPackageDelay());
  }
}
import com.alibaba.dashscope.audio.tts.SpeechSynthesisResult;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
import com.alibaba.dashscope.common.ResultCallback;
import com.alibaba.dashscope.utils.Constants;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;

// See SSML support requirements in the note above
public class Main {
  private static String model = "cosyvoice-v3-flash";
  private static String voice = "longanyang";

  public static void main(String[] args) {
    Constants.baseWebsocketApiUrl = "wss://maas.qwencloudapi.com/api-ws/v1/inference";
    streamAudioDataToSpeaker();
    System.out.println("Audio saved to output.mp3");
    System.exit(0);
  }

  public static void streamAudioDataToSpeaker() {
    CountDownLatch latch = new CountDownLatch(1);
    final FileOutputStream[] fileOutputStream = new FileOutputStream[1];

    try {
      fileOutputStream[0] = new FileOutputStream("output.mp3");
    } catch (IOException e) {
      System.err.println("Failed to create output file: " + e.getMessage());
      return;
    }

    // Implement the ResultCallback interface
    ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
      @Override
      public void onEvent(SpeechSynthesisResult result) {
        if (result.getAudioFrame() != null) {
          // Write audio data to a local file
          try {
            byte[] audioData = result.getAudioFrame().array();
            fileOutputStream[0].write(audioData);
            fileOutputStream[0].flush();
          } catch (IOException e) {
            System.err.println("Failed to write audio data: " + e.getMessage());
          }
        }
      }

      @Override
      public void onComplete() {
        System.out.println("Received Complete; speech synthesis finished");
        closeFileOutputStream(fileOutputStream[0]);
        latch.countDown();
      }

      @Override
      public void onError(Exception e) {
        System.out.println("Error occurred: " + e.toString());
        closeFileOutputStream(fileOutputStream[0]);
        latch.countDown();
      }
    };

    SpeechSynthesisParam param =
        SpeechSynthesisParam.builder()
            // If you have not configured an environment variable, replace the following line with: .apiKey("sk-xxx")
            .apiKey(System.getenv("DASHSCOPE_API_KEY"))
            .model(model)
            .voice(voice)
            .format(SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS)
            .build();

    SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, callback);

    try {
      // Unidirectional streaming call; returns null immediately (results are delivered asynchronously through the callback)
      // Escape special characters
      synthesizer.call("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>");
      // Wait for synthesis to complete
      latch.await();
    } catch (Exception e) {
      throw new RuntimeException(e);
    } finally {
      // Close the WebSocket connection after the task ends
      try {
        synthesizer.getDuplexApi().close(1000, "bye");
      } catch (Exception e) {
        System.err.println("Failed to close WebSocket connection: " + e.getMessage());
      }

      // Ensure the file stream is closed
      closeFileOutputStream(fileOutputStream[0]);
    }

    // The first packet latency includes the time required to establish the WebSocket connection
    System.out.println(
        "[Metric] Request ID: "
            + synthesizer.getLastRequestId()
            + ", First packet latency (ms): "
            + synthesizer.getFirstPackageDelay());
  }

  private static void closeFileOutputStream(FileOutputStream fileOutputStream) {
    try {
      if (fileOutputStream != null) {
        fileOutputStream.close();
      }
    } catch (IOException e) {
      System.err.println("Failed to close file stream: " + e.getMessage());
    }
  }
}

Python SDK

# coding=utf-8
# See SSML support requirements in the note above

import dashscope
from dashscope.audio.tts_v2 import *
import os

# If you have not configured an environment variable, replace the following line with: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

dashscope.base_websocket_api_url='wss://maas.qwencloudapi.com/api-ws/v1/inference'

# Model
model = "cosyvoice-v3-flash"
# Voice
voice = "longanyang"

# Instantiate SpeechSynthesizer and pass model, voice, and other request parameters to the constructor
synthesizer = SpeechSynthesizer(model=model, voice=voice)
# Non-streaming call; blocks until audio is returned
# Escape special characters
audio = synthesizer.call("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>")

# Save the audio locally
with open('output.mp3', 'wb') as f:
  f.write(audio)

# The first packet latency includes the time required to establish the WebSocket connection
print('[Metric] Request ID: {}, First packet latency: {} ms'.format(
  synthesizer.get_last_request_id(),
  synthesizer.get_first_package_delay()))
# coding=utf-8
# See SSML support requirements in the note above

import dashscope
from dashscope.audio.tts_v2 import *
import os
from datetime import datetime

def get_timestamp():
  now = datetime.now()
  formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
  return formatted_timestamp

# If you have not configured an environment variable, replace the following line with: dashscope.api_key = "sk-xxx"
dashscope.api_key = os.environ.get('DASHSCOPE_API_KEY')

dashscope.base_websocket_api_url='wss://maas.qwencloudapi.com/api-ws/v1/inference'

# Model
model = "cosyvoice-v3-flash"
# Voice
voice = "longanyang"

# Define callback interface
class Callback(ResultCallback):
  _player = None
  _stream = None

  def on_open(self):
    # Open output file to write audio data
    self.file = open("output.mp3", "wb")
    print("Connection established: " + get_timestamp())

  def on_complete(self):
    print("Speech synthesis completed; all results received: " + get_timestamp())
    if hasattr(self, 'file') and self.file:
      self.file.close()
    # The first packet latency includes the time required to establish the WebSocket connection
    print('[Metric] Request ID: {}, First packet latency: {} ms'.format(
      self.synthesizer.get_last_request_id(),
      self.synthesizer.get_first_package_delay()))

  def on_error(self, message: str):
    print(f"Speech synthesis error: {message}")
    if hasattr(self, 'file') and self.file:
      self.file.close()

  def on_close(self):
    print("Connection closed: " + get_timestamp())
    if hasattr(self, 'file') and self.file:
      self.file.close()

  def on_event(self, message):
    pass

  def on_data(self, data: bytes) -> None:
    print(get_timestamp() + " Binary audio length: " + str(len(data)))
    # Write audio data to file
    self.file.write(data)

callback = Callback()

# Instantiate SpeechSynthesizer and pass model, voice, and other request parameters to the constructor
synthesizer = SpeechSynthesizer(
  model=model,
  voice=voice,
  callback=callback,
)

# Assign the synthesizer instance to callback for use in on_complete
callback.synthesizer = synthesizer

# Unidirectional streaming call; send text to synthesize and receive binary audio in real time via the on_data method of the callback
# Escape special characters
synthesizer.call("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>")

API WebSocket

Go

```go
// See SSML support requirements in the note above

package main

import (
  "encoding/json"
  "fmt"
  "net/http"
  "os"
  "strings"
  "time"

  "github.com/google/uuid"
  "github.com/gorilla/websocket"
)

const (
  wsURL      = "wss://maas.qwencloudapi.com/api-ws/v1/inference/"
  outputFile = "output.mp3"
)

func main() {
  // If you have not configured an environment variable, replace the following line with: apiKey := "sk-xxx"
  apiKey := os.Getenv("DASHSCOPE_API_KEY")

  // Clear the output file
  os.Remove(outputFile)
  os.Create(outputFile)

  // Connect to WebSocket
  header := make(http.Header)
  header.Add("X-DashScope-DataInspection", "enable")
  header.Add("Authorization", fmt.Sprintf("bearer %s", apiKey))

  conn, resp, err := websocket.DefaultDialer.Dial(wsURL, header)
  if err != nil {
    if resp != nil {
      fmt.Printf("Connection failed. HTTP status code: %d\n", resp.StatusCode)
    }
    fmt.Println("Connection failed:", err)
    return
  }
  defer conn.Close()

  // Generate task ID
  taskID := uuid.New().String()
  fmt.Printf("Generated task ID: %s\n", taskID)

  // Send run-task command
  runTaskCmd := map[string]interface{}{
    "header": map[string]interface{}{
      "action":    "run-task",
      "task_id":   taskID,
      "streaming": "duplex",
    },
    "payload": map[string]interface{}{
      "task_group": "audio",
      "task":       "tts",
      "function":   "SpeechSynthesizer",
      "model":      "cosyvoice-v3-flash",
      "parameters": map[string]interface{}{
        "text_type":   "PlainText",
        "voice":       "longanyang",
        "format":      "mp3",
        "sample_rate": 22050,
        "volume":      50,
        "rate":        1,
        "pitch":       1,
        // With enable_ssml: true, send continue-task only once
        "enable_ssml": true,
      },
      "input": map[string]interface{}{},
    },
  }

  runTaskJSON, _ := json.Marshal(runTaskCmd)
  fmt.Printf("Sending run-task command: %s\n", string(runTaskJSON))

  err = conn.WriteMessage(websocket.TextMessage, runTaskJSON)
  if err != nil {
    fmt.Println("Failed to send run-task:", err)
    return
  }

  textSent := false

  // Process messages
  for {
    messageType, message, err := conn.ReadMessage()
    if err != nil {
      fmt.Println("Failed to read message:", err)
      break
    }

    // Handle binary messages
    if messageType == websocket.BinaryMessage {
      fmt.Printf("Received binary message, length: %d\n", len(message))
      file, _ := os.OpenFile(outputFile, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
      file.Write(message)
      file.Close()
      continue
    }

    // Handle text messages
    messageStr := string(message)
    fmt.Printf("Received text message: %s\n", strings.ReplaceAll(messageStr, "\n", ""))

    // Parse JSON to get event type
    var msgMap map[string]interface{}
    if json.Unmarshal(message, &msgMap) == nil {
      if header, ok := msgMap["header"].(map[string]interface{}); ok {
        if event, ok := header["event"].(string); ok {
          fmt.Printf("Event type: %s\n", event)

          switch event {
          case "task-started":
            fmt.Println("=== Received task-started event ===")

            if !textSent {
              // Send continue-task command; when using SSML, you can send this command only once
              continueTaskCmd := map[string]interface{}{
                "header": map[string]interface{}{
                  "action":    "continue-task",
                  "task_id":   taskID,
                  "streaming": "duplex",
                },
                "payload": map[string]interface{}{
                  "input": map[string]interface{}{
                    // Escape special characters
                    "text": "<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>",
                  },
                },
              }

              continueTaskJSON, _ := json.Marshal(continueTaskCmd)
              fmt.Printf("Sending continue-task command: %s\n", string(continueTaskJSON))

              err = conn.WriteMessage(websocket.TextMessage, continueTaskJSON)
              if err != nil {
                fmt.Println("Failed to send continue-task:", err)
                return
              }

              textSent = true

              // Delay sending finish-task
              time.Sleep(500 * time.Millisecond)

              // Send finish-task command
              finishTaskCmd := map[string]interface{}{
                "header": map[string]interface{}{
                  "action":    "finish-task",
                  "task_id":   taskID,
                  "streaming": "duplex",
                },
                "payload": map[string]interface{}{
                  "input": map[string]interface{}{},
                },
              }

              finishTaskJSON, _ := json.Marshal(finishTaskCmd)
              fmt.Printf("Sending finish-task command: %s\n", string(finishTaskJSON))

              err = conn.WriteMessage(websocket.TextMessage, finishTaskJSON)
              if err != nil {
                fmt.Println("Failed to send finish-task:", err)
                return
              }
            }

          case "task-finished":
            fmt.Println("=== Task finished ===")
            return

          case "task-failed":
            fmt.Println("=== Task failed ===")
            if header["error_message"] != nil {
              fmt.Printf("Error message: %s\n", header["error_message"])
            }
            return

          case "result-generated":
            fmt.Println("Received result-generated event")
          }
        }
      }
    }
  }
}
```

C#

```csharp
using System.Net.WebSockets;
using System.Text;
using System.Text.Json;

// See SSML support requirements in the note above
class Program {
  // If you have not configured an environment variable, replace the following line with: private static readonly string ApiKey = "sk-xxx"
  private static readonly string ApiKey = Environment.GetEnvironmentVariable("DASHSCOPE_API_KEY") ?? throw new InvalidOperationException("DASHSCOPE_API_KEY environment variable is not set.");

  private const string WebSocketUrl = "wss://maas.qwencloudapi.com/api-ws/v1/inference/";
  // Output file path
  private const string OutputFilePath = "output.mp3";

  // WebSocket client
  private static ClientWebSocket _webSocket = new ClientWebSocket();
  // Cancellation token source
  private static CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
  // Task ID
  private static string? _taskId;
  // Whether the task has started
  private static TaskCompletionSource<bool> _taskStartedTcs = new TaskCompletionSource<bool>();

  static async Task Main(string[] args) {
    try {
      // Clear the output file
      ClearOutputFile(OutputFilePath);

      // Connect to WebSocket service
      await ConnectToWebSocketAsync(WebSocketUrl);

      // Start the task to receive messages
      Task receiveTask = ReceiveMessagesAsync();

      // Send run-task command
      _taskId = GenerateTaskId();
      await SendRunTaskCommandAsync(_taskId);

      // Wait for the task-started event
      await _taskStartedTcs.Task;

      // Send the continue-task command. When using the SSML feature, this command can be sent only once.
      // Special characters need to be escaped.
      await SendContinueTaskCommandAsync("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>");

      // Send the finish-task command
      await SendFinishTaskCommandAsync(_taskId);

      // Wait for the receive task to complete
      await receiveTask;

      Console.WriteLine("Task completed, connection closed.");
    } catch (OperationCanceledException) {
      Console.WriteLine("The task was canceled.");
    } catch (Exception ex) {
      Console.WriteLine($"An error occurred: {ex.Message}");
    } finally {
      _cancellationTokenSource.Cancel();
      _webSocket.Dispose();
    }
  }

  private static void ClearOutputFile(string filePath) {
    if (File.Exists(filePath)) {
      File.WriteAllText(filePath, string.Empty);
      Console.WriteLine("The output file has been cleared.");
    } else {
      Console.WriteLine("The output file does not exist and does not need to be cleared.");
    }
  }

  private static async Task ConnectToWebSocketAsync(string url) {
    var uri = new Uri(url);
    if (_webSocket.State == WebSocketState.Connecting || _webSocket.State == WebSocketState.Open) {
      return;
    }

    // Set headers for the WebSocket connection
    _webSocket.Options.SetRequestHeader("Authorization", $"bearer {ApiKey}");
    _webSocket.Options.SetRequestHeader("X-DashScope-DataInspection", "enable");

    try {
      await _webSocket.ConnectAsync(uri, _cancellationTokenSource.Token);
      Console.WriteLine("Successfully connected to the WebSocket service.");
    } catch (OperationCanceledException) {
      Console.WriteLine("WebSocket connection was canceled.");
    } catch (Exception ex) {
      Console.WriteLine($"WebSocket connection failed: {ex.Message}");
      throw;
    }
  }

  private static async Task SendRunTaskCommandAsync(string taskId) {
    var command = CreateCommand("run-task", taskId, "duplex", new {
      task_group = "audio",
      task = "tts",
      function = "SpeechSynthesizer",
      model = "cosyvoice-v3-flash",
      parameters = new
      {
        text_type = "PlainText",
        voice = "longanyang",
        format = "mp3",
        sample_rate = 22050,
        volume = 50,
        rate = 1,
        pitch = 1,
        // With enable_ssml: true, send continue-task only once
        enable_ssml = true
      },
      input = new { }
    });

    await SendJsonMessageAsync(command);
    Console.WriteLine("Sent run-task command.");
  }

  private static async Task SendContinueTaskCommandAsync(string text) {
    if (_taskId == null) {
      throw new InvalidOperationException("Task ID is not initialized.");
    }

    var command = CreateCommand("continue-task", _taskId, "duplex", new {
      input = new {
        text
      }
    });

    await SendJsonMessageAsync(command);
    Console.WriteLine("Sent continue-task command.");
  }

  private static async Task SendFinishTaskCommandAsync(string taskId) {
    var command = CreateCommand("finish-task", taskId, "duplex", new {
      input = new { }
    });

    await SendJsonMessageAsync(command);
    Console.WriteLine("Sent finish-task command.");
  }

  private static async Task SendJsonMessageAsync(string message) {
    var buffer = Encoding.UTF8.GetBytes(message);
    try {
      await _webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, _cancellationTokenSource.Token);
    } catch (OperationCanceledException) {
      Console.WriteLine("Message sending was canceled.");
    }
  }

  private static async Task ReceiveMessagesAsync() {
    while (_webSocket.State == WebSocketState.Open) {
      var response = await ReceiveMessageAsync();
      if (response != null) {
        var eventStr = response.RootElement.GetProperty("header").GetProperty("event").GetString();
        switch (eventStr) {
          case "task-started":
            Console.WriteLine("Task started.");
            _taskStartedTcs.TrySetResult(true);
            break;
          case "task-finished":
            Console.WriteLine("Task finished.");
            _cancellationTokenSource.Cancel();
            break;
          case "task-failed":
            Console.WriteLine("Task failed: " + response.RootElement.GetProperty("header").GetProperty("error_message").GetString());
            _cancellationTokenSource.Cancel();
            break;
          default:
            // result-generated can be handled here
            break;
        }
      }
    }
  }

  private static async Task<JsonDocument?> ReceiveMessageAsync() {
    var buffer = new byte[1024 * 4];
    var segment = new ArraySegment<byte>(buffer);

    try {
      WebSocketReceiveResult result = await _webSocket.ReceiveAsync(segment, _cancellationTokenSource.Token);

      if (result.MessageType == WebSocketMessageType.Close) {
        await _webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", _cancellationTokenSource.Token);
        return null;
      }

      if (result.MessageType == WebSocketMessageType.Binary) {
        // Handle binary data
        Console.WriteLine("Receiving binary data...");

        // Save binary data to a file
        using (var fileStream = new FileStream(OutputFilePath, FileMode.Append)) {
          fileStream.Write(buffer, 0, result.Count);
        }

        return null;
      }

      string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
      return JsonDocument.Parse(message);
    } catch (OperationCanceledException) {
      Console.WriteLine("Message reception was canceled.");
      return null;
    }
  }

  private static string GenerateTaskId() {
    return Guid.NewGuid().ToString("N").Substring(0, 32);
  }

  private static string CreateCommand(string action, string taskId, string streaming, object payload) {
    var command = new {
      header = new {
        action,
        task_id = taskId,
        streaming
      },
      payload
    };

    return JsonSerializer.Serialize(command);
  }
}
```

PHP

O exemplo usa esta estrutura de diretórios:

```text
my-php-project/
├── composer.json
├── vendor/
└── index.php
```

 Conteúdo de `composer.json` (Ajustar versões de dependência conforme necessário):

```json
{
  "require": {
    "react/event-loop": "^1.3",
    "react/socket": "^1.11",
    "react/stream": "^1.2",
    "react/http": "^1.1",
    "ratchet/pawl": "^0.4"
  },
  "autoload": {
    "psr-4": {
      "App\\": "src/"
    }
  }
}
```

 Conteúdo de `index.php`:

```php
<!-- See SSML support requirements in the note above -->

<?php

require __DIR__ . '/vendor/autoload.php';

use Ratchet\Client\Connector;
use React\EventLoop\Loop;
use React\Socket\Connector as SocketConnector;

// If you have not configured an environment variable, replace the following line with: $api_key = "sk-xxx"
$api_key = getenv("DASHSCOPE_API_KEY");
$websocket_url = 'wss://maas.qwencloudapi.com/api-ws/v1/inference/'; // WebSocket server address
$output_file = 'output.mp3'; // Output file path

$loop = Loop::get();

if (file_exists($output_file)) {
    // Clear the file content
    file_put_contents($output_file, '');
}

// Create a custom connector
$socketConnector = new SocketConnector($loop, [
    'tcp' => [
        'bindto' => '0.0.0.0:0',
    ],
    'tls' => [
        'verify_peer' => false,
        'verify_peer_name' => false,
    ],
]);

$connector = new Connector($loop, $socketConnector);

$headers = [
    'Authorization' => 'bearer ' . $api_key,
    'X-DashScope-DataInspection' => 'enable'
];

$connector($websocket_url, [], $headers)->then(function ($conn) use ($loop, $output_file) {
    echo "Connected to WebSocket server\n";

    // Generate task ID
    $taskId = generateTaskId();

    // Send run-task command
    sendRunTaskMessage($conn, $taskId);

    // Define the function to send the continue-task command
    $sendContinueTask = function() use ($conn, $loop, $taskId) {
        // Send the continue-task command. When using the SSML feature, this command can be sent only once.
        $continueTaskMessage = json_encode([
            "header" => [
                "action" => "continue-task",
                "task_id" => $taskId,
                "streaming" => "duplex"
            ],
            "payload" => [
                "input" => [
                    // Special characters need to be escaped
                    "text" => "<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>"
                ]
            ]
        ]);
        $conn->send($continueTaskMessage);

        // Send the finish-task command
        sendFinishTaskMessage($conn, $taskId);
    };

    // Flag to check if the task-started event is received
    $taskStarted = false;

    // Listen for messages
    $conn->on('message', function($msg) use ($conn, $sendContinueTask, $loop, &$taskStarted, $taskId, $output_file) {
        if ($msg->isBinary()) {
            // Write binary data to the local file
            file_put_contents($output_file, $msg->getPayload(), FILE_APPEND);
        } else {
            // Handle non-binary messages
            $response = json_decode($msg, true);

            if (isset($response['header']['event'])) {
                handleEvent($conn, $response, $sendContinueTask, $loop, $taskId, $taskStarted);
            } else {
                echo "Unknown message format\n";
            }
        }
    });

    // Listen for connection close
    $conn->on('close', function($code = null, $reason = null) {
        echo "Connection closed\n";
        if ($code !== null) {
            echo "Close code: " . $code . "\n";
        }
        if ($reason !== null) {
            echo "Close reason: " . $reason . "\n";
        }
    });
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

$loop->run();

/**
 * Generate task ID
 * @return string
 */
function generateTaskId(): string {
    return bin2hex(random_bytes(16));
}

/**
 * Send run-task command
 * @param $conn
 * @param $taskId
 */
function sendRunTaskMessage($conn, $taskId) {
    $runTaskMessage = json_encode([
        "header" => [
            "action" => "run-task",
            "task_id" => $taskId,
            "streaming" => "duplex"
        ],
        "payload" => [
            "task_group" => "audio",
            "task" => "tts",
            "function" => "SpeechSynthesizer",
            "model" => "cosyvoice-v3-flash",
            "parameters" => [
                "text_type" => "PlainText",
                "voice" => "longanyang",
                "format" => "mp3",
                "sample_rate" => 22050,
                "volume" => 50,
                "rate" => 1,
                "pitch" => 1,
                // With enable_ssml: true, send continue-task only once
                "enable_ssml" => true
            ],
            "input" => (object) []
        ]
    ]);
    echo "Preparing to send run-task command: " . $runTaskMessage . "\n";
    $conn->send($runTaskMessage);
    echo "run-task command sent\n";
}

/**
 * Read audio file
 * @param string $filePath
 * @return bool|string
 */
function readAudioFile(string $filePath) {
    $voiceData = file_get_contents($filePath);
    if ($voiceData === false) {
        echo "Failed to read audio file\n";
    }
    return $voiceData;
}

/**
 * Split audio data
 * @param string $data
 * @param int $chunkSize
 * @return array
 */
function splitAudioData(string $data, int $chunkSize): array {
    return str_split($data, $chunkSize);
}

/**
 * Send finish-task command
 * @param $conn
 * @param $taskId
 */
function sendFinishTaskMessage($conn, $taskId) {
    $finishTaskMessage = json_encode([
        "header" => [
            "action" => "finish-task",
            "task_id" => $taskId,
            "streaming" => "duplex"
        ],
        "payload" => [
            "input" => (object) []
        ]
    ]);
    echo "Preparing to send finish-task command: " . $finishTaskMessage . "\n";
    $conn->send($finishTaskMessage);
    echo "finish-task command sent\n";
}

/**
 * Handle events
 * @param $conn
 * @param $response
 * @param $sendContinueTask
 * @param $loop
 * @param $taskId
 * @param $taskStarted
 */
function handleEvent($conn, $response, $sendContinueTask, $loop, $taskId, &$taskStarted) {
    switch ($response['header']['event']) {
        case 'task-started':
            echo "Task started, sending continue-task command...\n";
            $taskStarted = true;
            // Send continue-task command
            $sendContinueTask();
            break;
        case 'result-generated':
            // Ignore result-generated event
            break;
        case 'task-finished':
            echo "Task finished\n";
            $conn->close();
            break;
        case 'task-failed':
            echo "Task failed\n";
            echo "Error code: " . $response['header']['error_code'] . "\n";
            echo "Error message: " . $response['header']['error_message'] . "\n";
            $conn->close();
            break;
        case 'error':
            echo "Error: " . $response['payload']['message'] . "\n";
            break;
        default:
            echo "Unknown event: " . $response['header']['event'] . "\n";
            break;
    }

    // If the task is finished, close the connection
    if ($response['header']['event'] == 'task-finished') {
        // Wait for 1 second to ensure all data is transferred
        $loop->addTimer(1, function() use ($conn) {
            $conn->close();
            echo "Client closes connection\n";
        });
    }

    // If task-started event is not received, close the connection
    if (!$taskStarted && in_array($response['header']['event'], ['task-failed', 'error'])) {
        $conn->close();
    }
}
```

Node.js

 Instale as dependências necessárias:

```bash
npm install ws
npm install uuid
```

 Código de exemplo:

```javascript
// See SSML support requirements in the note above

import fs from 'fs';
import WebSocket from 'ws';
import { v4 as uuid } from 'uuid'; // Used to generate UUIDs

// If you have not configured an environment variable, replace the following line with: const apiKey = "sk-xxx"
const apiKey = process.env.DASHSCOPE_API_KEY;
const url = 'wss://maas.qwencloudapi.com/api-ws/v1/inference/';
// Output file path
const outputFilePath = 'output.mp3';

// Clear the output file
fs.writeFileSync(outputFilePath, '');

// Create a WebSocket client
const ws = new WebSocket(url, {
  headers: {
    Authorization: `bearer ${apiKey}`,
    'X-DashScope-DataInspection': 'enable'
  }
});

let taskStarted = false;
let taskId = uuid();

ws.on('open', () => {
  console.log('Connected to WebSocket server');

  // Send the run-task command
  const runTaskMessage = JSON.stringify({
    header: {
      action: 'run-task',
      task_id: taskId,
      streaming: 'duplex'
    },
    payload: {
      task_group: 'audio',
      task: 'tts',
      function: 'SpeechSynthesizer',
      model: 'cosyvoice-v3-flash',
      parameters: {
        text_type: 'PlainText',
        voice: 'longanyang', // Voice
        format: 'mp3', // Audio format
        sample_rate: 22050, // Sample rate
        volume: 50, // Volume
        rate: 1, // Speech rate
        pitch: 1, // Pitch
        enable_ssml: true // Whether to enable the SSML feature. If enable_ssml is set to true, you can send the continue-task command only once. Otherwise, the error "Text request limit violated, expected 1." is reported.
      },
      input: {}
    }
  });
  ws.send(runTaskMessage);
  console.log('Sent run-task message');
});

const fileStream = fs.createWriteStream(outputFilePath, { flags: 'a' });
ws.on('message', (data, isBinary) => {
  if (isBinary) {
    // Write binary data to the file
    fileStream.write(data);
  } else {
    const message = JSON.parse(data);

    switch (message.header.event) {
      case 'task-started':
        taskStarted = true;
        console.log('Task has started');
        // Send continue-task command
        sendContinueTasks(ws);
        break;
      case 'task-finished':
        console.log('Task has finished');
        ws.close();
        fileStream.end(() => {
          console.log('File stream has been closed');
        });
        break;
      case 'task-failed':
        console.error('Task failed: ', message.header.error_message);
        ws.close();
        fileStream.end(() => {
          console.log('File stream has been closed');
        });
        break;
      default:
        // You can handle result-generated here
        break;
    }
  }
});

function sendContinueTasks(ws) {

  if (taskStarted) {
    // Send the continue-task command. When using the SSML feature, this command can be sent only once.
    const continueTaskMessage = JSON.stringify({
      header: {
        action: 'continue-task',
        task_id: taskId,
        streaming: 'duplex'
      },
      payload: {
        input: {
          // Special characters need to be escaped
          text: '<speak rate="2">My speaking rate is faster than a normal person\'s.</speak>'
        }
      }
    });
    ws.send(continueTaskMessage);

    // Send the finish-task command
    const finishTaskMessage = JSON.stringify({
      header: {
        action: 'finish-task',
        task_id: taskId,
        streaming: 'duplex'
      },
      payload: {
        input: {}
      }
    });
    ws.send(finishTaskMessage);
  }
}

ws.on('close', () => {
  console.log('Disconnected from the WebSocket server');
});
```

Java (WebSocket)

Para Java, recomendamos usar o [Java SDK] (/api-reference/speech-synthesis/cosyvoice/java-sdkEm vez disso.

O exemplo seguinte de Java WebSocket requer essas dependências:

- `Java-WebSocket`
- `jackson-databind`

Use Maven ou Gradle para gerenciar dependências:



  ```xml pom.xml
  <dependencies>
    <!-- WebSocket Client -->
    <dependency>
      <groupId>org.java-websocket</groupId>
      <artifactId>Java-WebSocket</artifactId>
      <version>1.5.3</version>
    </dependency>

    <!-- JSON Processing -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.0</version>
    </dependency>
  </dependencies>
  ```

  ```gradle build.gradle
  // Omit other code
  dependencies {
    // WebSocket Client
    implementation 'org.java-websocket:Java-WebSocket:1.5.3'
    // JSON Processing
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0'
  }
  // Omit other code
  ```



 Código Java:

```java
import com.fasterxml.jackson.databind.ObjectMapper;

import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.*;

/**
 * SSML feature notes:
 *     1. When sending the run-task command, set the enable_ssml parameter to true to enable SSML support.
 *     2. Send the text that contains SSML by using the continue-task command. You can send this command only once.
 *     3. Only cloned voices of the qwen-audio-3.0-tts-flash, qwen-audio-3.0-tts-plus, cosyvoice-v3-flash, and cosyvoice-v3-plus models, as well as system voices marked as SSML-supported in the voice list, support the SSML feature (for example, the longanyang voice of the cosyvoice-v3-flash model).
 */
public class TTSWebSocketClient extends WebSocketClient {
    private final String taskId = UUID.randomUUID().toString();
    private final String outputFile = "output_" + System.currentTimeMillis() + ".mp3";
    private boolean taskFinished = false;

    public TTSWebSocketClient(URI serverUri, Map<String, String> headers) {
        super(serverUri, headers);
    }

    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        System.out.println("Connection successful");

        // Send run-task command
        // If enable_ssml is set to true, you can send the continue-task command only once.
        // Otherwise, you will get the error "Text request limit violated, expected 1."
        String runTaskCommand = "{ \"header\": { \"action\": \"run-task\", \"task_id\": \"" + taskId + "\", \"streaming\": \"duplex\" }, \"payload\": { \"task_group\": \"audio\", \"task\": \"tts\", \"function\": \"SpeechSynthesizer\", \"model\": \"cosyvoice-v3-flash\", \"parameters\": { \"text_type\": \"PlainText\", \"voice\": \"longanyang\", \"format\": \"mp3\", \"sample_rate\": 22050, \"volume\": 50, \"rate\": 1, \"pitch\": 1, \"enable_ssml\": true }, \"input\": {} }}";
        send(runTaskCommand);
    }

    @Override
    public void onMessage(String message) {
        System.out.println("Received message from server: " + message);
        try {
            // Parse JSON message
            Map<String, Object> messageMap = new ObjectMapper().readValue(message, Map.class);

            if (messageMap.containsKey("header")) {
                Map<String, Object> header = (Map<String, Object>) messageMap.get("header");

                if (header.containsKey("event")) {
                    String event = (String) header.get("event");

                    if ("task-started".equals(event)) {
                        System.out.println("Received task-started event from server");

                        // Send the continue-task command. When using the SSML feature, this command can be sent only once.
                        // Special characters need to be escaped.
                        sendContinueTask("<speak rate=\\\"2\\\">My speaking rate is faster than a normal person's.</speak>");

                        // Send the finish-task command
                        sendFinishTask();
                    } else if ("task-finished".equals(event)) {
                        System.out.println("Received task-finished event from server");
                        taskFinished = true;
                        closeConnection();
                    } else if ("task-failed".equals(event)) {
                        System.out.println("Task failed: " + message);
                        closeConnection();
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("An exception occurred: " + e.getMessage());
        }
    }

    @Override
    public void onMessage(ByteBuffer message) {
        System.out.println("Size of received binary audio data: " + message.remaining());

        try (FileOutputStream fos = new FileOutputStream(outputFile, true)) {
            byte[] buffer = new byte[message.remaining()];
            message.get(buffer);
            fos.write(buffer);
            System.out.println("Audio data has been written to the local file " + outputFile);
        } catch (IOException e) {
            System.err.println("Failed to write audio data to local file: " + e.getMessage());
        }
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("Connection closed: " + reason + " (" + code + ")");
    }

    @Override
    public void onError(Exception ex) {
        System.err.println("Error: " + ex.getMessage());
        ex.printStackTrace();
    }

    private void sendContinueTask(String text) {
        String command = "{ \"header\": { \"action\": \"continue-task\", \"task_id\": \"" + taskId + "\", \"streaming\": \"duplex\" }, \"payload\": { \"input\": { \"text\": \"" + text + "\" } }}";
        send(command);
    }

    private void sendFinishTask() {
        String command = "{ \"header\": { \"action\": \"finish-task\", \"task_id\": \"" + taskId + "\", \"streaming\": \"duplex\" }, \"payload\": { \"input\": {} }}";
        send(command);
    }

    private void closeConnection() {
        if (!isClosed()) {
            close();
        }
    }

    public static void main(String[] args) {
        try {
            // If you have not configured an environment variable, replace the following line with: String apiKey = "sk-xxx"
            String apiKey = System.getenv("DASHSCOPE_API_KEY");
            if (apiKey == null || apiKey.isEmpty()) {
                System.err.println("Please set the DASHSCOPE_API_KEY environment variable");
                return;
            }

            Map<String, String> headers = new HashMap<>();
            headers.put("Authorization", "bearer " + apiKey);
            TTSWebSocketClient client = new TTSWebSocketClient(new URI("wss://maas.qwencloudapi.com/api-ws/v1/inference/"), headers);

            client.connect();

            while (!client.isClosed() && !client.taskFinished) {
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            System.err.println("Failed to connect to WebSocket service: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
```

Python (WebSocket)

Para Python, recomendamos usar o [Python SDK] (/api-reference/speech-synthesis/cosyvoice/python-sdkEm vez disso.

 Instale dependências antes de executar o exemplo:

```bash
pip uninstall websocket-client
pip uninstall websocket
pip install websocket-client
```



   Não nomeie seu arquivo Python `websocket.py`.  Isso causa `AttributeError: module 'websocket' has no attribute 'WebSocketApp'`.



```python
# SSML feature notes:
#     1. When sending the run-task command, set the enable_ssml parameter to true to enable SSML support.
#     2. Send the text that contains SSML by using the continue-task command. You can send this command only once.
#     3. Only cloned voices of the qwen-audio-3.0-tts-flash, qwen-audio-3.0-tts-plus, cosyvoice-v3-flash, and cosyvoice-v3-plus models, as well as system voices marked as SSML-supported in the voice list, support the SSML feature (for example, the longanyang voice of the cosyvoice-v3-flash model).

import websocket
import json
import uuid
import os
import time

class TTSClient:
  def __init__(self, api_key, uri):
    """
  Initializes the TTSClient instance.

  Parameters:
    api_key (str): The API key for authentication.
    uri (str): The WebSocket service address.
  """
    self.api_key = api_key  # Replace with your API key.
    self.uri = uri  # Replace with your WebSocket address.
    self.task_id = str(uuid.uuid4())  # Generate a unique task ID.
    self.output_file = f"output_{int(time.time())}.mp3"  # Output audio file path.
    self.ws = None  # WebSocketApp instance.
    self.task_started = False  # Whether task-started is received.
    self.task_finished = False  # Whether task-finished/task-failed is received.

  def on_open(self, ws):
    """
  Callback function when the WebSocket connection is established.
  Sends the run-task command to start the speech synthesis task.
  """
    print("WebSocket connection established")

    # Construct the run-task command.
    run_task_cmd = {
      "header": {
        "action": "run-task",
        "task_id": self.task_id,
        "streaming": "duplex"
      },
      "payload": {
        "task_group": "audio",
        "task": "tts",
        "function": "SpeechSynthesizer",
        "model": "cosyvoice-v3-flash",
        "parameters": {
          "text_type": "PlainText",
          "voice": "longanyang",
          "format": "mp3",
          "sample_rate": 22050,
          "volume": 50,
          "rate": 1,
          "pitch": 1,
          # With enable_ssml: true, send continue-task only once
          "enable_ssml": True
        },
        "input": {}
      }
    }

    # Send the run-task command.
    ws.send(json.dumps(run_task_cmd))
    print("run-task command sent")

  def on_message(self, ws, message):
    """
  Callback function when a message is received.
  Handles text and binary messages separately.
  """
    if isinstance(message, str):
      # Process JSON text messages.
      try:
        msg_json = json.loads(message)
        print(f"Received JSON message: {msg_json}")

        if "header" in msg_json:
          header = msg_json["header"]

          if "event" in header:
            event = header["event"]

            if event == "task-started":
              print("Task started")
              self.task_started = True

              # Send the continue-task command. When using the SSML feature, this command can be sent only once.
              # Special characters need to be escaped.
              self.send_continue_task("<speak rate=\"2\">My speaking rate is faster than a normal person's.</speak>")

              # Send finish-task after continue-task is sent.
              self.send_finish_task()

            elif event == "task-finished":
              print("Task finished")
              self.task_finished = True
              self.close(ws)

            elif event == "task-failed":
              error_msg = msg_json.get("error_message", "Unknown error")
              print(f"Task failed: {error_msg}")
              self.task_finished = True
              self.close(ws)

      except json.JSONDecodeError as e:
        print(f"JSON parsing failed: {e}")
    else:
      # Process binary messages (audio data).
      print(f"Received binary message, size: {len(message)} bytes")
      with open(self.output_file, "ab") as f:
        f.write(message)
      print(f"Audio data has been written to the local file {self.output_file}")

  def on_error(self, ws, error):
    """Callback on error."""
    print(f"WebSocket error: {error}")

  def on_close(self, ws, close_status_code, close_msg):
    """Callback on close."""
    print(f"WebSocket closed: {close_msg} ({close_status_code})")

  def send_continue_task(self, text):
    """Sends the continue-task command with the text to be synthesized."""
    cmd = {
      "header": {
        "action": "continue-task",
        "task_id": self.task_id,
        "streaming": "duplex"
      },
      "payload": {
        "input": {
          "text": text
        }
      }
    }

    self.ws.send(json.dumps(cmd))
    print(f"Sent continue-task command, text content: {text}")

  def send_finish_task(self):
    """Sends the finish-task command to end the speech synthesis task."""
    cmd = {
      "header": {
        "action": "finish-task",
        "task_id": self.task_id,
        "streaming": "duplex"
      },
      "payload": {
        "input": {}
      }
    }

    self.ws.send(json.dumps(cmd))
    print("Sent finish-task command")

  def close(self, ws):
    """Actively closes the connection."""
    if ws and ws.sock and ws.sock.connected:
      ws.close()
      print("Connection actively closed")

  def run(self):
    """Starts the WebSocket client."""
    # Set request headers (authentication).
    header = {
      "Authorization": f"bearer {self.api_key}",
      "X-DashScope-DataInspection": "enable"
    }

    # Create a WebSocketApp instance.
    self.ws = websocket.WebSocketApp(
      self.uri,
      header=header,
      on_open=self.on_open,
      on_message=self.on_message,
      on_error=self.on_error,
      on_close=self.on_close
    )

    print("Listening for WebSocket messages...")
    self.ws.run_forever()  # Start the persistent connection listener.

# Example usage
if __name__ == "__main__":
  # If you have not configured an environment variable, replace the following line with: API_KEY = "sk-xxx"
  API_KEY = os.environ.get("DASHSCOPE_API_KEY")
  SERVER_URI = "wss://maas.qwencloudapi.com/api-ws/v1/inference/"

  client = TTSClient(API_KEY, SERVER_URI)
  client.run()
```

Referência da etiqueta

CosyVoice SSML é baseado em [W3C SSML 1.0] (https://www.w3.org/TR/speech-synthesis/) mas suporta apenas um subconjunto de etiquetas.

Regras de sintaxe:

<speak>"Raiz tag"

Descrição

Enrole todo o conteúdo SSML em <speak></speak> Marcas.

Sintax

<speak>Text that requires SSML features</speak>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

FundoMúsicaVolume # #Cordas # # Não # volume de música de fundo.

*Exemplos *

Voz:

<speak voice="longcheng_v2">
  I am a male voice.
</speak>

Taxa:

<speak rate="2">
  My speech rate is faster than normal.
</speak>
<speak pitch="0.5">
  However, my pitch is lower than others.
</speak>

Volume:

<speak volume="80">
  My volume is also very high.
</speak>

Efeito:

<speak effect="robot">
  Do you like the robot WALL-E?
</speak>

Efeito com efeitoValor:

<speak effect="eq" effectValue="1 -20 1 1 1 1 20 1">
  Do you like the robot WALL-E?
</speak>

<speak effect="lpfilter" effectValue="1200">
  Do you like the robot WALL-E?
</speak>

<speak effect="hpfilter" effectValue="1200">
  Do you like the robot WALL-E?
</speak>

Se o áudio não estiver em formato WAV, converta-o com ffmpeg:

ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav

Música de fundo.

<speak bgm="http://nls.alicdn.com/bgm/2.wav" backgroundMusicVolume="30" rate="-500" volume="40">
  <break time="2s"/>
  The old trees on the shady cliff are shrouded in mist
  <break time="700ms"/>
  The sound of rain is still in the bamboo forest
  <break time="700ms"/>
  I know that cotton contributes to the country's plan
  <break time="700ms"/>
  The scenery of Mianzhou is always pitiable
  <break time="2s"/>
</speak>

Você é legalmente responsável pelos direitos autorais do áudio carregado.

Propriedades combinadas:

<speak>
  Text that requires SSML tags
</speak>
<speak rate="200" pitch="-100" volume="80">
  So when put together, my voice sounds like this.
</speak>

<break>Pausa

Descrição

Sintax

# Empty attribute
<break/>
# With the time attribute
<break time="string"/>

Por exemplo, estas três etiquetas totalizam 15 segundos, mas apenas os primeiros 10 segundos fazem efeito:

<speak>
  Please close your eyes and take a rest.<break time="5s"/><break time="5s"/><break time="5s"/>Okay, please open your eyes.
</speak>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

Exemplo

<speak>
  Please close your eyes and take a rest.<break time="500ms"/>Okay, please open your eyes.
</speak>

<sub> Substituir texto

Descrição

Substituir texto exibido por uma pronúncia diferente.

Sintax

<sub alias="string"></sub>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

Exemplo

<speak>
   <sub alias="network protocol">W3C</sub>
 </speak>

<phoneme>- Anunciar

Descrição

Especifique pronúncia usando Pinyin (chinês) ou o alfabeto fonético CMU (inglês).

Sintax

<phoneme alphabet="string" ph="string">text</phoneme>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

Exemplo

<speak>
  去<phoneme alphabet="py" ph="dian3 dang4 hang2">典当行</phoneme>把这个玩意<phoneme alphabet="py" ph="dang4 diao4">当掉</phoneme>
</speak>

<speak>
  How to spell <phoneme alphabet="cmu" ph="S AY N">sin</phoneme>?
</speak>

<soundEvent>Introduza um efeito sonoro

Descrição

Insira um arquivo de som externo (tons prompt, sons ambientais) em uma fala sintetizada.

Sintax

<soundEvent src="URL"/>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

Se o áudio não estiver em formato WAV, converta-o com ffmpeg:

ffmpeg -i input_audio -acodec pcm_s16le -ac 1 -ar 16000 output.wav

Você é legalmente responsável pelos direitos autorais do áudio carregado.

Exemplo

<speak>
  A horse was frightened<soundEvent src="http://nls.alicdn.com/sound-event/horse-neigh.wav"/>and people scattered to avoid it.
</speak>

<say-as>- Defina o formato de leitura.

Descrição

Especifique como o texto é lido (como números, datas, números de telefone, etc.).

Sintax

<say-as interpret-as="string">text</say-as>

? Propriedades ?

Ver a tabela estruturada nos quadros de referência desta página ↓

Cardeal.

Formatos suportados para cardinal:

Número de cordas começando com zero # 0145 # Cento e quarenta e cinco

Sinal negativo + número de corda 145 menos 45

Fio de números de três dígitos separados por vírgulas # 60.000 # 60 mil

Sinal negativo + cadeia de números de três dígitos separados por vírgulas -208.000 -208 mil Número de corda + ponto decimal + zero Número de corda + ponto decimal + número de corda 12,34 ,12 ponto três quatro, ..Três dígitos de número de cadeia separados por vírgulas + ponto decimal + número de cadeia .. 1.000,1 .. mil ponto um .. Sinal negativo + corda de número + ponto decimal + corda de número Sinal negativo + cadeia de números de três dígitos separados por vírgulas + ponto decimal + corda de números Número de cadeias de números (separadas por vírgulas de três dígitos) + hífen + número de vírgulas de três dígitos 1-1.000 , um a mil Outras leituras padrão 012.34 12,3-4 1/2, metade 3/4 menos 3/4 5,1/6, 5 pontos 1 sobre 6 3 1/2 menos 3 e meio 1000,3^3 mil ponto três para o poder de três 309.1 3 vezes 10 ao poder de 9 pontos 1 23,10% 23,3 pontos um por cento

Exemplo

<speak>
  <say-as interpret-as="cardinal">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="cardinal">10234</say-as>
</speak>
dígitos

Formatos suportados para digits:

Exemplo

<speak>
  <say-as interpret-as="digits">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="digits">10234</say-as>
</speak>
Telefone

Formatos suportados para telephone:

Exemplo

<speak>
  <say-as interpret-as="telephone">12345</say-as>
</speak>
<speak>
  <say-as interpret-as="telephone">10234</say-as>
</speak>
Nome

Exemplo

<speak>
  Her former name is <say-as interpret-as="name">Zeng Xiaofan</say-as>
</speak>
Endereço

Não é suportado para texto inglês.

Exemplo

<speak>
  <say-as interpret-as="address">Fulu International, Building 1, Unit 3, Room 304</say-as>
</speak>
ID

Para o texto em inglês, isso funciona da mesma forma que characters.

Exemplo

<speak>
  <say-as interpret-as="id">myid_1998</say-as>
</speak>
personagens

Formatos suportados para characters:

Exemplo

<speak>
  <say-as interpret-as="characters">Greek letters αβ</say-as>
</speak>
<speak>
  <say-as interpret-as="characters">*b+3.c$=α</say-as>
</speak>
pontuação

Para o texto em inglês, isso funciona da mesma forma que characters.

Exemplo

<speak>
  <say-as interpret-as="punctuation"> -./:;</say-as>
</speak>
Data

Formatos suportados para date:

Exemplo

<speak>
  <say-as interpret-as="date">1000-10-10</say-as>
</speak>
<speak>
  <say-as interpret-as="date">10-01-2020</say-as>
</speak>
Tempo

Formatos suportados para time:

Exemplo

<speak>
  <say-as interpret-as="time">5:00am</say-as>
</speak>
<speak>
  <say-as interpret-as="time">0500</say-as>
</speak>
Moeda

Formatos suportados para currency:

Exemplo

<speak>
  <say-as interpret-as="currency">13,000,000.00RMB</say-as>
</speak>
<speak>
  <say-as interpret-as="currency">$1,000.01</say-as>
</speak>
Mede.

Formatos suportados para measure:

Exemplo

<speak>
  <say-as interpret-as="measure">100m12cm6mm</say-as>
</speak>
<speak>
  <say-as interpret-as="measure">1,000.01kg</say-as>
</speak>
Pronuncias de símbolos

Pronunciações comuns de símbolos para <say-as>:

Ver a tabela estruturada nos quadros de referência desta página ↓

# Libra

Dollar Por cento

E #

? ' ' ? citação esquerda Parenteses esquerdas Parentes direito

# Mais # # Mais

? , ? vírgula ?

# Ponto #

Deslizando

? ? ? ? ? ? ? ? ? ? ? ponto e vírgula ? | < | less than | | = | equals | | > ? maior que ? Ponto de interrogação ♪ ♪ ♪ ♪ em ♪ ♪ ♪ ♪ Suporte esquerdo ♪ ? ? ? ? ? ? ? ? ? ? ? ?

# Suporte direito

# Caret # # Caret

Oh, eu não sei

# Recuar #

| \{ , , esquerda aparelho Barra vertical | \} Certo, certo, certo ♪ ♪ ♪ ♪ tilde ♪

Largura total e símbolos especiais:

Ver a tabela estruturada nos quadros de referência desta página ↓

# Enumeração vírgula

# Elipse

Elipse ♪ ♪ ♪ ♪ esquerda guillemet ♪ ♪ ♪ ♪ ♪ certo guillemet ♪ ♪ ♪ ♪ ♪ Yuan ♪ ? ≥ ? maior ou igual a ? ? ≤ ? menor ou igual a ? Não é igual , aproximadamente igual

# Mais ou menos

? × ? vezes

# Eu não sei #

Ver a tabela estruturada nos quadros de referência desta página ↓

O Tau

♪ ♪ ♪ ♪ upsilon ♪ ? ? ? ? ? ? ? ? ? ? ? ? ♪ ♪ ♪ ♪ ♪ ♪ ♪ ♪ .. .. ? ? ? ? ômega ? ?

Ver a tabela estruturada nos quadros de referência desta página ↓

# Não é eta

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ♪ ♪ ♪ ♪ Iota ♪ ♪ ♪ ♪ ♪ kappa ♪ ? ? ? lambda ?

# # Eu não posso #

# Não

♪ ♪ ♪ ♪ ♪ Ksi ♪ Omicron

# Eu não sei #

♪ ♪ ♪ ♪ ♪ ♪ Rho ♪ σ σ Okayma ? ? ? ? tau ? ♪ ♪ ♪ upsilon ♪ ? ? ? ? ? ? ? ? ? ? ? ? χ χ χ chi . .. .. .. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Unidades comuns de medida

Unidades comuns para <say-as>:

Ver a tabela estruturada nos quadros de referência desta página ↓

LaTeX para falar.

CosyVoice converte fórmulas matemáticas incorporadas em texto para fala natural para audiolivros, educação online, e outros conteúdos de áudio em matemática e física.

Esta característica só suporta chinês. Fórmulas podem não ser pronunciadas corretamente em outras línguas. Exemplos de pronúncia neste guia são traduções em inglês e não representam o desempenho real da síntese.

Limitações

Steps

Embrulhe as fórmulas em seu texto com separadores específicos, e então chame a API de síntese de fala.

<Steps> <Step title="Mark formulas with separators"> Enrole fórmulas com qualquer um desses separadores (todos produzem resultados idênticos):

- `$...$`
- `$$...$$`
- `\(...\)`
- `\[...\]`

Example:

``` Texto simples
 Aqui está a fórmula quadrática: $x = \frac{-b\sqrt\sqrt{b^2-4ac} {2a} $. Calcule com cuidado.
```

</Step>

<Step title="Call the API to request speech synthesis"> Chame a API de síntese de fala com suas fórmulas marcadas. Em JSON ou cordas literais, a contra-ataque (\) is an escape character — write it as \\.

Example call (in Python):

```Python
#  Código=utf-8

 Importação de os
 Importar o dashscope
Da Dashscope.audio.tts_v2 importa

# Defina sua chave de API (formato: sk-xxx). Se não for definido como Env Var, descomente a próxima linha:
# Dashscope. Api_key = "sk-xxx"
- Dashscope. - Api-key = Os.environ.

Dashscope. Base_websocket_api_url='wss://maas.qwencloudapi.com/api-ws/v1/inference'

#  Modelo
 Modelo = "cosyvoice-v3-flash"
# Voz (deve ser compatível com sua versão modelo)
#   cosyvoice-v3-flash/plusLonganyang, etc.
Voz = "longanyang"

# Sintetizador instantâneo com modelo e voz
Sintetizador de voz
#  Envie texto e obtenha áudio binário.
Audio = sintetizador.call ("Esta é a fórmula quadrática: $x =\\frac{-b\\pm\\sqrt{b^2-4ac}}}$. Calculem com cuidado.
#  Primeiro pedido inclui tempo de configuração de conexão WebSocket
 Primeiro pacote de atraso:
  Sintético.
  Sintizer.get_first_package_delay())

#  Salve áudio em um arquivo local
com "output.mp3", "wb" como f:
  F. Write (áudio)
```

Marcas e símbolos suportados

As etiquetas e símbolos atualmente suportados estão listados abaixo.

Matemática básica

Ver a tabela estruturada nos quadros de referência desta página ↓

# Root # # Root # \sqrt{9} = 3 | $\sqrt {9} = 3$ A raiz quadrada de nove é igual a três

# Root # # Root # \sqrt[3]{8} = 2 | $\sqrt[3]{8} = 2$ A raiz cúbica de oito é igual a dois

Percentagem 5\% | $5\%$ ? Cinco por cento ? Valor absoluto ∣3∣=3 | $\ | 3\ | =3$ O valor absoluto de três é igual a três ♪ ♪ verte ♪ ♪ Valor absoluto ♪ 3\vert=3 | $\vert 3\vert =3$ O valor absoluto de três é igual a três Logaritmo lg {10} | $\lg {10}$ ♪ ♪ log dez ♪ Logaritmo \log{5} | $\log{5}$ Diário cinco Logaritmo natural \lnX | $ln {10}$ LN 10 Fatorial 5! $5!$ Cinco fatorials. Parenteses (2+1) $(2+1)$ Dois mais um entre parênteses | \{ \} ? Braces ? \{2+1\} | $\{2+1\}$ Abra o aparelho dois mais um aparelho próximo

Símbolos matemáticos especiais.

Ver a tabela estruturada nos quadros de referência desta página ↓

Gamma gama # $\gamma$ ? gama ?

Gamma gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama gama $\Gamma$ ? gama ? Delta $\delta$ Delta Delta Delta $\Delta$ Delta Inquieto infinito (chinês) $\infty$ Infinito ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $∞$ Infinito

Geometria

Ver a tabela estruturada nos quadros de referência desta página ↓

Condições

Ver a tabela estruturada nos quadros de referência desta página ↓

Unidades.

As unidades devem ser enroladas com \unit, \quantity, \mathit, \mathrm, ou \rm -Etiquetas (como \unit{cm}).

Ver a tabela estruturada nos quadros de referência desta página ↓

G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G 5\quantity{g} | $5\quantity{g}$ 5 gramas

Kg, quilograma 5\quantity{kg} | $5\quantity{kg}$ 5 kg.

T t t ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã 5\quantity{t} | $5\quantity{t}$ 5 toneladas

mm^2 , milímetros quadrados 5\quantity{mm^2} | $5\quantity{mm^2}$ 5 milímetros quadrados

# cm^2 # # centímetros quadrados # 5\quantity{cm^2} | $5\quantity{cm^2}$ 5 centímetros quadrados

Decimeter quadrado 5\quantity{dm^2} | $5\quantity{dm^2}$ 5 decimômetros quadrados Ângulo de metros quadrados 5\quantity{m^2} | $5\quantity{m^2}$ 5 metros quadrados quilômetro quadrado 5\quantity{km^2} | $5\quantity{km^2}$ 5 quilômetros quadrados mm^3 mm cúbico 5\quantity{mm^3} | $5\quantity{mm^3}$ 5 milímetros cúbicos Cemcm3cm cúbico 5\quantity{cm^3} | $5\quantity{cm^3}$ 5 centímetros cúbicos Decimeter cúbico 5\quantity{dm^3} | $5\quantity{dm^3}$ 5 decimômetros cúbicos ÂMBITO DE MÉXIO 5\quantity{m^3} | $5\quantity{m^3}$ 5 metros cúbicos quilômetro cúbico 5\quantity{km^3} | $5\quantity{km^3}$ 5 quilômetros cúbicos , ml, mililitro 5\quantity{ml} | $5\quantity{ml}$ 5 mililitros É o segundo 5\quantity{s} | $5\quantity{s}$ 5 segundos Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min Min 5\quantity{min} | $5\quantity{min}$ 5 minutos Hora 5\quantity{h} | $5\quantity{h}$ 5 horas ? km/h ? quilômetros por hora ? 5\quantity{km/h} | $5\quantity{km/h}$ 5 quilômetros por hora G/l, gramas por litro 5\quantity{g/l} | $5\quantity{g/l}$ 5 gramas por litro

FAQ

Por que a fórmula que eu inscrevi não é lida?

  1. Separadores: $...$, $$...$$, \(...\), ou \[...\]
  2. Complexidade de fórmula: Garanta que a fórmula use apenas tags e símbolos suportados
  3. ** Personagens de fuga:** Confirme contra-ataques (\) são escapados como \\ em pedidos de API

Como eu lido com a contra-ataque?\) no meu código?

A contra-ataque (\) é um personagem de fuga em cordas literais e JSON. Fuja como se \\. Exemplo: escreva \frac Como \\frac em Python, Java, JavaScript e idiomas similares.

Quadros de referência

Tabelas restauradas a partir da referência original; a ordem das colunas e os valores técnicos foram preservados.

Quadro 1

Propriedade Tipo Obrigatório Descrição
Voz Cordas Não Nome de voz. Sobrepõe ovoiceParâmetro API. Veja. Lista de voz.
Taxa Cordas Não Taxa de fala. Sobrepõe ospeech_rateParâmetro API. Distância: 0,5 a 2. Predefinição: 1. Valores acima de 1 são mais rápidos, abaixo de 1 são mais lentos.
Arremesso Cordas Não -Pitch. Sobrepõe opitch_rateParâmetro API. Distância: 0,5 a 2. Predefinição: 1. Valores acima de 1 são maiores, abaixo de 1 são menores.
volume Cordas Não Volume. Sobrepõe ovolumeParâmetro API. Distância: 0 a 100. Predefinição: 50.
efeito Cordas Não Efeito sonoro. Valores:robot,lolita(voz vivamente feminina),lowpass,echo,eq(Equalizador, avançado),lpfilter(filtro de passagem baixa, avançado),hpfilter(filtro de passagem alta, avançado). UseeffectValuepara personalizareq,lpfilter, ehpfilter. Só um efeito por tag. Os efeitos sonoros aumentam a latência.
EfeitoValue Cordas Não Personaliza oeffect. Poreq Uma cadeia de 8 inteiros separados por espaço (20 a 20) para ganhar em["40 Hz", "100 Hz", "200 Hz", "400 Hz", "800 Hz", "1600 Hz", "4000 Hz", "12000 Hz"]. Exemplo:"1 1 1 1 1 1 1 1". PorlpfilterFreqüência inteira em (0, taxa de amostragem/2]. Exemplo:"800". PorhpfilterFreqüência inteira em (0, taxa de amostragem/2]. Exemplo:"1200".
bgm Cordas Não URL de música de fundo. O arquivo deve estar na OSS com pelo menos permissão de leitura pública. Escapar de caracteres especiais XML na URL. Requisitos: taxa de amostragem de 16 kHz, mono, WAV, 16 bits. Se o áudio sintetizado é maior que a música, a música se loops.
A música Volume Cordas Não Volume de música de fundo.

Quadro 2

Propriedade Tipo Obrigatório Descrição
Tempo Cordas Não A duração da pausa, como"2s"or"50ms". Em segundos: 1 a 10. Em milissegundos: 50 a 10000.

Quadro 3

Propriedade Tipo Obrigatório Descrição
Alias Cordas Sim O texto para ler em vez disso.

Quadro 4

Propriedade Tipo Obrigatório Descrição
alfabeto Cordas Sim Tipo de pronúncia:"py"(Pinyin) ou"cmu"(Alfabeto fonético). Veja.O Dicionário de Proclamação da CMU.
ph Cordas Sim Os símbolos fonéticos ou Pinyin. Separe Pinyin de cada personagem com um espaço. O número de sílabas deve corresponder ao número de caracteres. Cada sílaba tem um número de tom (1 a 5, onde 5 é neutro).

Quadro 5

Propriedade Tipo Obrigatório Descrição
Src. Cordas Sim URL de áudio. O arquivo deve estar na OSS com pelo menos permissão de leitura pública. Escapar de caracteres especiais XML na URL. Requisitos: taxa de amostragem de 16 kHz, mono, WAV, 16 bits, máx. 2 MB.

Quadro 6

Propriedade Tipo Obrigatório Descrição
interpret-as Cordas Sim Tipo texto. Valores:cardinal(número),digits(dígitos individuais),telephone(número de telefone),name,address,id(nome da conta/nickname),characters(caracter por personagem),punctuation,date,time,currency,measure(unidade de medida).

Quadro 7

Formato Exemplo Saída em inglês Descrição
Número de sequência 145 Cento e quarenta e cinco. Alcance inteiro: até 13 dígitos, [-999999999999], 999999999]. Decimal: até 13 dígitos inteiros, até 10 dígitos decimais.
Número de cordas começando com zero 0145 Cento e quarenta e cinco.
Sinal negativo + número de corda -145 - Menos cento e quarenta e cinco.
Fio de números de três dígitos separados por vírgulas. 60,000 60 mil.
Sinal negativo + três dígitos de número de corda separados por vírgulas -208,000 menos duzentos e oito mil.
Número string + ponto decimal + zero 12.00 Doze.
Número string + ponto decimal + número string 12.34 12 ponto 3-4
string de número de três dígitos separados por vírgulas + ponto decimal + string de número 1,000.1 Mil ponto um.
Sinal negativo + número de corda + ponto decimal + número de corda -12.34 - 12,3-4.
Sinal negativo + string de número de três dígitos separados por vírgulas + ponto decimal + string de número -1,000.1 menos mil ponto um.
Número de corda + hífen + (três dígitos vírgula-separado) número 1-1,000 de um a mil
Outras leituras padrão 012.34 12 ponto 3-4
1/2 uma metade
-3/4 - Menos três quartos.
5.1/6 5 pontos 1 sobre 6
-3 1/2 menos três e meio
1,000.3^3 Mil ponto três para o poder de três
3e9.1 Três vezes dez para o poder de nove ponto um.
23.10% 23 pontos 1 por cento.

Quadro 8

Formato Exemplo Saída em inglês Descrição
Número de sequência 12034 Um, dois, zero, três, quatro. Sem limite de comprimento restrito, mas mantenha menos de 20 caracteres.
Número string + espaço ou hífen + número string + ... 1-23-456 7890 Um, dois, três, quatro, cinco, seis, sete, oito, nove, zero.

Quadro 9

Formato Exemplo Saída em inglês Descrição
Número de sequência 12034 Um dois oh três quatro Sem limite de comprimento restrito, mas mantenha menos de 20 caracteres.
Número string + espaço ou hífen + número string + ... 1-23-456 7890 Um, dois, três, quatro, cinco, seis, sete, oito, nove, oh
Mais sinal + número de corda + espaço ou hífen + número de corda +43-211-0567 mais quatro três, dois um um, oh cinco seis sete
Parêntesis esquerdo + número de corda + parêntesis direito + espaço + número de corda + espaço ou hífen + número de corda (21) 654-3210 (dois um) seis cinco quatro, três dois um oh

Quadro 10

Formato Exemplo Saída em inglês Descrição
string *b+3$.c-0'=α Asterisco B mais 3 dólares C traço zero apóstrofo é igual a alfa Suporta caracteres chineses, letras inglesas, dígitos 0-9, e símbolos comuns.

Quadro 11

Formato Exemplo Saída em inglês Descrição
Quatro dígitos/dois dígitos ou quatro dígitos-dois dígitos 2000/01 Dois mil, oh um O ano se estende.
1900-01 1900, oh um
2001-02 Vinte e um, oh dois
2019-20 Vinte e dezenove, vinte.
1998-99 19, noventa e oito, noventa e nove
1999-00 19, noventa e nove, oh oh
Número de quatro dígitos começando com 1 ou 2 2000 Dois mil. Ano de quatro dígitos.
1900 19h00
1905 Dezenove oh cinco
2021 Vinte e vinte e um
Dia da semana-Dia da semana ou Dia da semana-Dia da semana ou Dia da semana-Dia da semana mon-wed Segunda a quarta-feira Escapar de caracteres especiais XML em separadores de alcance.
Você está bem? Terça-feira a sexta-feira
SAT&SUN Sábado e domingo
DD-DD MMM, AAAA ou DD~DD MMM, AAAA ou DD&DD MMM, AAAA 19-20 de janeiro de 2000 Dezenove a 20 de janeiro, dois mil. DD = dia de dois dígitos. MMM = abreviatura de mês ou nome completo. YYYY = 4 dígitos ano.
01 ~ 10 jul, 2020 O primeiro ao décimo de julho, vinte e vinte.
05&06 Abr, 2009 O quinto e o sexto de abril dois mil nove
MMM DD-DD ou MMM DD~DD ou MMM DD&DD 01 de fevereiro de 03 Fevereiro, o primeiro ao terceiro. MMM = mês. DD = dia.
10-20 de agosto 10 de agosto ao 20o
Dec 11&12 11 DE DEZEMBRO E 12 DE DEZEMBRO
MMM-MMM ou MMM~MMM ou MMM&MMM Jan-Jun Janeiro a junho MMM = mês.
Jul-Dec Julho a dezembro
Sep&oct Setembro e outubro
YYYYYYY ou YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY 1990 - 2000 19, noventa a dois mil. YYYY = 4 dígitos ano começando com 1 ou 2.
2001-2021 Dois mil um a vinte e vinte e um
WWW DD MMM YYYY Sun 20 Nov 2011 Domingo, 20 de novembro, 23 de novembro. WWW = dia da semana (abreviatura ou cheia). DD = dia. MMM = mês. AAAA = ano.
WWW DD MMM Sun 20 Nov Domingo, 20 de novembro
WWW MMM DD YYYY Sun Nov 20 2011 Domingo, novembro, 20 e onze
WWW MMM DD Sun Nov 20 Domingo, novembro, 20
WWW YYYY-MM-DD Sáb 2010-10-01 Sábado, outubro, os primeiros vinte e dez.
WWW YYYY/MM/DD Sáb 2010/10/01 Sábado, outubro, os primeiros vinte e dez.
WWW MM/DD/AAAA Sun 11/20/2011 Domingo, novembro, 20 e onze
MM/DD/AAAA 11/20/2011 Novembro, 2021, 11
YYYY 1998 19, noventa e oito.
Outras leituras padrão 10 de março de 2001 O 10 de março, dois mil um.
10 Mar O décimo de março
Mar 2001 Marche dois mil um.
10/Mar/2001 Sexta-feira, 10 de março, 2 mil e um
10 de março de 2001 Marche o décimo dois mil um
10 de Mar. Marche o décimo
2001/03/10 Marche o décimo dois mil um
2001-03-10 Marche o décimo dois mil um
2000s Dois milhares.
2010's Vinte e dez.
1900's 19 centenas.
1990s 19 anos noventa.

Quadro 12

Formato Exemplo Saída em inglês Descrição
HH:MM AM or PM 09:00 AM Nove A M HH = hora (1-2 dígitos). MM = minuto (2 dígitos). AM/PM = manhã ou tarde.
09:03 PM 9 oh 3 P M
09:13 p.m. Nove e treze pm
HH:MM 21:00 Vinte e cem.
HHMM 100 Uma hora.
Ponto de tempo. 8:00 am - 05:30 pm 8 am a 5 pm Formatos de alcance temporal.
7:05~10:15 AM 7 a 10, 5 a 10, 15 A M.
09:00-13:00 das nove às trezecentas.

Quadro 13

Formato Exemplo Saída em inglês Descrição
Número + Identificador de moeda 1,00 RMB Um yuan Suporta números inteiros, decimais e milhares separados por vírgulas.
2.02 CNY Dois pontos zero dois yuan
1,000.23 CN¥ Mil, dois, três yuan.
1,01 SGD Um dólar de um só dia e um centavo.
2.01 CAD Dois dólares canadenses e um centavo.
3.1 HKD Três dólares Hong Kong e dez centavos
1.000,00 euros. Mil euros.
Identificador de moeda + Número US$ 1.00 Um dólar americano. Suporta números inteiros, decimais e milhares separados por vírgulas.
US$ 0.01 Um centavo.
JPY 1,01 Um iene japonês e um sen
£1.1 1 libra e 10 centavos.
€2.01 Dois euros e um centavo.
US$ 1.000. Mil dólares americanos.
Número + Quantificador + Identificador de moeda ou Identificador de moeda + Número + Quantificador 1,23 Tn RMB Um ponto dois, três trilhões de yuan. Quantificadores: mil, milhões, bilhões, trilhões, Mil, mil, K, k, Bn, bn, Tn, tn.
US$ 1.2 K Um ponto e dois mil dólares.

Quadro 14

Formato Exemplo Saída em inglês Descrição
Número + Unidade de medida 1.0 kg Um quilo de quilograma. Suporta números inteiros, decimais e milhares separados por vírgulas. Suporta abreviações comuns de unidades.
1,234.01 km Mil duzentos e trinta e quatro zero, um km.
Unidade de medida. mm2 milímetros quadrado

Quadro 15

Símbolo Pronunciação em inglês
! ponto de exclamação
" aspas duplas
# libra
$ Dólar
% Por cento
& e
' Citação esquerda
( Parêntesis esquerdo
) parêntesis direito.
* asterisco
+ Mais
, vírgula
- traço
. ponto
/ cortar
: - Não, não.
; ponto e vírgula
< Menos que
= igual a
> maior que o
? Ponto de interrogação
@ at
[ Suporte esquerdo
\ Retroceder
] Suporte direito
^ caret
_ sublinhando
` -Backtick.
\{ aparelho esquerdo
\
\} Certo, certo, certo.
~ Tilde

Quadro 16

Símbolo Pronunciação em inglês
! ponto de exclamação
\u201c esquerda duplo aspas
\u201d direita duplo aspas
\u2018 Citação esquerda
\u2019 Citação certa
( Parêntesis esquerdo
) parêntesis direito.
, vírgula
。 Parada total.
— Em desl
: - Não, não.
; ponto e vírgula
? Ponto de interrogação
、 Número vírgula
… elipse
…… elipse
《 esquerda guillemet
》 Certo, Guillemet.
¥ Yuan.
≥ maior ou igual a
≤ Menos ou igual a
≠ Não é igual.
≈ aproximadamente igual.
± mais ou menos
× Tempos
π pi

Quadro 17

Símbolo Pronunciação em inglês
Α Alfa.
Β beta
Γ gama
Δ Delta
Ε Épsilon
Ζ Zeta.
Θ Theta
Ι Iota.
Κ Kappa.
∧ Lambda.
Μ mu
Ν nu
Ξ KSI
Ο Omicron
∏ pi
Ρ Rho
∑ Sigma
Τ Tau.
Υ upsilon
Φ phi
Χ Chi.
Ψ Psi.
Ω ômega

Quadro 18

Símbolo Pronunciação em inglês
α Alfa.
β beta
γ gama
δ Delta
ε Épsilon
ζ Zeta.
η ETA
θ Theta
ι Iota.
κ Kappa.
λ Lambda.
μ mu
ν nu
ξ KSI
ο Omicron
π pi
ρ Rho
σ Sigma
τ Tau.
υ upsilon
φ phi
χ Chi.
ψ Psi.
ω ômega

Quadro 19

Categoria Unidades.
Comprimento nm (nanômetro), μm (micrometro), mm (milímetro), cm (centímetro), m (metro), km (quilômetro), ft (pé), em (polegada)
Área cm2 (centímetro quadrado), m2 (metro quadrado), km2 (quilômetro quadrado), SqFt (pé quadrado)
Volume cm3 (cmímetro cúbico), m3 (mímetro cúbico), km3 (quilômetro cúbico), ml (mililitro), L (litro), gal (galão)
Peso μg (micrograma), mg (miligrama), g (grama), kg (kilograma)
Tempo Mín. (minuto), segundo (segundo), ms (milissegundo)
Eletromagnetismo. μA (microamp), mA (miliamp), Hz (hertz), kHz (kilohertz), MHz (megahertz), GHz (gigahertz), V (volt), kV (kilovolt), kWh (hora de kilowatt)
Som dB (decibel)
Pressão atmosférica. Pa (pascal), kPa (kilopascal), MPa (megapascal)
Outro Também suporta unidades como Tsp (teaspoon), rpm (revoluções por minuto), KB (kilobyte), mmHg (milímetro de mercúrio), e muito mais.

Quadro 20

Marca ou símbolo Função Exemplo de conteúdo de fórmula Exemplo de entrada de fórmula Pronuncia
+ Adicionar 2 + 3 = 5 $2 + 3 = 5$ Dois mais três é igual a cinco.
- Subtrair 3 - 2 = 1 $3 - 2 = 1$ Três menos dois é igual a um.
\pm Mais ou menos, positivo ou negativo. \pm 1 \pm 2 $\pm 1\pm 2$ Mais ou menos um, mais ou menos dois
\ times Multiplicar 2 vezes 3 = 6 $2 \times 3 = 6$ Duas vezes três é igual a seis.
× Multiplicar 2 × 3 = 6 $$2 × 3 = 6$$ Duas vezes três é igual a seis.
* Multiplicar 2 * 3 = 6 \(2 * 3 = 6\) Duas vezes três é igual a seis.
\div Dividir 6\div2=3 \[6\div2=3\] Seis dividido por dois é igual a três
÷ Dividir 6÷2=3 $6÷2=3$ Seis dividido por dois é igual a três
/ Dividir 6/2=3 $6/2=3$ Seis dividido por dois é igual a três
= Igual 3+5=8 $3+5=8$ Três mais cinco é igual a oito
< Menos que isso. 1< 2 $1< 2$ Um é menos de dois.
≤ Menos ou igual a 3≤5 $3≤5$ Três é menor ou igual a cinco.
<= Menos ou igual a 3<=5 $3<=5$ Três é menor ou igual a cinco.
\leq Menos ou igual a 3\leq5 $3\leq 5$ Três é menor ou igual a cinco.
\le Menos ou igual a 3\le5 $3\le 5$ Três é menor ou igual a cinco.
\leqq Menos ou igual a 3\leqq5 $3\leqq 5$ Três é menor ou igual a cinco.
"Leqslant" Menos ou igual a 3\leqslant5 $3\leqslant 5$ Três é menor ou igual a cinco.
> Maior que 2>1 $2>1$ Dois é maior que um.
≥ Maior ou igual a 5≥3 $5≥3$ Cinco é maior ou igual a três.
>= Maior ou igual a 5>=3 $5>=3$ Cinco é maior ou igual a três.
\geq Maior ou igual a 5\geq3 $5\geq 3$ Cinco é maior ou igual a três.
\ge Maior ou igual a 5\ge3 $5\ge 3$ Cinco é maior ou igual a três.
\geqq Maior ou igual a 5\geqq3 $5\geqq 3$ Cinco é maior ou igual a três.
\geqslant Maior ou igual a 5\geqslant3 $5\geqslant 3$ Cinco é maior ou igual a três.
\frac Fracção 2\frac3 $\frac {2}{3}$ Two-thirds
^ Poder 2^1 $2^{1}$ Dois para a primeira potência.
\sqrt Raiz. \sqrt{9} = 3 $\sqrt {9} = 3$ A raiz quadrada de nove é igual a três.
\sqrt Raiz. \sqrt[3]{8} = 2 $\sqrt[3]{8} = 2$ A raiz cúbica de oito é igual a dois.
% Percentagem 5\% $5\%$ Cinco por cento.
\ Valor absoluto ∣3∣=3 `$\
\verter Valor absoluto 3\vert=3 $\vert 3\vert =3$ O valor absoluto de três é igual a três.
\lg Logaritmo lg {10} $\lg {10}$ log 10
\log Logaritmo \log{5} $\log{5}$ Diário cinco.
\ln Logaritmo natural \lnX $ln {10}$ LN 10
! Fatorial 5! $5!$ Cinco fatorials.
() Parentes. (2+1) $(2+1)$ Dois mais um entre parênteses
\{ \} - Segurem-se. \{2+1\} $\{2+1\}$ Abra o aparelho dois mais um aparelho fechado

Quadro 21

Marca ou símbolo Transformar Exemplo de conteúdo de fórmula Exemplo de entrada de fórmula Pronuncia
"Alpha" Alfa. "Alpha" $\alpha$ Alfa.
"Alpha." Alfa. "Alpha." $\Alpha$ Alfa.
\beta beta \beta $\beta$ beta
"Beta" beta "Beta" $\Beta$ beta
\gama gama \gama $\gamma$ gama
\Gamma gama \Gamma $\Gamma$ gama
\delta Delta \delta $\delta$ Delta
Delta Delta Delta $\Delta$ Delta
"Infty" infinito (Chinês) "Infty" $\infty$ Infinito
∞ Infty (Inglês) ∞ $∞$ Infinito

Quadro 22

Marca ou símbolo Função Exemplo de conteúdo de fórmula Exemplo de entrada de fórmula Pronuncia
\pi Pi \pi=3.14159 $\pi =3.14159$ Pi é igual a 3.14159.
\sin Função trigonométrica \sin 30^\circ=\frac{1}{2} $\sin 30^\circ =\frac {1}{2}$ O seno de 30 graus é igual a 1/2
\cos Função trigonométrica \cos 30^\circ=\frac{\sqrt{2}}{2} $\cos 30^\circ =\frac {\sqrt {2}}{2}$ O cosseno de 30 graus é igual à raiz quadrada de dois sobre dois.
\tan Função trigonométrica \tan 30^\circ=\frac{\sin 30^\circ}{\cos 30^\circ} $\tan 30^\circ =\frac {\sin 30^\circ}{\cos 30^\circ}$ A tangente de 30 graus é igual ao seno de 30 graus sobre o cosseno de 30 graus.
\csc Função trigonométrica \csc A $\csc A$ Cossecante A
\sec Função trigonométrica \seg A $\sec A$ Secante A
\cot Função trigonométrica \cot A $\cot A$ Cotangente A
\angular Ângulo -Angle AB. $\angle AB$ Ângulo AB
∠ Ângulo ∠AB $∠AB$ Ângulo AB
^^circ Grau .AB = 30^\circ $∠AB = 30^\circ$ Ângulo AB é igual a 30 graus.
\odot Círculo \odot $\odot$ Círculo
\overset\frown Arco \overset\frown {BC} $\overset\frown {BC}$ Arco a.C.
\rm{Rt} Ângulo direito \because \rm{Rt}\triangle ABC $\because \rm{Rt}\triangle ABC$ Porque o triângulo ABC é um triângulo retângulo
\mathrm{Rt} Ângulo direito \therefore AB \perp BC $\therefore AB \perp BC$ Portanto, AB é perpendicular a BC.
Triângulo Triângulo Triângulo ABC $\triangle ABC$ Triângulo ABC
△ Triângulo .ABC $△ABC$ Triângulo ABC
\paralelograma Paralelograma \paralelograma ABCD $\parallelogram ABCD$ Paralelograma ABCD
"Perp" Perpendicular AB \perp BC $AB \perp BC$ AB é perpendicular a BC.
\bot Perpendicular AB \bot BC $AB \bot BC$ AB é perpendicular a BC.
⊥ Perpendicular AB ⊥ BC $AB ⊥ BC$ AB é perpendicular a BC.
"Paralelo" Paralelo A\parallel B $A\parallel B$ A é paralela a B.
"Equalparallel" Paralelo e igual a A igual paralelo B $A\equalparallel B$ A é paralela e igual a B.
\cong Congruente. ? ABC? Cong? DEF $△ABC\cong△DEF$ Triângulo ABC é congruente com o triângulo DEF.

Quadro 23

Marca ou símbolo Função Exemplo de conteúdo de fórmula Exemplo de entrada de fórmula Pronuncia
\implica Implica "Implica 1+1=2" $\implies 1+1=2$ Isso implica que um mais um é igual a dois.
"Fix" Equivalente a P\iffq $p\iffq$ P é equivalente a q
Porque... Porque... Porque a = b \ então b = a $\because a = b \therefore b=a$ Porque a é igual a b, b é igual a a
Então, Portanto Porque a = b \ então b = a $\because a = b \therefore b=a$ Porque a é igual a b, b é igual a a

Quadro 24

Marca ou símbolo Pronuncia Exemplo de conteúdo de fórmula Exemplo de entrada de fórmula Pronunciação de exemplo
mm milímetro 5\quantity{mm} $5\quantity{mm}$ 5 milímetros.
cm centímetros 5\quantity{cm} $5\quantity{cm}$ 5 centímetros.
dm Decimeter 5\quantity{dm} $5\quantity{dm}$ 5 decimômetros.
m Medidor 5\quantity{m} $5\quantity{m}$ 5 metros.
km quilômetro 5\quantity{km} $5\quantity{km}$ 5 quilômetros.
g Gram 5\quantity{g} $5\quantity{g}$ 5 gramas.
kg quilograma 5\quantity{kg} $5\quantity{kg}$ 5 quilos.
t Ton. 5\quantity{t} $5\quantity{t}$ 5 toneladas.
mm^2 milímetros quadrado 5\quantity{mm^2} $5\quantity{mm^2}$ 5 milímetros quadrados.
cm^2 Centímetro quadrado 5\quantity{cm^2} $5\quantity{cm^2}$ 5 centímetros quadrados.
dm^2 Decimímetro quadrado 5\quantity{dm^2} $5\quantity{dm^2}$ 5 decimômetros quadrados.
m^2 Medidor quadrado 5\quantity{m^2} $5\quantity{m^2}$ 5 metros quadrados.
km^2 quilômetro quadrado 5\quantity{km^2} $5\quantity{km^2}$ 5 quilômetros quadrados
mm^3 milímetros cúbicos 5\quantity{mm^3} $5\quantity{mm^3}$ 5 milímetros cúbicos.
cm^3 Centimetro cúbico 5\quantity{cm^3} $5\quantity{cm^3}$ 5 centímetros cúbicos.
dm^3 Decimeter cúbico 5\quantity{dm^3} $5\quantity{dm^3}$ 5 decimômetros cúbicos.
m^3 Medidor cúbico 5\quantity{m^3} $5\quantity{m^3}$ 5 metros cúbicos.
km^3 quilômetro cúbico 5\quantity{km^3} $5\quantity{km^3}$ 5 quilômetros cúbicos.
ml mililitro 5\quantity{ml} $5\quantity{ml}$ 5 mililitros.
s Segundo 5\quantity{s} $5\quantity{s}$ 5 segundos.
min minuto 5\quantity{min} $5\quantity{min}$ 5 minutos.
h Hora 5\quantity{h} $5\quantity{h}$ 5 horas.
km/h quilômetros por hora. 5\quantity{km/h} $5\quantity{km/h}$ 5 km por hora.
g/l gramas por litro 5\quantity{g/l} $5\quantity{g/l}$ 5 gramas por litro.

* Valores em reais sujeitos a ajustes e a flutuações cambiais. Conversões estimadas, sem impostos, spread ou tarifas; confirme o valor final na plataforma oficial.