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
- Langganan Azure - Membuat langganan gratis
- Buat sumber daya Azure di portal Azure.
- Dapatkan kunci sumber daya dan wilayah. Setelah sumber daya Azure Cognitive Service untuk Ucapan Anda disebarkan, pilih Buka sumber daya untuk melihat dan mengelola kunci. Untuk informasi selengkapnya tentang sumber daya Cognitive Services, lihat Mendapatkan kunci untuk sumber daya Anda.
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
.wavsampel ke dalamnya. - Membuat
ConversationmenggunakancreateConversationAsync(). - Membuat
ConversationTranscribermenggunakan konstruktor. - Menambahkan peserta ke percakapan. String
voiceSignatureStringUser1danvoiceSignatureStringUser2harus 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
DifferentiateGuestSpeakersseperti 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
- Langganan Azure - Membuat langganan gratis
- Buat sumber daya Azure di portal Azure.
- Dapatkan kunci sumber daya dan wilayah. Setelah sumber daya Azure Cognitive Service untuk Ucapan Anda disebarkan, pilih Buka sumber daya untuk melihat dan mengelola kunci. Untuk informasi selengkapnya tentang sumber daya Cognitive Services, lihat Mendapatkan kunci untuk sumber daya Anda.
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
AudioConfigdari file sampel.wavuntuk ditranskripsikan. - Membuat
ConversationmenggunakanCreateConversationAsync(). - Membuat
ConversationTranscribermenggunakan konstruktor, dan berlangganan acara yang diperlukan. - Menambahkan peserta ke percakapan. Untai (karakter)
voiceSignatureStringUser1danvoiceSignatureStringUser2harus muncul sebagai hasil dari langkah-langkah di atas dari fungsiGetVoiceSignatureString(). - Bergabung dalam percakapan dan memulai transkripsi.
- Jika Anda ingin membedakan pembicara tanpa memberikan sampel suara, aktifkan fitur
DifferentiateGuestSpeakersseperti 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);
}
}
}
}
}