Delen via


Snelle start voor opname van gesprekken

In dit artikel wordt het opnemen van gesprekken voor spraak- en videogesprekken beschreven. Als je de API's voor gespreksopnames wilt gaan gebruiken, moet je een gesprek hebben. Als u de ervaring voor het aanroepen van eindgebruikers wilt bouwen, moet u bekend zijn met de CLIENT-SDK voor aanroepen en Gespreksautomatisering.

Voorbeeldcode

U kunt de voorbeeld-app downloaden uit GitHub.

Vereisten

  • U hebt een Azure-account met een actief abonnement nodig.
  • Implementeer een Communication Service-resource. Noteer uw bron verbindingsreeks.
  • Abonneer u op gebeurtenissen via Azure Event Grid.
  • De .NET SDK downloaden

Voordat u begint

Call Recording API's gebruiken uitsluitend de serverCallId om opname te starten. Er zijn een aantal methoden die u kunt gebruiken om het serverCallId op te halen, afhankelijk van uw scenario:

Scenario's voor gespreksautomatisering

Wanneer u gespreksautomatisering gebruikt, hebt u twee opties om het serverCallIdvolgende te verkrijgen:

  1. Wanneer u een oproep tot stand brengt, wordt een serverCallId als eigenschap van de CallConnected gebeurtenis geretourneerd nadat een oproep tot stand is gebracht. Meer informatie over het ophalen van een CallConnected-gebeurtenis uit de Call Automation SDK.

  2. Wanneer u de aanroep beantwoordt of een aanroep wordt gemaakt, wordt de serverCallId functie geretourneerd als een eigenschap van respectievelijk de AnswerCallResult of CreateCallResult API-antwoorden.

SDK scenario's aanroepen

Wanneer u de Calling Client SDK gebruikt, kunt u de serverCallId ophalen met behulp van de getServerCallId-methode op de aanroep. Gebruik dit voorbeeld om te leren hoe je de serverCallId kunt ophalen uit de belclient-SDK.

Laten we aan de slag gaan met een paar eenvoudige stappen.

1. Een Call Automation-client maken

Call Recording-API's maken deel uit van de Azure Communication Services Call Automation-bibliotheken . U moet dus een Call Automation-client maken.

Als u een gespreksautomatiseringsclient wilt maken, gebruikt u uw Communication Services-verbindingsreeks en geeft u deze door aan CallAutomationClient object.

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

2. Start de opnamesessie met StartRecordingOptions met behulp van de API StartAsync

Gebruik de serverCallId ontvangen bij het initiëren van het gesprek.

  • Hiermee RecordingContent geeft u het inhoudstype van de opname door. Gebruik AUDIO.
  • Hiermee RecordingChannel geeft u het type opnamekanaal door. Gebruik MIXED of UNMIXED.
  • Hiermee RecordingFormat geeft u de indeling van de opname door. Gebruik WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<ServerCallId>")) 
{
    RecordingContent = RecordingContent.Audio,
    RecordingChannel = RecordingChannel.Unmixed,
    RecordingFormat = RecordingFormat.Wav,
    RecordingStateCallbackUri = new Uri("<CallbackUri>");
};
Response<RecordingStateResult> response = await callAutomationClient.GetCallRecording()
.StartAsync(recordingOptions);

2.1. Opname starten - Bring Your Own Azure Blob Store

Begin met opnemen met behulp van uw aangewezen Azure Blob Storage om het opgenomen bestand op te slaan zodra de opname is voltooid.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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. Opnamesessie starten met de pauzemodus ingeschakeld met de API 'StartAsync'

Notitie

Opnamen moeten worden hervat om het opnamebestand te kunnen genereren.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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. Alleen voor Niet-gemengd - Geef een gebruiker op kanaal 0 op

Als u niet-vermengde audio-opnamebestanden wilt produceren, kunt u de AudioChannelParticipantOrdering functionaliteit gebruiken om op te geven welke gebruiker u wilt opnemen op kanaal 0. De rest van de deelnemers worden toegewezen aan een kanaal terwijl ze spreken. Als u RecordingChannel.Unmixed gebruikt maar AudioChannelParticipantOrdering niet, wijst Gespreksopname kanaal 0 toe aan de eerste deelnemer die spreekt.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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 Alleen voor Unmixed - Kanaalaffiniteit opgeven

var channelAffinity = new ChannelAffinity(new CommunicationUserIdentifier("<ACS_USER_MRI>")) { Channel = 0};
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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);

Het StartAsync API-antwoord bevat de recordingId opnamesessie.

3. Opnamesessie stoppen met api StopAsync

Gebruik het recordingId dat is ontvangen als reactie op StartAsync.

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

4. Opnamesessie onderbreken met behulp van PauseAsync API

Gebruik de recordingId die is ontvangen als reactie op StartAsync.

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

5. Opnamesessie hervatten met api ResumeAsync

Gebruik de recordingId ontvangen als antwoord op StartAsync.

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

6. Opnamebestand downloaden met api DownloadToAsync

Gebruik een Azure Event Grid-webhook of een andere geactiveerde actie om uw services op de hoogte te stellen wanneer de opgenomen media klaar zijn om te worden gedownload.

Een Event Grid-melding Microsoft.Communication.RecordingFileStatusUpdated wordt gepubliceerd wanneer een opname gereed is voor het ophalen, meestal een paar minuten nadat de opname is verwerkt (bijvoorbeeld wanneer de vergadering eindigt of een opname stopt). Opname van gebeurtenismeldingen omvatten contentLocation en metadataLocation, die u kunt gebruiken om zowel opgenomen media als een bestand met metagegevens van de opname op te halen.

Voorbeeld van het gebeurtenisschema:

{
    "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
}

Gebruik DownloadToAsync de API om de opgenomen media te downloaden.

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

Haal de downloadLocation voor de opname op uit het contentLocation attribuut van de recordingChunk. Gebruik de DownloadToAsync methode om de inhoud te downloaden naar een opgegeven bestandsnaam.

7. Opname-inhoud verwijderen met behulp van DeleteAsync API

Gebruik DeleteAsync de API om de opname-inhoud (zoals opgenomen media en metagegevens) te verwijderen.

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

Voorbeeldcode

U kunt de voorbeeld-app downloaden uit GitHub.

Vereisten

  • U hebt een Azure-account met een actief abonnement nodig.
  • Implementeer een Communication Service-resource. Noteer uw resource verbindingsreeks.
  • Abonneer u op gebeurtenissen via Azure Event Grid.
  • De Java SDK downloaden

Voordat u begint

Call Recording API's gebruiken uitsluitend de serverCallId om de opname te starten. Er zijn een aantal methoden die u kunt gebruiken om het serverCallId op te halen, afhankelijk van uw scenario:

Scenario's voor gespreksautomatisering

Wanneer u gespreksautomatisering gebruikt, hebt u twee opties om het serverCallIdvolgende te verkrijgen:

  1. Zodra een aanroep is gemaakt, wordt er een serverCallId geretourneerd als een eigenschap van de CallConnected gebeurtenis nadat een oproep tot stand is gebracht. Meer informatie over het ophalen van een CallConnected-gebeurtenis uit de Call Automation SDK.

  2. Zodra u de oproep hebt beantwoord of een oproep is aangemaakt, wordt serverCallId respectievelijk als een eigenschap van de AnswerCallResult- of CreateCallResult-API-antwoorden geretourneerd.

SDK-scenario's aanroepen

Wanneer u Client-SDK Aanroepen gebruikt, kunt u deze serverCallId ophalen met behulp van de getServerCallId methode op de aanroep.

Gebruik dit voorbeeld om te leren hoe u de serverCallId kunt ophalen uit de Calling Client SDK.

Laten we aan de slag gaan met een paar eenvoudige stappen.

1. Een Call Automation-client maken

Call Recording-API's maken deel uit van de Azure Communication Services Call Automation-bibliotheken . U moet dus een Call Automation-client maken.

Als u een gespreksautomatiseringsclient wilt maken, gebruikt u uw Communication Services-verbindingsreeks en geeft u deze door aan CallAutomationClient object.

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

2. Start de opnamesessie met StartRecordingOptions met behulp van startWithResponse API

Gebruik de serverCallId ontvangen tijdens de start van het gesprek.

  • Hiermee RecordingContent geeft u het inhoudstype van de opname door. Gebruik AUDIO.
  • Hiermee RecordingChannel geeft u het type opnamekanaal door. Gebruik MIXED of UNMIXED.
  • Hiermee RecordingFormat geeft u de indeling van de opname door. Gebruik WAV.
StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<serverCallId>"))
                    .setRecordingChannel(RecordingChannel.UNMIXED)
                    .setRecordingFormat(RecordingFormat.WAV)
                    .setRecordingContent(RecordingContent.AUDIO)
                    .setRecordingStateCallbackUrl("<recordingStateCallbackUrl>");

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

2.1. Opname starten - Bring Your Own Azure Blob Store

Begin met opnemen met behulp van uw aangewezen Azure Blob Storage om het opgenomen bestand op te slaan zodra de opname is voltooid.

        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. Opnamesessie starten met de pauzemodus ingeschakeld met behulp van StartAsync API

Notitie

Opnamen moeten worden hervat om het opnamebestand te kunnen genereren.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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. Alleen voor Niet-gemengd - Geef een gebruiker op kanaal 0 op

Als u niet-vermengde audio-opnamebestanden wilt produceren, kunt u de AudioChannelParticipantOrdering functionaliteit gebruiken om op te geven welke gebruiker u wilt opnemen op kanaal 0. De rest van de deelnemers worden toegewezen aan een kanaal terwijl ze spreken. Als u maar niet gebruikt RecordingChannel.UnmixedAudioChannelParticipantOrdering, wijst Gespreksopname kanaal 0 toe aan de eerste deelnemer die spreekt.

StartRecordingOptions recordingOptions = new StartRecordingOptions(new ServerCallLocator("<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 Alleen voor Unmixed - Kanaalaffiniteit opgeven

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);

Het startWithResponse API-antwoord bevat de recordingId opnamesessie.

3. Opnamesessie stoppen met api stopWithResponse

Gebruik de recordingId ontvangen reactie op startWithResponse.

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

4. Opnamesessie onderbreken met behulp van pauseWithResponse API

Gebruik de recordingId die in reactie op startWithResponse is ontvangen.

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

5. Opnamesessie hervatten met api resumeWithResponse

Gebruik de recordingId ontvangen reactie op startWithResponse.

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

6. Opnamebestand downloaden met api downloadToWithResponse

Gebruik een Azure Event Grid-webhook of een andere geactiveerde actie om uw services op de hoogte te stellen wanneer de opgenomen media gereed zijn om te worden gedownload.

Een Event Grid-melding Microsoft.Communication.RecordingFileStatusUpdated wordt gepubliceerd wanneer een opname gereed is voor het ophalen, meestal een paar minuten nadat het opnameproces is voltooid (zoals het beëindigen van vergaderingen of opnamestops). Opname van gebeurtenismeldingen omvatten contentLocation en metadataLocation, die u kunt gebruiken om zowel opgenomen media als een bestand met metagegevens van de opname op te halen.

De volgende code is een voorbeeld van het gebeurtenisschema.

{
    "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
}

Gebruik downloadToWithResponse de klassemethode CallRecording om de opgenomen media te downloaden. Hieronder volgen de ondersteunde parameters voor downloadToWithResponse de methode:

  • contentLocation: URL van Azure Communication Services waar de inhoud zich bevindt.
  • destinationPath : Bestandslocatie.
  • parallelDownloadOptions: Een optioneel ParallelDownloadOptions object om te wijzigen hoe de parallelle download werkt.
  • overwrite: Waar om het bestand te overschrijven als het bestaat.
  • context: Een context die de aanvraagcontext vertegenwoordigt.
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);

De inhoudslocatie en document-id's voor de opnamebestanden kunnen respectievelijk worden opgehaald uit respectievelijk de contentLocation velden en documentId velden.recordingChunk

7. Opname-inhoud verwijderen met behulp van deleteWithResponse API

Gebruik deleteWithResponse de CallRecording klassemethode om de opgenomen media te verwijderen. Ondersteunde parameters voor deleteWithResponse de methode:

  • deleteLocation: Url van Azure Communication Services waar de inhoud die moet worden verwijderd zich bevindt.
  • context: Een context die de aanvraagcontext vertegenwoordigt.
Response<Void> deleteResponse = callAutomationClient.getCallRecording().deleteWithResponse(deleteLocation, context);

De verwijderlocatie voor de opname kan worden opgehaald uit het deleteLocation veld van de Event Grid-gebeurtenis.

Voorbeeldcode

U kunt de voorbeeld-app downloaden uit GitHub.

Vereisten

  • U hebt een Azure-account met een actief abonnement nodig.
  • Implementeer een Communication Service-resource. Noteer uw resource verbindingsreeks.
  • Abonneer u op gebeurtenissen via Azure Event Grid.
  • Python 3.7+.

Voordat u begint

Call Recording API's gebruiken exclusief de serverCallId om de opname te starten. Er zijn een aantal methoden die u kunt gebruiken om het serverCallId op te halen, afhankelijk van uw scenario:

Scenario's voor gespreksautomatisering

  • Wanneer u gespreksautomatisering gebruikt, hebt u twee opties om het serverCallIdvolgende te verkrijgen:
    1. Zodra een aanroep is gemaakt, wordt er een serverCallId geretourneerd als een eigenschap van de CallConnected gebeurtenis nadat een oproep tot stand is gebracht. Meer informatie over het ophalen van een CallConnected-gebeurtenis uit de Call Automation SDK.
    2. Zodra u een aanroep beantwoordt of een aanroep wordt gemaakt, wordt de serverCallId geretourneerd als een eigenschap van de AnswerCallResult- of CreateCallResult-API-antwoorden.

SDK-scenario's aanroepen

  • Wanneer u de Calling Client SDK gebruikt, kunt u de serverCallId ophalen door de server_call_id variabele op de aanroep te gebruiken. Gebruik dit voorbeeld om te leren hoe je de serverCallId kunt ophalen uit de bel-client-SDK.

Laten we aan de slag gaan met een paar eenvoudige stappen.

1. Een Call Automation-client maken

Call Recording-API's maken deel uit van de Azure Communication Services Call Automation-bibliotheken . Daarom is het nodig om een Call Automation-client te maken.

Als u een gespreksautomatiseringsclient wilt maken, gebruikt u uw Communication Services-verbindingsreeks en geeft u deze door aan CallAutomationClient object.

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

2. Start de opnamesessie start_recording API

Gebruik de serverCallId ontvangen tijdens het starten van het gesprek.

  • Hiermee RecordingContent geeft u het inhoudstype van de opname door. Gebruik AUDIO.
  • Hiermee RecordingChannel geeft u het type opnamekanaal door. Gebruik MIXED of UNMIXED.
  • Hiermee RecordingFormat geeft u de indeling van de opname door. Gebruik WAV.
response = call_automation_client.start_recording(call_locator=ServerCallLocator(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. Opname starten - Bring Your Own Azure Blob Store

Begin met opnemen met uw eigen Azure Blob Storage die is gedefinieerd om het opnamebestand op te slaan zodra de opname is voltooid.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(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. Opnamesessie starten met de pauzemodus ingeschakeld met de API 'StartAsync'

Notitie

Opnamen moeten worden hervat om het opnamebestand te kunnen genereren.

response = call_automation_client.start_recording(call_locator=ServerCallLocator(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. Alleen voor Niet-gemengd - Geef een gebruiker op kanaal 0 op

Als u niet-vermengde audio-opnamebestanden wilt produceren, kunt u de AudioChannelParticipantOrdering functionaliteit gebruiken om op te geven welke gebruiker u wilt opnemen op kanaal 0. De rest van de deelnemers worden toegewezen aan een kanaal terwijl ze spreken. Als u RecordingChannel.Unmixed gebruikt maar AudioChannelParticipantOrdering niet, wijst Gespreksopname kanaal 0 toe aan de eerste deelnemer die spreekt.

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(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 Alleen voor Unmixed - Kanaalaffiniteit opgeven

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

response =  call_automation_client.start_recording(call_locator=ServerCallLocator(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])

Het StartAsync API-antwoord bevat de recordingId opnamesessie.

3. Stop de opnamesessie met behulp van de API 'stop_recording'

Gebruik de recording_id die is ontvangen als reactie op start_recording.

stop_recording = call_automation_client.stop_recording(recording_id = recording_id)

4. Opnamesessie onderbreken met de API 'pause_recording'

Gebruik de recording_id die is ontvangen als reactie op start_recording.

pause_recording = call_automation_client.pause_recording(recording_id = recording_id)

5. Opnamesessie hervatten met de API 'resume_recording'

Gebruik de recording_id die je hebt ontvangen als reactie op start_recording.

resume_recording = call_automation_client.resume_recording(recording_id = recording_id)

6. Opnamebestand downloaden met de API 'download_recording'

Gebruik een Azure Event Grid-webhook of een andere geactiveerde actie om uw services op de hoogte te stellen wanneer de opgenomen media gereed zijn om te worden gedownload.

Er wordt een Event Grid-melding Microsoft.Communication.RecordingFileStatusUpdated gepubliceerd wanneer een opname gereed is voor ophalen, meestal een paar minuten nadat het opnameproces is voltooid (zoals de vergadering is beëindigd of de opname is gestopt). Meldingen van opname-evenementen bevatten contentLocation en metadataLocation, die gebruikt worden om zowel opgenomen media als een opnamemetagegevensbestand op te halen.

De volgende code is een voorbeeld van het gebeurtenisschema.

{
    "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
}

Gebruik download_recording de API om de opgenomen media te downloaden.

response = recording_data = call_automation_client.download_recording(content_location)

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

De downloadLocation voor de opname kan worden opgehaald uit het contentLocation attribuut van het recordingChunk. Gebruik de download_recording methode om de inhoud te downloaden in bytes.

7. Opname-inhoud verwijderen met de API 'delete_recording'

Gebruik delete_recording de API voor het verwijderen van de opname-inhoud, zoals opgenomen media en metagegevens.

response = call_automation_client.delete_recording(delete_location);

Voorbeeldcode

U kunt de voorbeeld-app downloaden uit GitHub.

Vereisten

  • U hebt een Azure-account met een actief abonnement nodig.
  • Implementeer een Communication Service-resource. Noteer uw bron verbindingsreeks.
  • Abonneer u op gebeurtenissen via Azure Event Grid.
  • Node.js Active LTS- en Maintenance LTS-versies (aanbevolen 8.11.1 en 10.14.1)

Voordat u begint

Call Recording-API's maken uitsluitend gebruik van de serverCallId om de opname te starten. Er zijn een aantal methoden die u kunt gebruiken om het serverCallId op te halen, afhankelijk van uw scenario:

Scenario's voor gespreksautomatisering

  • Wanneer u gespreksautomatisering gebruikt, hebt u twee opties om het serverCallIdvolgende te verkrijgen:
    1. Zodra een aanroep is gemaakt, wordt er een serverCallId geretourneerd als een eigenschap van de CallConnected gebeurtenis nadat een oproep tot stand is gebracht. Meer informatie over het ophalen van een CallConnected-gebeurtenis vanuit de Call Automation SDK.
    2. Zodra u de oproep beantwoordt of er een oproep wordt gecreëerd, wordt de waarde serverCallId respectievelijk geretourneerd als een eigenschap van de AnswerCallResult- of CreateCallResult-API-antwoorden.

SDK-scenario's aanroepen

Wanneer u client-SDK aanroepen gebruikt, kunt u deze serverCallId ophalen met behulp van de getServerCallId methode voor de aanroep.

Gebruik dit voorbeeld om te leren hoe u een serverCallId op te halen uit de client-SDK voor aanroepen.

Laten we aan de slag gaan met een paar eenvoudige stappen.

1. Een Call Automation-client maken

Call Recording-API's maken deel uit van de Azure Communication Services Call Automation-bibliotheken . Daarom is het nodig om een Call Automation-client te maken.

Als u een gespreksautomatiseringsclient wilt maken, gebruikt u uw Communication Services-verbindingsreeks en geeft u deze door aan CallAutomationClient object.

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

2. Start de opnamesessie met StartRecordingOptions met behulp van de API StartAsync

Gebruik de serverCallId verkregen tijdens het starten van het gesprek.

  • Hiermee RecordingContent geeft u het inhoudstype van de opname door. Gebruik AUDIO.
  • Hiermee RecordingChannel geeft u het type opnamekanaal door. Gebruik MIXED of UNMIXED.
  • Hiermee RecordingFormat geeft u de indeling van de opname door. Gebruik WAV.
var locator: CallLocator = { id: "<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. Opname starten - Gebruik je eigen Azure Blob Store

Begin met opnemen met behulp van uw aangewezen Azure Blob Storage om het opgenomen bestand op te slaan zodra de opname is voltooid.

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. Opnamesessie starten met de pauzemodus ingeschakeld met de API 'StartAsync'

Notitie

Opnamen moeten worden hervat om het opnamebestand te kunnen genereren.

var locator: CallLocator = { id: "<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. Alleen voor Niet-gemengd - Geef een gebruiker op kanaal 0 op

Als u niet-vermengde audio-opnamebestanden wilt produceren, kunt u de AudioChannelParticipantOrdering functionaliteit gebruiken om op te geven welke gebruiker u wilt opnemen op kanaal 0. De rest van de deelnemers worden toegewezen aan een kanaal terwijl ze spreken. Als u wel RecordingChannel.Unmixed gebruikt maar niet AudioChannelParticipantOrdering, wijst Gespreksopname kanaal 0 toe aan de eerste deelnemer die spreekt.

var locator: CallLocator = { id: "<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 Alleen voor Unmixed - Kanaalaffiniteit opgeven

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);

Het StartAsync API-antwoord bevat de recordingId opnamesessie.

3. Opnamesessie stoppen met 'stop' API

Gebruik de recordingId die u ontvangt als reactie op start.

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

4. Opnamesessie pauzeren met de 'pause' API

Gebruik de recordingId die ontvangen is als reactie op start.

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

5. Opnamesessie hervatten met de API ResumeAsync

Gebruik de recordingId die is ontvangen als reactie op start.

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

6. Opnamebestand downloaden met de API 'DownloadToAsync'

Gebruik een Azure Event Grid-webhook of een andere geactiveerde actie om uw services op de hoogte te stellen wanneer de opgenomen media gereed zijn om te worden gedownload.

Er wordt een Event Grid-melding Microsoft.Communication.RecordingFileStatusUpdated gepubliceerd wanneer een opname gereed is voor ophalen, meestal een paar minuten nadat het opnameproces is voltooid (zoals de vergadering is beëindigd of de opname is gestopt). Opnamegebeurtenismeldingen zijn inclusief contentLocation en metadataLocation, die worden gebruikt om zowel opgenomen media als een bestand met opnamemetagegevens op te halen.

De volgende code is een voorbeeld van het gebeurtenisschema.

{
    "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
}

Gebruik downloadToPath de API om de opgenomen media te downloaden.

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

De downloadLocation voor de opname kan worden opgehaald uit het contentLocation attribuut van het recordingChunk. Gebruik de DownloadToAsync methode om de inhoud te downloaden naar een opgegeven bestandsnaam.

7. Opname-inhoud verwijderen met de API DeleteAsync

Api gebruiken delete voor het verwijderen van de opname-inhoud (bijvoorbeeld opgenomen media, metagegevens)

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

Hulpbronnen opruimen

Als u een Communication Services-abonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd. Meer informatie over het opschonen van middelen.

Volgende stappen

Raadpleeg voor meer informatie de volgende artikelen: