Mulai cepat: Transkripsi Percakapan Real-time

Anda dapat mentranskripsikan rapat dan percakapan lain dengan kemampuan untuk menambahkan, menghapus, dan mengidentifikasi beberapa peserta dengan mengalirkan audio ke layanan Ucapan. Anda terlebih dahulu membuat tanda tangan suara untuk setiap peserta menggunakan REST API, lalu menggunakan tanda tangan suara dengan SDK Ucapan untuk mentranskripsikan percakapan. Lihat ringkasan Transkripsi Percakapan untuk informasi selengkapnya.

Batasan

  • Hanya tersedia di wilayah langganan berikut: centralus, eastasia, eastus, westeurope
  • Membutuhkan array multi-mikrofon melingkar 7-mikrofon. Array mikrofon harus memenuhi spesifikasi kami.

Catatan

SDK Ucapan untuk Transkripsi Percakapan dukungan C++, Java, Objective-C, dan Swift, tetapi kami belum menyertakan panduan di sini.

Prasyarat

Menyiapkan lingkungan

Sebelum Anda dapat melakukan tindakan apa pun, Anda harus memasang Speech SDK untuk JavaScript. Jika Anda hanya ingin menginstal nama paket, jalankan npm install microsoft-cognitiveservices-speech-sdk. Untuk petunjuk penginstalan terpandu, lihat panduan penginstalan SDK.

Membuat tanda tangan suara

Jika Anda ingin mendaftarkan profil pengguna, langkah pertama adalah membuat tanda tangan suara untuk peserta percakapan sehingga mereka dapat diidentifikasi sebagai pembicara unik. Ini tidak diperlukan jika Anda tidak ingin menggunakan profil pengguna yang telah terdaftar sebelumnya untuk mengidentifikasi peserta tertentu.

File audio .wav masukan untuk membuat tanda tangan suara harus 16-bit, laju sampel 16 kHz, dalam format saluran tunggal (mono). Panjang yang disarankan untuk setiap sampel audio adalah antara 30 detik dan dua menit. Sampel audio yang terlalu pendek akan mengakibatkan berkurangnya akurasi saat mengenali speaker. File .wav harus berupa sampel suara satu orang sehingga profil suara unik akan dibuat.

Contoh berikut menunjukkan cara membuat tanda tangan suara dengan menggunakan REST API di JavaScript. Anda harus memasukkan subscriptionKey, region Anda dan jalur ke file .wav sampel.

const fs = require('fs');
const axios = require('axios');
const formData = require('form-data');
 
const subscriptionKey = 'your-subscription-key';
const region = 'your-region';
 
async function createProfile() {
    let form = new formData();
    form.append('file', fs.createReadStream('path-to-voice-sample.wav'));
    let headers = form.getHeaders();
    headers['Ocp-Apim-Subscription-Key'] = subscriptionKey;
 
    let url = `https://signature.${region}.cts.speech.microsoft.com/api/v1/Signature/GenerateVoiceSignatureFromFormData`;
    let response = await axios.post(url, form, { headers: headers });
    
    // get signature from response, serialize to json string
    return JSON.stringify(response.data.Signature);
}
 
async function main() {
    // use this voiceSignature string with conversation transcription calls below
    let voiceSignatureString = await createProfile();
    console.log(voiceSignatureString);
}
main();

Menjalankan skrip ini akan menampilkan string tanda tangan suara dalam variabel voiceSignatureString. Jalankan fungsi ini dua kali sehingga Anda memiliki dua string yang akan digunakan sebagai input ke variabel voiceSignatureStringUser1dan voiceSignatureStringUser2 berikut.

Catatan

Tanda tangan suara hanya bisa dibuat menggunakan REST API.

Mentranskrip percakapan

Sampel kode berikut menunjukkan cara mentranskrip percakapan untuk dua pembicara secara real time. Ini mengasumsikan Anda sudah membuat string tanda tangan suara untuk setiap pembicara seperti yang ditunjukkan di atas. Ganti informasi nyata untuk subscriptionKey, region, dan jalur filepath untuk audio yang ingin ditranskrip.

Jika Anda tidak menggunakan profil pengguna yang telah terdaftar sebelumnya, perlu beberapa detik lagi untuk menyelesaikan pengenalan pertama pengguna yang tidak dikenal sebagai speaker1, speaker2, dll.

Catatan

Pastikan subscriptionKey yang sama digunakan di seluruh aplikasi Anda untuk pembuatan tanda tangan, atau Anda akan menemukan kesalahan.

Sampel kode akan melakukan hal berikut:

  • Membuat aliran push yang akan digunakan untuk transkripsi, dan menulis file .wav sampel ke dalamnya.
  • Membuat Conversation menggunakan createConversationAsync().
  • Membuat ConversationTranscriber menggunakan konstruktor.
  • Menambahkan peserta ke percakapan. String voiceSignatureStringUser1 dan voiceSignatureStringUser2 harus muncul sebagai hasil dari langkah-langkah di atas.
  • Mendaftar ke peristiwa dan memulai transkripsi.
  • Jika Anda ingin membedakan pembicara tanpa memberikan sampel suara, aktifkan fitur DifferentiateGuestSpeakers seperti dalam Gambaran Umum Transkripsi Percakapan.
(function() {
    "use strict";
    var sdk = require("microsoft-cognitiveservices-speech-sdk");
    var fs = require("fs");
    
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";
    var filepath = "audio-file-to-transcribe.wav"; // 8-channel audio
    
    var speechTranslationConfig = sdk.SpeechTranslationConfig.fromSubscription(subscriptionKey, region);
    var audioConfig = sdk.AudioConfig.fromWavFileInput(fs.readFileSync(filepath));
    speechTranslationConfig.setProperty("ConversationTranscriptionInRoomAndOnline", "true");

    // en-us by default. Adding this code to specify other languages, like zh-cn.
    speechTranslationConfig.speechRecognitionLanguage = "en-US";
    
    // create conversation and transcriber
    var conversation = sdk.Conversation.createConversationAsync(speechTranslationConfig, "myConversation");
    var transcriber = new sdk.ConversationTranscriber(audioConfig);
    
    // attach the transcriber to the conversation
    transcriber.joinConversationAsync(conversation,
    function () {
        // add first participant using voiceSignature created in enrollment step
        var user1 = sdk.Participant.From("user1@example.com", "en-us", voiceSignatureStringUser1);
        conversation.addParticipantAsync(user1,
        function () {
            // add second participant using voiceSignature created in enrollment step
            var user2 = sdk.Participant.From("user2@example.com", "en-us", voiceSignatureStringUser2);
            conversation.addParticipantAsync(user2,
            function () {
                transcriber.sessionStarted = function(s, e) {
                console.log("(sessionStarted)");
                };
                transcriber.sessionStopped = function(s, e) {
                console.log("(sessionStopped)");
                };
                transcriber.canceled = function(s, e) {
                console.log("(canceled)");
                };
                transcriber.transcribed = function(s, e) {
                console.log("(transcribed) text: " + e.result.text);
                console.log("(transcribed) speakerId: " + e.result.speakerId);
                };
    
                // begin conversation transcription
                transcriber.startTranscribingAsync(
                function () { },
                function (err) {
                    console.trace("err - starting transcription: " + err);
                });
        },
        function (err) {
            console.trace("err - adding user1: " + err);
        });
    },
    function (err) {
        console.trace("err - adding user2: " + err);
    });
    },
    function (err) {
    console.trace("err - " + err);
    });
}()); 

Lihat sampel lainnya di GitHub:

Prasyarat

Menyiapkan lingkungan

Speech SDK tersedia sebagai paket NuGet dan menerapkan .NET Standar 2.0. Anda memasang Speech SDK di bagian berikutnya dari artikel ini, tetapi pertama-tama periksa instruksi instalasi khusus platform untuk persyaratan lain.

Membuat tanda tangan suara

Jika Anda ingin mendaftarkan profil pengguna, langkah pertama adalah membuat tanda tangan suara untuk peserta percakapan sehingga mereka dapat diidentifikasi sebagai pembicara unik. Ini tidak diperlukan jika Anda tidak ingin menggunakan profil pengguna yang telah terdaftar sebelumnya untuk mengidentifikasi peserta tertentu.

File audio .wav masukan untuk membuat tanda tangan suara harus 16-bit, laju sampel 16 kHz, dalam format saluran tunggal (mono). Panjang yang disarankan untuk setiap sampel audio adalah antara 30 detik dan dua menit. Sampel audio yang terlalu pendek akan mengakibatkan berkurangnya akurasi saat mengenali speaker. File .wav harus berupa sampel suara satu orang sehingga profil suara unik akan dibuat.

Contoh berikut menunjukkan cara membuat tanda tangan suara dengan menggunakan REST API di C#. Anda harus memasukkan subscriptionKey, region Anda dan jalur ke file .wav sampel.

using System;
using System.IO;
using System.Net.Http;
using System.Runtime.Serialization;
using System.Threading.Tasks;
using Newtonsoft.Json;

[DataContract]
internal class VoiceSignature
{
    [DataMember]
    public string Status { get; private set; }

    [DataMember]
    public VoiceSignatureData Signature { get; private set; }

    [DataMember]
    public string Transcription { get; private set; }
}

[DataContract]
internal class VoiceSignatureData
{
    internal VoiceSignatureData()
    { }

    internal VoiceSignatureData(int version, string tag, string data)
    {
        this.Version = version;
        this.Tag = tag;
        this.Data = data;
    }

    [DataMember]
    public int Version { get; private set; }

    [DataMember]
    public string Tag { get; private set; }

    [DataMember]
    public string Data { get; private set; }
}

private static async Task<string> GetVoiceSignatureString()
{
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";

    byte[] fileBytes = File.ReadAllBytes("path-to-voice-sample.wav");
    var content = new ByteArrayContent(fileBytes);
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
    var response = await client.PostAsync($"https://signature.{region}.cts.speech.microsoft.com/api/v1/Signature/GenerateVoiceSignatureFromByteArray", content);
    
    var jsonData = await response.Content.ReadAsStringAsync();
    var result = JsonConvert.DeserializeObject<VoiceSignature>(jsonData);
    return JsonConvert.SerializeObject(result.Signature);
}

Menjalankan fungsi GetVoiceSignatureString() mengembalikan untai (karakter) tanda suara dalam format yang benar. Jalankan fungsi ini dua kali sehingga Anda memiliki dua string yang akan digunakan sebagai input ke variabel voiceSignatureStringUser1dan voiceSignatureStringUser2 berikut.

Catatan

Tanda tangan suara hanya bisa dibuat menggunakan REST API.

Mentranskrip percakapan

Sampel kode berikut menunjukkan cara mentranskrip percakapan untuk dua pembicara secara real time. Ini mengasumsikan Anda sudah membuat string tanda tangan suara untuk setiap pembicara seperti yang ditunjukkan di atas. Ganti informasi nyata untuk subscriptionKey, region, dan jalur filepath untuk audio yang ingin ditranskrip.

Jika Anda tidak menggunakan profil pengguna yang telah terdaftar sebelumnya, perlu beberapa detik lagi untuk menyelesaikan pengenalan pertama pengguna yang tidak dikenal sebagai speaker1, speaker2, dll.

Catatan

Pastikan subscriptionKey yang sama digunakan di seluruh aplikasi Anda untuk pembuatan tanda tangan, atau Anda akan menemukan kesalahan.

Sampel kode akan melakukan hal berikut:

  • Membuat AudioConfig dari file sampel .wav untuk ditranskripsikan.
  • Membuat Conversation menggunakan CreateConversationAsync().
  • Membuat ConversationTranscriber menggunakan konstruktor, dan berlangganan acara yang diperlukan.
  • Menambahkan peserta ke percakapan. Untai (karakter)voiceSignatureStringUser1 dan voiceSignatureStringUser2 harus muncul sebagai hasil dari langkah-langkah di atas dari fungsi GetVoiceSignatureString().
  • Bergabung dalam percakapan dan memulai transkripsi.
  • Jika Anda ingin membedakan pembicara tanpa memberikan sampel suara, aktifkan fitur DifferentiateGuestSpeakers seperti dalam Gambaran Umum Transkripsi Percakapan.

Catatan

AudioStreamReaderAdalah kelas pembantu yang bisa Anda dapatkan di GitHub.

Panggil fungsi TranscribeConversationsAsync() untuk memulai transkripsi percakapan.

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.CognitiveServices.Speech;
using Microsoft.CognitiveServices.Speech.Audio;
using Microsoft.CognitiveServices.Speech.Transcription;

class transcribe_conversation
{
// all your other code

public static async Task TranscribeConversationsAsync(string voiceSignatureStringUser1, string voiceSignatureStringUser2)
{
    var subscriptionKey = "your-subscription-key";
    var region = "your-region";
    var filepath = "audio-file-to-transcribe.wav";

    var config = SpeechConfig.FromSubscription(subscriptionKey, region);
    config.SetProperty("ConversationTranscriptionInRoomAndOnline", "true");

    // en-us by default. Adding this code to specify other languages, like zh-cn.
    // config.SpeechRecognitionLanguage = "zh-cn";
    var stopRecognition = new TaskCompletionSource<int>();

    using (var audioInput = AudioConfig.FromWavFileInput(filepath))
    {
        var meetingID = Guid.NewGuid().ToString();
        using (var conversation = await Conversation.CreateConversationAsync(config, meetingID))
        {
            // create a conversation transcriber using audio stream input
            using (var conversationTranscriber = new ConversationTranscriber(audioInput))
            {
                conversationTranscriber.Transcribing += (s, e) =>
                {
                    Console.WriteLine($"TRANSCRIBING: Text={e.Result.Text} SpeakerId={e.Result.UserId}");
                };

                conversationTranscriber.Transcribed += (s, e) =>
                {
                    if (e.Result.Reason == ResultReason.RecognizedSpeech)
                    {
                        Console.WriteLine($"TRANSCRIBED: Text={e.Result.Text} SpeakerId={e.Result.UserId}");
                    }
                    else if (e.Result.Reason == ResultReason.NoMatch)
                    {
                        Console.WriteLine($"NOMATCH: Speech could not be recognized.");
                    }
                };

                conversationTranscriber.Canceled += (s, e) =>
                {
                    Console.WriteLine($"CANCELED: Reason={e.Reason}");

                    if (e.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={e.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails={e.ErrorDetails}");
                        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
                        stopRecognition.TrySetResult(0);
                    }
                };

                conversationTranscriber.SessionStarted += (s, e) =>
                {
                    Console.WriteLine($"\nSession started event. SessionId={e.SessionId}");
                };

                conversationTranscriber.SessionStopped += (s, e) =>
                {
                    Console.WriteLine($"\nSession stopped event. SessionId={e.SessionId}");
                    Console.WriteLine("\nStop recognition.");
                    stopRecognition.TrySetResult(0);
                };

                // Add participants to the conversation.
                var speaker1 = Participant.From("User1", "en-US", voiceSignatureStringUser1);
                var speaker2 = Participant.From("User2", "en-US", voiceSignatureStringUser2);
                await conversation.AddParticipantAsync(speaker1);
                await conversation.AddParticipantAsync(speaker2);

                // Join to the conversation and start transcribing
                await conversationTranscriber.JoinConversationAsync(conversation);
                await conversationTranscriber.StartTranscribingAsync().ConfigureAwait(false);

                // waits for completion, then stop transcription
                Task.WaitAny(new[] { stopRecognition.Task });
                await conversationTranscriber.StopTranscribingAsync().ConfigureAwait(false);
            }
         }
      }
   }
}

Langkah berikutnya