Rychlý start pro záznam hovorů

Tento článek popisuje záznam hovorů pro hlasové hovory a videohovory. Pokud chcete začít používat rozhraní API pro záznam hovoru, musíte mít zavedený hovor. Pokud chcete vytvořit prostředí pro volání koncového uživatele, ujistěte se, že znáte Calling client SDK a Call Automation.

Ukázka kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

  • Potřebujete účet Azure s aktivním předplatným.
  • Nasaďte prostředek komunikační služby. Poznamenejte si řetězec pro připojení prostředku.
  • Přihlaste se k odběru událostí přes Azure Event Grid.
  • Stažení sady .NET SDK

Než začnete

Rozhraní API pro záznam hovorů používají callConnectionId nebo serverCallId ke spuštění záznamu. Existuje několik metod, které můžete použít k načtení těchto ID v závislosti na vašem scénáři:

Jak načíst callConnectionId

Při použití automatizace volání obdržíte callConnectionId z události odpovědi z createCall, answer nebo connect žádostí při zahájení volání.

Jak získat serverCallId

Při používání automatizace volání máte dvě možnosti, jak serverCallId získat:

  1. Když vytvoříte volání, vrátí se serverCallId jako vlastnost události CallConnected poté, co je volání navázáno. Zjistěte, jak získat událost CallConnected ze sady SDK pro automatizaci volání.

  2. Při odpovědi na volání nebo při vytvoření volání se serverCallId vrátí jako vlastnost odpovědí rozhraní API AnswerCallResult nebo CreateCallResult.

Při používání Calling Client SDK můžete načíst serverCallId pomocí metody getServerCallId u hovoru. V tomto příkladu se dozvíte, jak získat serverCallId ze sady SDK volajícího klienta.

Začněme několika jednoduchými kroky.

1. Vytvoření klienta automatizace volání

Rozhraní API pro záznam hovorů jsou součástí knihoven Automatizace volání ve službě Azure Communication Services. Proto potřebujete vytvořit klienta automatizace volání.

Chcete-li vytvořit klienta automatizace volání, použijte připojovací řetězec komunikačních služeb a předejte ho objektu CallAutomationClient.

CallAutomationClient callAutomationClient = new CallAutomationClient("<ACSConnectionString>");

2. Spuštění relace nahrávání pomocí StartRecordingOptions a API StartAsync

Použijte callConnectionId nebo serverCallId přijaté během inicializace hovoru.

  • Slouží RecordingContent k předání typu obsahu záznamu. Použijte AUDIO.
  • Slouží RecordingChannel k předání typu kanálu záznamu. Použijte MIXED nebo UNMIXED.
  • Slouží RecordingFormat k předání formátu nahrávky. Použijte WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.1. Začněte nahrávat – Použijte vlastní Azure Blob Storage

Začněte nahrávat pomocí určené služby Azure Blob Storage k uložení nahraného souboru po dokončení nahrávání.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>"))
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>"),
    RecordingStorage = RecordingStorage.CreateAzureBlobContainerRecordingStorage(new Uri("<YOUR_STORAGE_CONTAINER_URL>"))
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.2. Spuštění relace nahrávání s povoleným režimem pozastavení pomocí rozhraní API StartAsync

Poznámka:

Aby se vygeneroval soubor záznamu, bude potřeba pokračovat v nahrávání.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    PauseOnStart = true,
    RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.3. Pouze pro nemixované – zadejte uživatele v kanálu 0.

Pokud chcete vytvářet nemixované zvukové záznamy souborů, můžete pomocí AudioChannelParticipantOrdering funkce určit, který uživatel chcete nahrát na kanálu 0. Zbývající účastníci jsou přiřazeni ke kanálu, jakmile začnou mluvit. Pokud použijete RecordingChannel.Unmixed , ale nepoužíváte AudioChannelParticipantOrdering, funkce Záznam hovoru přiřadí kanálu 0 prvnímu účastníkovi, který mluví.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>"),
    AudioChannelParticipantOrdering = { new CommunicationUserIdentifier("<ACS_USER_MRI>") }
    
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);

2.4. Pouze pro nemixované – Určení vazby kanálu

var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<CallConnectionId> or <ServerCallId>"))
{
   RecordingContent = RecordingContent.Audio,
   RecordingChannel = RecordingChannel.Unmixed,
   RecordingFormat = RecordingFormat.Wav,
   RecordingStateCallbackUri = new Uri("<CallbackUri>"),
   ChannelAffinity = new List<ChannelAffinity>{ channelAffinity }
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording().StartAsync(recordingOptions);

Odpověď StartAsync rozhraní API obsahuje údaje o nahrávací relaci recordingId.

3. Zastavte relaci nahrávání pomocí rozhraní API StopAsync

Použijte obdrženou recordingId v odpovědi na StartAsync.

var stopRecording = await callAutomationClient.GetCallRecording().StopAsync(recordingId);

4. Pozastavení relace nahrávání použitím rozhraní API PauseAsync

Použijte obdrženou recordingId v odpovědi na StartAsync.

var pauseRecording = await callAutomationClient.GetCallRecording ().PauseAsync(recordingId);

5. Obnovte relaci nahrávání pomocí ResumeAsync rozhraní API

Použijte obdrženou recordingId v odpovědi na StartAsync.

var resumeRecording = await callAutomationClient.GetCallRecording().ResumeAsync(recordingId);

6. Stažení záznamového souboru pomocí DownloadToAsync rozhraní API

Pomocí webového háku služby Azure Event Grid nebo jiné aktivované akce upozorněte své služby, když je nahrané médium připravené ke stažení.

Oznámení Microsoft.Communication.RecordingFileStatusUpdated Event Gridu se publikuje, když je záznam připravený k načtení, obvykle několik minut po dokončení zpracování záznamu (například při ukončení schůzky nebo zastavení záznamu). Mezi oznámení událostí záznamu patří contentLocation a metadataLocationkteré můžete použít k načtení nahraného média i souboru metadat záznamu.

Příklad schématu událostí:

{
    "id": string, // Unique guid for event
    "topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
    "subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for the recording chunk
                    "contentLocation": string, //Azure Communication Services URL where the content is located
                    "metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
                    "deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                }
            ]
        },
        "recordingStartTime": string, // ISO 8601 date time for the start of the recording
        "recordingDurationMs": int, // Duration of recording in milliseconds
        "sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
    },
    "eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
    "dataVersion": string, // "1.0"
    "metadataVersion": string, // "1"
    "eventTime": string // ISO 8601 date time for when the event was created
}

Pomocí DownloadToAsync rozhraní API si můžete stáhnout zaznamenané médium.

var recordingDownloadUri = new Uri(contentLocation);
var response = await callAutomationClient.GetCallRecording().DownloadToAsync(recordingDownloadUri, fileName);

Načtení downloadLocation záznamu z contentLocation atributu recordingChunk. Použijte metodu DownloadToAsync ke stažení obsahu do zadaného názvu souboru.

7. Odstranění nahrávacího obsahu pomocí DeleteAsync rozhraní API

Pomocí DeleteAsync rozhraní API můžete odstranit obsah záznamu (například nahrané médium a metadata).

var recordingDeleteUri = new Uri(deleteLocation);
var response = await callAutomationClient.GetCallRecording().DeleteAsync(recordingDeleteUri);

Ukázka kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

  • Potřebujete účet Azure s aktivním předplatným.
  • Nasaďte prostředek komunikační služby. Poznamenejte si řetězec pro připojení prostředku.
  • Přihlaste se k odběru událostí přes Azure Event Grid.
  • Stažení sady Java SDK

Než začnete

Rozhraní API pro záznam hovorů používají callConnectionId nebo serverCallId k zahájení nahrávání. Existuje několik metod, které můžete použít k načtení těchto ID v závislosti na vašem scénáři:

Jak získat callConnectionId

Při použití automatizace volání obdržíte callConnectionId z události odpovědi z požadavků createCall, answer nebo connect při zahájení volání.

Jak načíst serverCallId

Při používání automatizace volání máte dvě možnosti, jak serverCallId získat:

  1. Když vytvoříte volání, vrátí se serverCallId jako vlastnost události CallConnected poté, co je volání navázáno. Zjistěte, jak získat událost CallConnected ze sady SDK pro automatizaci volání.

  2. Při odpovědi na volání nebo při vytvoření volání se serverCallId vrátí jako vlastnost odpovědí rozhraní API AnswerCallResult nebo CreateCallResult.

Při používání Calling Client SDK můžete načíst serverCallId pomocí metody getServerCallId u hovoru. V tomto příkladu se dozvíte, jak získat serverCallId ze sady SDK volajícího klienta.

Začněme několika jednoduchými kroky.

1. Vytvoření klienta automatizace volání

Rozhraní API pro záznam hovorů jsou součástí knihoven Automatizace volání ve službě Azure Communication Services. Proto potřebujete vytvořit klienta automatizace volání.

Chcete-li vytvořit klienta automatizace volání, použijte připojovací řetězec komunikačních služeb a předejte ho objektu CallAutomationClient.

CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
            .connectionString("<acsConnectionString>")
            .buildClient();

2. Spusťte relaci nahrávání pomocí StartRecordingOptions a startWithResponse rozhraní API

Během inicializace hovoru použijte callConnectionId nebo serverCallId.

  • Slouží RecordingContent k předání typu obsahu záznamu. Použijte AUDIO.
  • Slouží RecordingChannel k předání typu kanálu záznamu. Použijte MIXED nebo UNMIXED.
  • Slouží RecordingFormat k předání formátu nahrávky. Použijte WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<callConnectionId> or <serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.1. Začněte nahrávat – Použijte vlastní Azure Blob Storage

Začněte nahrávat pomocí určené služby Azure Blob Storage k uložení nahraného souboru po dokončení nahrávání.

        StartRecordingOptions recordingOptions = new StartRecordingOptions(callLocator)
        .setRecordingChannel(RecordingChannel.MIXED)
        .setRecordingContent(RecordingContent.AUDIO_VIDEO)
        .setRecordingFormat(RecordingFormat.MP4)
        .setRecordingStorage(new AzureBlobContainerRecordingStorage("<YOUR_STORAGE_CONTAINER_URL>"));
 
       // //start recording
       RecordingStateResult result = callRecording.start(recordingOptions);

2.2. Spusťte relaci nahrávání se zapnutým režimem pozastavení pomocí rozhraní API StartAsync.

Poznámka:

Aby se vygeneroval soubor záznamu, musí být záznamy obnoveny.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
                    .setPauseOnStart(true)
                    .setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.3. Pouze pro nemixované – zadejte uživatele v kanálu 0.

Pokud chcete vytvářet nemixované zvukové záznamy souborů, můžete pomocí AudioChannelParticipantOrdering funkce určit, který uživatel chcete nahrát na kanálu 0. Zbývající účastníci jsou přiřazeni ke kanálu, jakmile začnou mluvit. Pokud použijete RecordingChannel.Unmixed , ale nepoužíváte AudioChannelParticipantOrdering, funkce Záznam hovoru přiřadí kanálu 0 prvnímu účastníkovi, který mluví.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<<callConnectionId> or serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
                    .setAudioChannelParticipantOrdering(List.of(new CommunicationUserIdentifier("<participantMri>")));

Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startWithResponse(recordingOptions, null);

2.4. Pouze pro nemixované – Určení vazby kanálu

ChannelAffinity channelAffinity = new ChannelAffinity()
.setParticipant(new PhoneNumberIdentifier("RECORDING_ID"))
.setChannel(0);
List<ChannelAffinity> channelAffinities = Arrays.asList(channelAffinity);

StartRecordingOptions startRecordingOptions = new StartRecordingOptions(new ServerCallLocator(SERVER_CALL_ID))
   .setRecordingChannel(RecordingChannel.UNMIXED)
   .setRecordingFormat(RecordingFormat.WAV)
   .setRecordingContent(RecordingContent.AUDIO)
   .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>")
   .setChannelAffinity(channelAffinities);
Response<RecordingStateResult> response = callAutomationClient.getCallRecording()
.startRecordingWithResponse(recordingOptions, null);

Odpověď startWithResponse rozhraní API obsahuje údaje o nahrávací relaci recordingId.

3. Zastavte relaci nahrávání pomocí rozhraní API stopWithResponse

Použijte obdrženou recordingId v odpovědi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
               .stopWithResponse(response.getValue().getRecordingId(), null);

4. Pozastavení relace nahrávání použitím rozhraní API pauseWithResponse

Použijte obdrženou recordingId v odpovědi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
              .pauseWithResponse(response.getValue().getRecordingId(), null);

5. Obnovte relaci nahrávání pomocí resumeWithResponse rozhraní API

Použijte obdrženou recordingId v odpovědi na startWithResponse.

Response<Void> response = callAutomationClient.getCallRecording()
               .resumeWithResponse(response.getValue().getRecordingId(), null);

6. Stažení záznamového souboru pomocí downloadToWithResponse rozhraní API

Pomocí webhooku Azure Event Grid nebo jiné aktivované akce upozorněte své služby, když je záznam média připravený ke stažení.

Oznámení Microsoft.Communication.RecordingFileStatusUpdated Event Gridu se publikuje, když je záznam připravený k načtení, obvykle několik minut po dokončení procesu nahrávání (například ukončení schůzky nebo zastavení nahrávání). Mezi oznámení událostí záznamu patří contentLocation a metadataLocationkteré můžete použít k načtení nahraného média i souboru metadat záznamu.

Následující kód je příkladem schématu událostí.

{
    "id": string, // Unique guid for event
    "topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
    "subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for the recording chunk
                    "contentLocation": string, //Azure Communication Services URL where the content is located
                    "metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
                    "deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                }
            ]
        },
        "recordingStartTime": string, // ISO 8601 date time for the start of the recording
        "recordingDurationMs": int, // Duration of recording in milliseconds
        "sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
    },
    "eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
    "dataVersion": string, // "1.0"
    "metadataVersion": string, // "1"
    "eventTime": string // ISO 8601 date time for when the event was created
}

Ke stažení nahraného média použijte downloadToWithResponse metodu CallRecording třídy. Pro metodu jsou uvedené následující podporované parametry downloadToWithResponse :

  • contentLocation: Adresa URL služby Azure Communication Services, kde se nachází obsah.
  • destinationPath : Umístění souboru.
  • parallelDownloadOptions: Volitelný ParallelDownloadOptions objekt pro úpravu fungování paralelního stahování.
  • overwrite: Hodnota True pro přepsání souboru, pokud existuje.
  • context: Kontext představující kontext požadavku.
Boolean overwrite = true;
ParallelDownloadOptions parallelDownloadOptions = null;
Context context = null;

String filePath = String.format(".\\%s.%s", documentId, fileType);
Path destinationPath = Paths.get(filePath);

Response<Void> downloadResponse = callAutomationClient.getCallRecording().downloadToWithResponse(contentLocation, destinationPath, parallelDownloadOptions, overwrite, context);

Umístění obsahu a ID dokumentu pro nahrávací soubory lze načíst z polí contentLocation a documentId pro každý recordingChunk.

7. Odstranění nahrávacího obsahu pomocí deleteWithResponse rozhraní API

K odstranění zaznamenaného média použijte deleteWithResponse metodu CallRecording třídy. Podporované parametry pro deleteWithResponse metodu:

  • deleteLocation: Adresa URL služby Azure Communication Services, kde se nachází obsah k odstranění.
  • context: Kontext představující kontext požadavku.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

Umístění odstranění nahrávky lze načíst z deleteLocation pole události Event Gridu.

Ukázka kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

  • Potřebujete účet Azure s aktivním předplatným.
  • Nasaďte prostředek komunikační služby. Poznamenejte si řetězec pro připojení prostředku.
  • Přihlaste se k odběru událostí přes Azure Event Grid.
  • Python 3.7+.

Než začnete

Rozhraní API pro záznam hovorů používají callConnectionId nebo serverCallId k inicializaci nahrávání. Existuje několik metod, které můžete použít k načtení těchto ID v závislosti na vašem scénáři:

Jak získat callConnectionId

Při použití automatizace volání obdržíte callConnectionId z události odpovědi ze žádostí createCall, answer nebo connect při zahájení volání.

Jak získat serverCallId

Při používání automatizace volání máte dvě možnosti, jak serverCallId získat:

  1. Když vytvoříte volání, vrátí se serverCallId jako vlastnost události CallConnected poté, co je volání navázáno. Zjistěte, jak získat událost CallConnected ze sady SDK pro automatizaci volání.

  2. Při odpovědi na volání nebo při vytvoření volání se serverCallId vrátí jako vlastnost odpovědí rozhraní API AnswerCallResult nebo CreateCallResult.

Při používání Calling Client SDK můžete načíst serverCallId pomocí metody getServerCallId u hovoru. V tomto příkladu se dozvíte, jak získat serverCallId ze sady SDK volajícího klienta.

Začněme několika jednoduchými kroky.

1. Vytvoření klienta automatizace volání

Rozhraní API pro záznam hovorů jsou součástí knihoven Automatizace volání ve službě Azure Communication Services. Proto je nutné vytvořit klienta automatizace volání.

Chcete-li vytvořit klienta automatizace volání, použijte připojovací řetězec komunikačních služeb a předejte ho objektu CallAutomationClient.

call_automation_client = CallAutomationClient.from_connection_string("<ACSConnectionString>")

2. Spuštění nahrávání pomocí API start_recording

Použijte callConnectionId nebo serverCallId, které byly přijaty během inicializace hovoru.

  • Slouží RecordingContent k předání typu obsahu záznamu. Použijte AUDIO.
  • Slouží RecordingChannel k předání typu kanálu záznamu. Použijte MIXED nebo UNMIXED.
  • Slouží RecordingFormat k předání formátu nahrávky. Použijte WAV.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>")

2.1. Začněte nahrávat – Použijte vlastní Azure Blob Storage

Po dokončení nahrávání začněte nahrávat pomocí vlastní služby Azure Blob Storage definované pro uložení souboru záznamu.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
                   recording_content_type = RecordingContent.Audio,
                   recording_channel_type = RecordingChannel.Unmixed,
                   recording_format_type = RecordingFormat.Wav,
                   recording_state_callback_url = "<CallbackUri>",
                   recording_storage = AzureBlobContainerRecordingStorage(container_url="<YOUR_STORAGE_CONTAINER_URL>"))

2.2. Spuštění relace nahrávání s povoleným režimem pozastavení pomocí rozhraní API StartAsync

Poznámka:

Aby se vygeneroval soubor záznamu, bude potřeba pokračovat v nahrávání.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            pause_on_start = true,
            recording_state_callback_url = "<CallbackUri>")

2.3. Pouze pro nemixované – zadejte uživatele v kanálu 0.

Pokud chcete vytvářet nemixované zvukové záznamy souborů, můžete pomocí AudioChannelParticipantOrdering funkce určit, který uživatel chcete nahrát na kanálu 0. Zbývající účastníci jsou přiřazeni ke kanálu, jakmile začnou mluvit. Pokud použijete RecordingChannel.Unmixed , ale nepoužíváte AudioChannelParticipantOrdering, funkce Záznam hovoru přiřadí kanálu 0 prvnímu účastníkovi, který mluví.

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>",
            audio_channel_participant_ordering=[CommunicationUserIdentifier(id="<ACS_USER_MRI>")])

2.4. Pouze pro nemixované – Určení vazby kanálu

_channel_affinity = ChannelAffinity(target_participant=CommunicationUserIdentifier("<ACS_USER_MRI>"), channel=0)

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(callConnectionId or server_call_id),
            recording_content_type = RecordingContent.Audio,
            recording_channel_type = RecordingChannel.Unmixed,
            recording_format_type = RecordingFormat.Wav,
            recording_state_callback_url = "<CallbackUri>",
            channel_affinity=[_channel_affinity])

Odpověď StartAsync rozhraní API obsahuje údaje o nahrávací relaci recordingId.

3. Zastavení relace nahrávání pomocí rozhraní API stop_recording

Použijte obdrženou recording_id v odpovědi na start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

4. Pozastavení relace nahrávání pomocí rozhraní API pause_recording

Použijte obdrženou recording_id v odpovědi na start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

5. Obnovení relace nahrávání pomocí rozhraní API resume_recording

Použijte obdrženou recording_id v odpovědi na start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Stáhněte si záznamový soubor pomocí rozhraní API download_recording

Pomocí webhooku Azure Event Grid nebo jiné aktivované akce upozorněte své služby, když je záznam média připravený ke stažení.

Oznámení Microsoft.Communication.RecordingFileStatusUpdated Event Gridu se publikuje, když je záznam připravený k načtení, obvykle několik minut po dokončení procesu nahrávání (například ukončení schůzky nebo zastavení záznamu). Mezi oznámení událostí záznamu patří contentLocation a metadataLocationkteré se používají k načtení nahraného média i souboru metadat záznamu.

Následující kód je příkladem schématu událostí.

{
    "id": string, // Unique guid for event
    "topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
    "subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for the recording chunk
                    "contentLocation": string, //Azure Communication Services URL where the content is located
                    "metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
                    "deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                }
            ]
        },
        "recordingStartTime": string, // ISO 8601 date time for the start of the recording
        "recordingDurationMs": int, // Duration of recording in milliseconds
        "sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
    },
    "eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
    "dataVersion": string, // "1.0"
    "metadataVersion": string, // "1"
    "eventTime": string // ISO 8601 date time for when the event was created
}

Pomocí download_recording rozhraní API si můžete stáhnout zaznamenané médium.

response = recording_data = call_automation_client.download_recording(content_location)

with open("<file_name>", "wb") as binary_file:
    binary_file.write(recording_data.read())

Záznam downloadLocation lze získat z atributu contentLocation prvku recordingChunk. Použijte metodu download_recording ke stažení obsahu do bajtů.

7. Odstranění obsahu záznamu pomocí rozhraní API delete_recording

Rozhraní delete_recording API slouží k odstranění obsahu nahraného záznamu, jako jsou nahraná média a metadata.

response = call_automation_client.delete_recording(delete_location);

Ukázka kódu

Ukázkovou aplikaci si můžete stáhnout z GitHubu.

Požadavky

  • Potřebujete účet Azure s aktivním předplatným.
  • Nasaďte prostředek komunikační služby. Poznamenejte si řetězec pro připojení prostředku.
  • Přihlaste se k odběru událostí přes Azure Event Grid.
  • Node.js verze Aktivní LTS a Údržbové LTS (doporučené verze jsou 8.11.1 a 10.14.1)

Než začnete

Rozhraní API pro záznam hovorů používají callConnectionId nebo serverCallId ke spuštění nahrávání. Existuje několik metod, které můžete použít k načtení těchto ID v závislosti na vašem scénáři:

Jak načíst ID spojení hovoru

Při použití automatizace volání obdržíte callConnectionId z události odpovědi z createCall, answer nebo connect žádostí při zahájení volání.

Jak načíst serverCallId

Při používání automatizace volání máte dvě možnosti, jak serverCallId získat:

  1. Když vytvoříte volání, vrátí se serverCallId jako vlastnost události CallConnected poté, co je volání navázáno. Zjistěte, jak získat událost CallConnected ze sady SDK pro automatizaci volání.

  2. Při odpovědi na volání nebo při vytvoření volání se serverCallId vrátí jako vlastnost odpovědí rozhraní API AnswerCallResult nebo CreateCallResult.

Při používání Calling Client SDK můžete načíst serverCallId pomocí metody getServerCallId u hovoru. V tomto příkladu se dozvíte, jak získat serverCallId ze sady SDK volajícího klienta.

Začněme několika jednoduchými kroky.

1. Vytvoření klienta automatizace volání

Rozhraní API pro záznam hovorů jsou součástí knihoven Automatizace volání ve službě Azure Communication Services. Proto je nutné vytvořit klienta automatizace volání.

Chcete-li vytvořit klienta automatizace volání, použijte připojovací řetězec komunikačních služeb a předejte ho objektu CallAutomationClient.

const callAutomationClient = new CallAutomationClient.CallAutomationClient("<ACSConnectionString>");

2. Spuštění relace nahrávání pomocí StartRecordingOptions a API StartAsync

Použijte callConnectionId nebo serverCallId přijaté během inicializace hovoru.

  • Slouží RecordingContent k předání typu obsahu záznamu. Použijte AUDIO.
  • Slouží RecordingChannel k předání typu kanálu záznamu. Použijte MIXED nebo UNMIXED.
  • Slouží RecordingFormat k předání formátu nahrávky. Použijte WAV.
var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>"
};
var response = await callAutomationClient.getCallRecording().start(options);

2.1. Začněte nahrávat – Použijte vlastní Azure Blob Storage

Začněte nahrávat pomocí určené služby Azure Blob Storage k uložení nahraného souboru po dokončení nahrávání.

const recordingStorageKind: RecordingStorageKind = "azureBlobStorage"
const recordingStorage: RecordingStorage = { 
       recordingStorageKind: recordingStorageKind, 
       recordingDestinationContainerUrl: "<YOUR_STORAGE_CONTAINER_URL>"
   }
var options: StartRecordingOptions = {
       callLocator: callLocator,
       recordingContent: "audio",
       recordingChannel:"unmixed",
       recordingFormat: "wav",
       recordingStateCallbackEndpointUrl: "<CallbackUri>",
       recordingStorage: recordingStorage
   };
var response = await callAutomationClient.getCallRecording().start(options);

2.2. Spuštění relace nahrávání s povoleným režimem pozastavení pomocí rozhraní API StartAsync

Poznámka:

Aby se vygeneroval soubor záznamu, bude potřeba pokračovat v nahrávání.

var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  pauseOnStart: true
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);

2.3. Pouze pro nemixované – zadejte uživatele v kanálu 0.

Pokud chcete vytvářet nemixované zvukové záznamy souborů, můžete pomocí AudioChannelParticipantOrdering funkce určit, který uživatel chcete nahrát na kanálu 0. Zbývající účastníci jsou přiřazeni ke kanálu, jakmile začnou mluvit. Pokud použijete RecordingChannel.Unmixed , ale nepoužíváte AudioChannelParticipantOrdering, funkce Záznam hovoru přiřadí kanálu 0 prvnímu účastníkovi, který mluví.

var locator: CallLocator = { id: "<callConnectionId> or <ServerCallId>", kind: "serverCallLocator" };

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  audioChannelParticipantOrdering:[{communicationUserId: "<ACS_USER_MRI>"}]
};
var response = await callAutomationClient.getCallRecording().start(options);

2.4. Pouze pro nemixované – Určení vazby kanálu

var options: StartRecordingOptions =
{
  callLocator: locator,
  recordingContent: "audio",
  recordingChannel:"unmixed",
  recordingFormat: "wav",
  recordingStateCallbackEndpointUrl: "<CallbackUri>",
  ChannelAffinity:
  [
    {
      channel:0,
      targetParticipant:{communicationUserId: "<ACS_USER_MRI>"}
    }
  ]
};
var response = await callAutomationClient.getCallRecording().start(options);

Odpověď StartAsync rozhraní API obsahuje údaje o nahrávací relaci recordingId.

3. Zastavení relace nahrávání pomocí rozhraní API stop

Použijte obdrženou recordingId v odpovědi na start.

var stopRecording = await callAutomationClient.getCallRecording().stop(recordingId);

4. Pozastavení relace nahrávání pomocí API pauza

Použijte obdrženou recordingId v odpovědi na start.

var pauseRecording = await callAutomationClient.getCallRecording().pause(recordingId);

5. Obnovení relace nahrávání pomocí rozhraní API ResumeAsync

Použijte obdrženou recordingId v odpovědi na start.

var resumeRecording = await callAutomationClient.getCallRecording().resume(recordingId);

6. Stažení záznamového souboru pomocí rozhraní API DownloadToAsync

Pomocí webhooku Azure Event Grid nebo jiné aktivované akce upozorněte své služby, když je záznam média připravený ke stažení.

Oznámení Microsoft.Communication.RecordingFileStatusUpdated Event Gridu se publikuje, když je záznam připravený k načtení, obvykle několik minut po dokončení procesu nahrávání (například ukončení schůzky nebo zastavení záznamu). Mezi oznámení událostí záznamu patří contentLocation a metadataLocationkteré se používají k načtení nahraného média i souboru metadat záznamu.

Následující kód je příkladem schématu událostí.

{
    "id": string, // Unique guid for event
    "topic": string, // /subscriptions/{subscription-id}/resourceGroups/{group-name}/providers/Microsoft.Communication/communicationServices/{communication-services-resource-name}
    "subject": string, // /recording/call/{call-id}/serverCallId/{serverCallId}
    "data": {
        "recordingStorageInfo": {
            "recordingChunks": [
                {
                    "documentId": string, // Document id for the recording chunk
                    "contentLocation": string, //Azure Communication Services URL where the content is located
                    "metadataLocation": string, // Azure Communication Services URL where the metadata for this chunk is located
                    "deleteLocation": string, // Azure Communication Services URL to use to delete all content, including recording and metadata.
                    "index": int, // Index providing ordering for this chunk in the entire recording
                    "endReason": string, // Reason for chunk ending: "SessionEnded", "ChunkMaximumSizeExceeded”, etc.
                }
            ]
        },
        "recordingStartTime": string, // ISO 8601 date time for the start of the recording
        "recordingDurationMs": int, // Duration of recording in milliseconds
        "sessionEndReason": string // Reason for call ending: "CallEnded", "InitiatorLeft”, etc.
    },
    "eventType": string, // "Microsoft.Communication.RecordingFileStatusUpdated"
    "dataVersion": string, // "1.0"
    "metadataVersion": string, // "1"
    "eventTime": string // ISO 8601 date time for when the event was created
}

Pomocí downloadToPath rozhraní API si můžete stáhnout zaznamenané médium.

var response = await callAutomationClient.getCallRecording().downloadToPath(contentLocation, fileName);

Záznam downloadLocation lze získat z atributu contentLocation prvku recordingChunk. Použijte metodu DownloadToAsync ke stažení obsahu do zadaného názvu souboru.

7. Odstranění obsahu záznamu pomocí rozhraní API DeleteAsync

Použití delete rozhraní API k odstranění obsahu záznamu (například nahraného média, metadata)

var response = await callAutomationClient.getCallRecording().delete(deleteLocation);

Vyčistěte prostředky

Pokud chcete vyčistit a odebrat předplatné služby Communication Services, můžete odstranit prostředek nebo skupinu prostředků. Odstraněním skupiny prostředků se odstraní také všechny ostatní prostředky, které jsou k ní přidružené. Přečtěte si další informace o čištění prostředků.

Další kroky

Další informace najdete v následujících článcích: