將即時謄寫新增至您的應用程式
重要
本文所述的功能目前處於公開預覽狀態。 此預覽版本沒有服務等級協定,不建議用於處理生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
本指南可協助您進一步了解您可使用 Azure 通訊服務供應項目的不同方式,藉以透過通話自動化 SDK 進行即時謄寫。
必要條件
- 包含使用中訂用帳戶的 Azure 帳戶。如需詳細資料,請參閱建立免費帳戶。
- 如需 Azure 通訊服務資源,請參閱建立 Azure 通訊服務資源
- 建立 Azure AI 服務並將其連線至您的 Azure 通訊服務資源。
- 為您的 Azure AI 服務資源建立自訂子網域。
- 使用通話自動化 SDK 來建立新的 Web 服務應用程式。
設定 WebSocket 伺服器
Azure 通訊服務需要您的伺服器應用程式設定 WebSocket 伺服器,以即時串流謄寫。 WebSocket 是一種標準化通訊協定,可透過單一 TCP 連線提供全雙工通訊通道。 您可以選擇性地使用 Azure 服務 Azure WebApps,讓您可以建立應用程式,以透過 WebSocket 連線來接收謄寫。 請遵循本快速入門。
建立通話
在本快速入門中,假設您已熟悉如何開始通話。 如果您需要深入了解如何開始和建立通話,則可以遵循快速入門。 為了本快速入門的目的,我們將逐步執行針對來電和撥出通話啟動謄寫的程序。
使用即時謄寫時,您有一些關於何時及如何啟動謄寫的選項:
選項 1 - 在接聽或建立通話時啟動
選項 2 - 在進行中通話期間啟動謄寫
在本教學課程中,我們會示範選項 2,在進行中通話期間啟動謄寫。 根據預設,'startTranscription' 會在接聽或建立通話時設定為 False。
建立通話並提供謄寫詳細資料
定義 TranscriptionOptions 以讓 ACS 知道是否立即或稍後啟動謄寫,並定義謄寫的地區設定及用於傳送文字記錄的 Web Soket 連線。
var createCallOptions = new CreateCallOptions(callInvite, callbackUri)
{
CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri(cognitiveServiceEndpoint) },
TranscriptionOptions = new TranscriptionOptions(new Uri(""), "en-US", false, TranscriptionTransport.Websocket)
};
CreateCallResult createCallResult = await callAutomationClient.CreateCallAsync(createCallOptions);
啟動謄寫
準備好啟動謄寫之後,您可以明確撥打通話自動化以開始謄寫通話。
// Start transcription with options
StartTranscriptionOptions options = new StartTranscriptionOptions()
{
OperationContext = "startMediaStreamingContext",
//Locale = "en-US",
};
await callMedia.StartTranscriptionAsync(options);
// Alternative: Start transcription without options
// await callMedia.StartTranscriptionAsync();
接收謄寫串流
當謄寫開始時,WebSocket 將接收謄寫中繼資料承載作為第一個封包。 此承載帶有組態的中繼資料和地區設定。
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
接收謄寫資料
接收中繼資料之後,Web Socket 接收的下一個封包將是謄寫音訊的 TranscriptionData。
{
"kind": "TranscriptionData",
"transcriptionData": {
"text": "Testing transcription.",
"format": "display",
"confidence": 0.695223331451416,
"offset": 2516998782481234400,
"words": [
{
"text": "testing",
"offset": 2516998782481234400
},
{
"text": "testing",
"offset": 2516998782481234400
}
],
"participantRawID": "8:acs:",
"resultStatus": "Final"
}
}
處理 Web Socket 伺服器中的謄寫串流
using WebServerApi;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseWebSockets();
app.Map("/ws", async context =>
{
if (context.WebSockets.IsWebSocketRequest)
{
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await HandleWebSocket.Echo(webSocket);
}
else
{
context.Response.StatusCode = StatusCodes.Status400BadRequest;
}
});
app.Run();
Websocket 處理常式程式碼的更新
using Azure.Communication.CallAutomation;
using System.Net.WebSockets;
using System.Text;
namespace WebServerApi
{
public class HandleWebSocket
{
public static async Task Echo(WebSocket webSocket)
{
var buffer = new byte[1024 * 4];
var receiveResult = await webSocket.ReceiveAsync(
new ArraySegment(buffer), CancellationToken.None);
while (!receiveResult.CloseStatus.HasValue)
{
string msg = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count);
var response = StreamingDataParser.Parse(msg);
if (response != null)
{
if (response is AudioMetadata audioMetadata)
{
Console.WriteLine("***************************************************************************************");
Console.WriteLine("MEDIA SUBSCRIPTION ID-->"+audioMetadata.MediaSubscriptionId);
Console.WriteLine("ENCODING-->"+audioMetadata.Encoding);
Console.WriteLine("SAMPLE RATE-->"+audioMetadata.SampleRate);
Console.WriteLine("CHANNELS-->"+audioMetadata.Channels);
Console.WriteLine("LENGTH-->"+audioMetadata.Length);
Console.WriteLine("***************************************************************************************");
}
if (response is AudioData audioData)
{
Console.WriteLine("***************************************************************************************");
Console.WriteLine("DATA-->"+audioData.Data);
Console.WriteLine("TIMESTAMP-->"+audioData.Timestamp);
Console.WriteLine("IS SILENT-->"+audioData.IsSilent);
Console.WriteLine("***************************************************************************************");
}
if (response is TranscriptionMetadata transcriptionMetadata)
{
Console.WriteLine("***************************************************************************************");
Console.WriteLine("TRANSCRIPTION SUBSCRIPTION ID-->"+transcriptionMetadata.TranscriptionSubscriptionId);
Console.WriteLine("LOCALE-->"+transcriptionMetadata.Locale);
Console.WriteLine("CALL CONNECTION ID--?"+transcriptionMetadata.CallConnectionId);
Console.WriteLine("CORRELATION ID-->"+transcriptionMetadata.CorrelationId);
Console.WriteLine("***************************************************************************************");
}
if (response is TranscriptionData transcriptionData)
{
Console.WriteLine("***************************************************************************************");
Console.WriteLine("TEXT-->"+transcriptionData.Text);
Console.WriteLine("FORMAT-->"+transcriptionData.Format);
Console.WriteLine("OFFSET-->"+transcriptionData.Offset);
Console.WriteLine("DURATION-->"+transcriptionData.Duration);
Console.WriteLine("PARTICIPANT-->"+transcriptionData.Participant.RawId);
Console.WriteLine("CONFIDENCE-->"+transcriptionData.Confidence);
foreach (var word in transcriptionData.Words)
{
Console.WriteLine("TEXT-->"+word.Text);
Console.WriteLine("OFFSET-->"+word.Offset);
Console.WriteLine("DURATION-->"+word.Duration);
}
Console.WriteLine("***************************************************************************************");
}
}
await webSocket.SendAsync(
new ArraySegment(buffer, 0, receiveResult.Count),
receiveResult.MessageType,
receiveResult.EndOfMessage,
CancellationToken.None);
receiveResult = await webSocket.ReceiveAsync(
new ArraySegment(buffer), CancellationToken.None);
}
await webSocket.CloseAsync(
receiveResult.CloseStatus.Value,
receiveResult.CloseStatusDescription,
CancellationToken.None);
}
}
}
更新謄寫
如果您的應用程式允許使用者選取使用者慣用的語言,您可能也想要擷取該語言的謄寫。 若要這麼做,通話自動化 SDK 可讓您更新謄寫地區設定。
await callMedia.UpdateTranscriptionAsync("en-US-NancyNeural");
停止謄寫
當您的應用程式必須停止接聽謄寫時,您可以使用 StopTranscription 要求以讓通話自動化知道要停止將文字記錄資料傳送至您的 Web Socket。
StopTranscriptionOptions stopOptions = new StopTranscriptionOptions()
{
OperationContext = "stopTranscription"
};
await callMedia.StopTranscriptionAsync(stopOptions);
建立通話並提供謄寫詳細資料
定義 TranscriptionOptions 以讓 ACS 知道是否立即或稍後啟動謄寫,並定義謄寫的地區設定及用於傳送文字記錄的 Web Soket 連線。
CallInvite callInvite = new CallInvite(target, caller);
CallIntelligenceOptions callIntelligenceOptions = new CallIntelligenceOptions()
.setCognitiveServicesEndpoint(appConfig.getCognitiveServiceEndpoint());
TranscriptionOptions transcriptionOptions = new TranscriptionOptions(
appConfig.getWebSocketUrl(),
TranscriptionTransport.WEBSOCKET,
"en-US",
false
);
CreateCallOptions createCallOptions = new CreateCallOptions(callInvite, appConfig.getCallBackUri());
createCallOptions.setCallIntelligenceOptions(callIntelligenceOptions);
createCallOptions.setTranscriptionOptions(transcriptionOptions);
Response result = client.createCallWithResponse(createCallOptions, Context.NONE);
return result.getValue().getCallConnectionProperties().getCallConnectionId();
啟動謄寫
準備好啟動謄寫之後,您可以明確撥打通話自動化以開始謄寫通話。
//Option 1: Start transcription with options
StartTranscriptionOptions transcriptionOptions = new StartTranscriptionOptions()
.setOperationContext("startMediaStreamingContext");
client.getCallConnection(callConnectionId)
.getCallMedia()
.startTranscriptionWithResponse(transcriptionOptions, Context.NONE);
// Alternative: Start transcription without options
// client.getCallConnection(callConnectionId)
// .getCallMedia()
// .startTranscription();
接收謄寫串流
當謄寫開始時,WebSocket 將接收謄寫中繼資料承載作為第一個封包。 此承載帶有組態的中繼資料和地區設定。
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
接收謄寫資料
接收中繼資料之後,Web Socket 接收的下一個封包將是謄寫音訊的 TranscriptionData。
{
"kind": "TranscriptionData",
"transcriptionData": {
"text": "Testing transcription.",
"format": "display",
"confidence": 0.695223331451416,
"offset": 2516998782481234400,
"words": [
{
"text": "testing",
"offset": 2516998782481234400
},
{
"text": "testing",
"offset": 2516998782481234400
}
],
"participantRawID": "8:acs:",
"resultStatus": "Final"
}
}
處理 Web Socket 伺服器中的謄寫串流
package com.example;
import org.glassfish.tyrus.server.Server;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class App {
public static void main(String[] args) {
Server server = new Server("localhost", 8081, "/ws", null, WebSocketServer.class);
try {
server.start();
System.out.println("Web socket running on port 8081...");
System.out.println("wss://localhost:8081/ws/server");
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();
} catch (Exception e) {
e.printStackTrace();
} finally {
server.stop();
}
}
}
Websocket 處理常式程式碼的更新
package com.example;
import javax.websocket.OnMessage;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import com.azure.communication.callautomation.models.streaming.StreamingData;
import com.azure.communication.callautomation.models.streaming.StreamingDataParser;
import com.azure.communication.callautomation.models.streaming.media.AudioData;
import com.azure.communication.callautomation.models.streaming.media.AudioMetadata;
import com.azure.communication.callautomation.models.streaming.transcription.TranscriptionData;
import com.azure.communication.callautomation.models.streaming.transcription.TranscriptionMetadata;
import com.azure.communication.callautomation.models.streaming.transcription.Word;
@ServerEndpoint("/server")
public class WebSocketServer {
@OnMessage
public void onMessage(String message, Session session) {
StreamingData data = StreamingDataParser.parse(message);
if (data instanceof AudioMetadata) {
AudioMetadata audioMetaData = (AudioMetadata) data;
System.out.println("----------------------------------------------------------------");
System.out.println("SUBSCRIPTION ID: --> " + audioMetaData.getMediaSubscriptionId());
System.out.println("ENCODING: --> " + audioMetaData.getEncoding());
System.out.println("SAMPLE RATE: --> " + audioMetaData.getSampleRate());
System.out.println("CHANNELS: --> " + audioMetaData.getChannels());
System.out.println("LENGTH: --> " + audioMetaData.getLength());
System.out.println("----------------------------------------------------------------");
}
if (data instanceof AudioData) {
AudioData audioData = (AudioData) data;
System.out.println("----------------------------------------------------------------");
System.out.println("DATA: --> " + audioData.getData());
System.out.println("TIMESTAMP: --> " + audioData.getTimestamp());
System.out.println("IS SILENT: --> " + audioData.isSilent());
System.out.println("----------------------------------------------------------------");
}
if (data instanceof TranscriptionMetadata) {
TranscriptionMetadata transcriptionMetadata = (TranscriptionMetadata) data;
System.out.println("----------------------------------------------------------------");
System.out.println("TRANSCRIPTION SUBSCRIPTION ID: --> " + transcriptionMetadata.getTranscriptionSubscriptionId());
System.out.println("IS SILENT: --> " + transcriptionMetadata.getLocale());
System.out.println("CALL CONNECTION ID: --> " + transcriptionMetadata.getCallConnectionId());
System.out.println("CORRELATION ID: --> " + transcriptionMetadata.getCorrelationId());
System.out.println("----------------------------------------------------------------");
}
if (data instanceof TranscriptionData) {
TranscriptionData transcriptionData = (TranscriptionData) data;
System.out.println("----------------------------------------------------------------");
System.out.println("TEXT: --> " + transcriptionData.getText());
System.out.println("FORMAT: --> " + transcriptionData.getFormat());
System.out.println("CONFIDENCE: --> " + transcriptionData.getConfidence());
System.out.println("OFFSET: --> " + transcriptionData.getOffset());
System.out.println("DURATION: --> " + transcriptionData.getDuration());
System.out.println("RESULT STATUS: --> " + transcriptionData.getResultStatus());
for (Word word : transcriptionData.getWords()) {
System.out.println("Text: --> " + word.getText());
System.out.println("Offset: --> " + word.getOffset());
System.out.println("Duration: --> " + word.getDuration());
}
System.out.println("----------------------------------------------------------------");
}
}
}
更新謄寫
如果您的應用程式允許使用者選取使用者慣用的語言,您可能也想要擷取該語言的謄寫。 若要這麼做,通話自動化 SDK 可讓您更新謄寫地區設定。
client.getCallConnection(callConnectionId)
.getCallMedia()
.updateTranscription("en-US-NancyNeural");
停止謄寫
當您的應用程式必須停止接聽謄寫時,您可以使用 StopTranscription 要求以讓通話自動化知道要停止將文字記錄資料傳送至您的 Web Socket。
// Option 1: Stop transcription with options
StopTranscriptionOptions stopTranscriptionOptions = new StopTranscriptionOptions()
.setOperationContext("stopTranscription");
client.getCallConnection(callConnectionId)
.getCallMedia()
.stopTranscriptionWithResponse(stopTranscriptionOptions, Context.NONE);
// Alternative: Stop transcription without options
// client.getCallConnection(callConnectionId)
// .getCallMedia()
// .stopTranscription();
建立通話並提供謄寫詳細資料
定義 TranscriptionOptions 以讓 ACS 知道是否立即或稍後啟動謄寫,並定義謄寫的地區設定及用於傳送文字記錄的 Web Soket 連線。
const transcriptionOptions = {
transportUrl: "",
transportType: "websocket",
locale: "en-US",
startTranscription: false
};
const options = {
callIntelligenceOptions: {
cognitiveServicesEndpoint: process.env.COGNITIVE_SERVICES_ENDPOINT
},
transcriptionOptions: transcriptionOptions
};
console.log("Placing outbound call...");
acsClient.createCall(callInvite, process.env.CALLBACK_URI + "/api/callbacks", options);
啟動謄寫
準備好啟動謄寫之後,您可以明確撥打通話自動化以開始謄寫通話。
const startTranscriptionOptions = {
locale: "en-AU",
operationContext: "startTranscriptionContext"
};
// Start transcription with options
await callMedia.startTranscription(startTranscriptionOptions);
// Alternative: Start transcription without options
// await callMedia.startTranscription();
接收謄寫串流
當謄寫開始時,WebSocket 將接收謄寫中繼資料承載作為第一個封包。 此承載帶有組態的中繼資料和地區設定。
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
接收謄寫資料
接收中繼資料之後,Web Socket 接收的下一個封包將是謄寫音訊的 TranscriptionData。
{
"kind": "TranscriptionData",
"transcriptionData": {
"text": "Testing transcription.",
"format": "display",
"confidence": 0.695223331451416,
"offset": 2516998782481234400,
"words": [
{
"text": "testing",
"offset": 2516998782481234400
},
{
"text": "testing",
"offset": 2516998782481234400
}
],
"participantRawID": "8:acs:",
"resultStatus": "Final"
}
}
處理 Web Socket 伺服器中的謄寫串流
import WebSocket from 'ws';
import { streamingData } from '@azure/communication-call-automation/src/util/streamingDataParser';
const wss = new WebSocket.Server({ port: 8081 });
wss.on('connection', (ws) => {
console.log('Client connected');
ws.on('message', (packetData) => {
const decoder = new TextDecoder();
const stringJson = decoder.decode(packetData);
console.log("STRING JSON => " + stringJson);
const response = streamingData(packetData);
if ('locale' in response) {
console.log("Transcription Metadata");
console.log(response.callConnectionId);
console.log(response.correlationId);
console.log(response.locale);
console.log(response.subscriptionId);
}
if ('text' in response) {
console.log("Transcription Data");
console.log(response.text);
console.log(response.format);
console.log(response.confidence);
console.log(response.offset);
console.log(response.duration);
console.log(response.resultStatus);
if ('phoneNumber' in response.participant) {
console.log(response.participant.phoneNumber);
}
response.words.forEach((word) => {
console.log(word.text);
console.log(word.duration);
console.log(word.offset);
});
}
});
ws.on('close', () => {
console.log('Client disconnected');
});
});
console.log('WebSocket server running on port 8081');
更新謄寫
如果您的應用程式允許使用者選取使用者慣用的語言,您可能也想要擷取該語言的謄寫。 若要這麼做,通話自動化 SDK 可讓您更新謄寫地區設定。
await callMedia.updateTranscription("en-US-NancyNeural");
停止謄寫
當您的應用程式必須停止接聽謄寫時,您可以使用 StopTranscription 要求以讓通話自動化知道要停止將文字記錄資料傳送至您的 Web Socket。
const stopTranscriptionOptions = {
operationContext: "stopTranscriptionContext"
};
// Stop transcription with options
await callMedia.stopTranscription(stopTranscriptionOptions);
// Alternative: Stop transcription without options
// await callMedia.stopTranscription();
建立通話並提供謄寫詳細資料
定義 TranscriptionOptions 以讓 ACS 知道是否立即或稍後啟動謄寫,並定義謄寫的地區設定及用於傳送文字記錄的 Web Soket 連線。
transcription_options = TranscriptionOptions(
transport_url=" ",
transport_type=TranscriptionTransportType.WEBSOCKET,
locale="en-US",
start_transcription=False
)
call_connection_properties = call_automation_client.create_call(
target_participant,
CALLBACK_EVENTS_URI,
cognitive_services_endpoint=COGNITIVE_SERVICES_ENDPOINT,
source_caller_id_number=source_caller,
transcription=transcription_options
)
啟動謄寫
準備好啟動謄寫之後,您可以明確撥打通話自動化以開始謄寫通話。
# Start transcription without options
call_connection_client.start_transcription()
# Option 1: Start transcription with locale and operation context
# call_connection_client.start_transcription(locale="en-AU", operation_context="startTranscriptionContext")
# Option 2: Start transcription with operation context
# call_connection_client.start_transcription(operation_context="startTranscriptionContext")
接收謄寫串流
當謄寫開始時,WebSocket 將接收謄寫中繼資料承載作為第一個封包。 此承載帶有組態的中繼資料和地區設定。
{
"kind": "TranscriptionMetadata",
"transcriptionMetadata": {
"subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
"locale": "en-us",
"callConnectionId": "65c57654=f12c-4975-92a4-21668e61dd98",
"correlationId": "65c57654=f12c-4975-92a4-21668e61dd98"
}
}
接收謄寫資料
接收中繼資料之後,Web Socket 接收的下一個封包將是謄寫音訊的 TranscriptionData。
{
"kind": "TranscriptionData",
"transcriptionData": {
"text": "Testing transcription.",
"format": "display",
"confidence": 0.695223331451416,
"offset": 2516998782481234400,
"words": [
{
"text": "testing",
"offset": 2516998782481234400
},
{
"text": "testing",
"offset": 2516998782481234400
}
],
"participantRawID": "8:acs:",
"resultStatus": "Final"
}
}
處理 Web Socket 伺服器中的謄寫串流
import asyncio
import json
import websockets
from azure.communication.callautomation._shared.models import identifier_from_raw_id
async def handle_client(websocket, path):
print("Client connected")
try:
async for message in websocket:
json_object = json.loads(message)
kind = json_object['kind']
if kind == 'TranscriptionMetadata':
print("Transcription metadata")
print("-------------------------")
print("Subscription ID:", json_object['transcriptionMetadata']['subscriptionId'])
print("Locale:", json_object['transcriptionMetadata']['locale'])
print("Call Connection ID:", json_object['transcriptionMetadata']['callConnectionId'])
print("Correlation ID:", json_object['transcriptionMetadata']['correlationId'])
if kind == 'TranscriptionData':
participant = identifier_from_raw_id(json_object['transcriptionData']['participantRawID'])
word_data_list = json_object['transcriptionData']['words']
print("Transcription data")
print("-------------------------")
print("Text:", json_object['transcriptionData']['text'])
print("Format:", json_object['transcriptionData']['format'])
print("Confidence:", json_object['transcriptionData']['confidence'])
print("Offset:", json_object['transcriptionData']['offset'])
print("Duration:", json_object['transcriptionData']['duration'])
print("Participant:", participant.raw_id)
print("Result Status:", json_object['transcriptionData']['resultStatus'])
for word in word_data_list:
print("Word:", word['text'])
print("Offset:", word['offset'])
print("Duration:", word['duration'])
except websockets.exceptions.ConnectionClosedOK:
print("Client disconnected")
except websockets.exceptions.ConnectionClosedError as e:
print("Connection closed with error: %s", e)
except Exception as e:
print("Unexpected error: %s", e)
start_server = websockets.serve(handle_client, "localhost", 8081)
print('WebSocket server running on port 8081')
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
更新謄寫
如果您的應用程式允許使用者選取使用者慣用的語言,您可能也想要擷取該語言的謄寫。 若要這麼做,通話自動化 SDK 可讓您更新謄寫地區設定。
await call_connection_client.update_transcription(locale="en-US-NancyNeural")
停止謄寫
當您的應用程式必須停止接聽謄寫時,您可以使用 StopTranscription 要求以讓通話自動化知道要停止將文字記錄資料傳送至您的 Web Socket。
# Stop transcription without options
call_connection_client.stop_transcription()
# Alternative: Stop transcription with operation context
# call_connection_client.stop_transcription(operation_context="stopTranscriptionContext")
事件代碼
活動 | code | 子代碼 | 訊息 |
---|---|---|---|
TranscriptionStarted | 200 | 0 | 動作已順利完成。 |
TranscriptionStopped | 200 | 0 | 動作已順利完成。 |
TranscriptionUpdated | 200 | 0 | 動作已順利完成。 |
TranscriptionFailed | 400 | 8581 | 動作失敗,StreamUrl 無效。 |
TrasncriptionFailed | 400 | 8565 | 由於傳遞給認知服務的要求錯誤,因此動作失敗。 檢查您的輸入參數。 |
TranscriptionFailed | 400 | 8565 | 由於傳遞給認知服務的要求逾時,因此動作失敗。請稍後再試,或檢查服務是否發生任何問題。 |
TranscriptionFailed | 400 | 8605 | 謄寫不支援自訂語音辨識。 |
TranscriptionFailed | 400 | 8523 | 要求無效,缺少地區設定。 |
TranscriptionFailed | 400 | 8523 | 要求無效,僅支援包含區域資訊的地區設定。 |
TranscriptionFailed | 405 | 8520 | 目前不支援謄寫功能。 |
TranscriptionFailed | 405 | 8520 | 使用 Connect 介面建立的連線不支援 UpdateTranscription。 |
TranscriptionFailed | 400 | 8528 | 動作無效,已終止通話。 |
TranscriptionFailed | 405 | 8520 | 目前不支援更新謄寫功能。 |
TranscriptionFailed | 405 | 8522 | 通話設定期間未設定謄寫 URL 時,不允許要求。 |
TranscriptionFailed | 405 | 8522 | 在通話設定期間未設定認知服務組態時,不允許要求。 |
TranscriptionFailed | 400 | 8501 | 當通話不是「已建立」狀態時,動作無效。 |
TranscriptionFailed | 401 | 8565 | 由於發生認知服務驗證錯誤,因此動作失敗。 檢查您的授權輸入並確保正確無誤。 |
TranscriptionFailed | 403 | 8565 | 由於傳遞給認知服務的要求禁止,因此動作失敗。 檢查您的訂用帳戶狀態並確保其為作用中。 |
TranscriptionFailed | 429 | 8565 | 動作失敗,要求已超過認知服務訂用帳戶允許的並行要求數目。 |
TranscriptionFailed | 500 | 8578 | 動作失敗,無法建立 WebSocket 連線。 |
TranscriptionFailed | 500 | 8580 | 動作失敗,已關閉謄寫服務。 |
TranscriptionFailed | 500 | 8579 | 動作失敗,已取消謄寫。 |
TranscriptionFailed | 500 | 9999 | 未知內部伺服器錯誤。 |
已知問題
- 針對使用用戶端 SDK 的 ACS 使用者 1:1 通話,目前不支援 startTranscription = True。