196 changed files with 30208 additions and 22 deletions
@ -0,0 +1,438 @@ |
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
|||
|
|||
|
|||
#include "Processor/Whisper/STTProcessorWhisper.h" |
|||
#include "STTManagerBase.h" |
|||
#include "HttpModule.h" |
|||
#include "Interfaces/IHttpRequest.h" |
|||
#include "Interfaces/IHttpResponse.h" |
|||
#include "Serialization/JsonSerializer.h" |
|||
#include "Dom/JsonObject.h" |
|||
|
|||
namespace |
|||
{ |
|||
static void AppendStringToBody(TArray<uint8>& Body, const FString& Str) |
|||
{ |
|||
FTCHARToUTF8 Converter(*Str); |
|||
Body.Append(reinterpret_cast<const uint8*>(Converter.Get()), Converter.Length()); |
|||
} |
|||
|
|||
static const FString TranscribeModelEnumToString(EOpenAITranscriptionModel Model) |
|||
{ |
|||
switch (Model) |
|||
{ |
|||
case EOpenAITranscriptionModel::Whisper1: |
|||
return TEXT("whisper-1"); |
|||
break; |
|||
|
|||
case EOpenAITranscriptionModel::TranscribeMini4o: |
|||
return TEXT("gpt-4o-mini-transcribe"); |
|||
break; |
|||
|
|||
case EOpenAITranscriptionModel::Transcribe4o: |
|||
return TEXT("gpt-4o-transcribe"); |
|||
break; |
|||
|
|||
default: |
|||
return TEXT(""); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
void USTTProcessorWhisper::InitSTTProcessor(USTTManagerBase* BaseSTTManager, USTTBaseProcessorConfig* InProcessorConfig, bool InDebugMode) |
|||
{ |
|||
USTTProcessorBase::InitSTTProcessor(BaseSTTManager, InProcessorConfig, InDebugMode); |
|||
WhisperProcessorConfig = Cast<USTTWhisperProcessorConfig>(InProcessorConfig); |
|||
if(!WhisperProcessorConfig) |
|||
{ |
|||
if (IsValid(STTManager)) |
|||
STTManager->OnSTTError.Broadcast(TEXT("Whisper Processor Config is invalid.")); |
|||
return; |
|||
} |
|||
|
|||
if (WhisperProcessorConfig->OpenAI_API_Key.IsEmpty()) { |
|||
if (IsValid(STTManager)) |
|||
STTManager->OnSTTError.Broadcast(TEXT("OpenAI API Key not set. Needs to be done before initializing modules.")); |
|||
return; |
|||
} |
|||
|
|||
NormalizeWhisperURL(); |
|||
|
|||
if (IsValid(STTManager)) |
|||
{ |
|||
STTManager->OnSpeechStateChanged.AddUniqueDynamic(this, &USTTProcessorWhisper::OnSpeechStateChanged); |
|||
} |
|||
|
|||
PerformHealthCheck(); |
|||
} |
|||
|
|||
void USTTProcessorWhisper::ClearSTTProcessor() |
|||
{ |
|||
USTTProcessorBase::ClearSTTProcessor(); |
|||
BufferedPCMData.Empty(); |
|||
bHasBufferedAudioInformation = false; |
|||
|
|||
for (TSharedPtr<IHttpRequest, ESPMode::ThreadSafe>& Request : ActiveRequests) |
|||
{ |
|||
if (Request.IsValid()) |
|||
{ |
|||
Request->OnProcessRequestComplete().Unbind(); |
|||
Request->CancelRequest(); |
|||
} |
|||
} |
|||
ActiveRequests.Empty(); |
|||
} |
|||
|
|||
void USTTProcessorWhisper::DestroySTTProcessor() |
|||
{ |
|||
ClearSTTProcessor(); |
|||
STTManager = nullptr; |
|||
} |
|||
|
|||
void USTTProcessorWhisper::OnChunkReceived(TArray<int16> PCMData, FAudioInformation AudioInformation) |
|||
{ |
|||
if (CurrentTalkingState != ESTTTalkingState::TALKING) |
|||
return; |
|||
|
|||
if (PCMData.Num() == 0) |
|||
return; |
|||
|
|||
if (!bHasBufferedAudioInformation) |
|||
{ |
|||
BufferedAudioInformation = AudioInformation; |
|||
bHasBufferedAudioInformation = true; |
|||
} |
|||
else if (BufferedAudioInformation.SampleRate != AudioInformation.SampleRate || |
|||
BufferedAudioInformation.NumChannels != AudioInformation.NumChannels) |
|||
{ |
|||
BufferedPCMData.Empty(); |
|||
BufferedAudioInformation = AudioInformation; |
|||
} |
|||
|
|||
const int64 BytesPerSample = sizeof(int16); |
|||
const int64 CurrentBytes = static_cast<int64>(BufferedPCMData.Num()) * BytesPerSample; |
|||
const int64 NewBytes = static_cast<int64>(PCMData.Num()) * BytesPerSample; |
|||
const int64 MaxUploadBytes = static_cast<int64>(25) * 1024 * 1024; |
|||
const int64 MaxAudioBytes = MaxUploadBytes - 1024; |
|||
|
|||
if (CurrentBytes + NewBytes > MaxAudioBytes) |
|||
{ |
|||
int64 ExcessBytes = CurrentBytes + NewBytes - MaxAudioBytes; |
|||
int64 SamplesToRemove = (ExcessBytes + BytesPerSample - 1) / BytesPerSample; |
|||
|
|||
if (SamplesToRemove >= BufferedPCMData.Num()) |
|||
{ |
|||
BufferedPCMData.Empty(); |
|||
if (NewBytes > MaxAudioBytes) |
|||
{ |
|||
int64 NewSamplesAllowed = MaxAudioBytes / BytesPerSample; |
|||
if (NewSamplesAllowed > 0 && NewSamplesAllowed < PCMData.Num()) |
|||
{ |
|||
int32 StartIndex = PCMData.Num() - static_cast<int32>(NewSamplesAllowed); |
|||
BufferedPCMData.Append(&PCMData[StartIndex], static_cast<int32>(NewSamplesAllowed)); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
BufferedPCMData.Append(PCMData); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
BufferedPCMData.RemoveAt(0, static_cast<int32>(SamplesToRemove), EAllowShrinking::No); |
|||
BufferedPCMData.Append(PCMData); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
BufferedPCMData.Append(PCMData); |
|||
} |
|||
} |
|||
|
|||
void USTTProcessorWhisper::OnSpeechStateChanged(ESTTTalkingState TalkingState) |
|||
{ |
|||
CurrentTalkingState = TalkingState; |
|||
|
|||
if (TalkingState == ESTTTalkingState::BLOCKED) |
|||
{ |
|||
ClearSTTProcessor(); |
|||
return; |
|||
} |
|||
|
|||
if (TalkingState == ESTTTalkingState::SILENCE || TalkingState == ESTTTalkingState::TRANSCRIBING) |
|||
{ |
|||
StartTranscriptionFromBuffer(); |
|||
} |
|||
} |
|||
|
|||
void USTTProcessorWhisper::StartTranscriptionFromBuffer() |
|||
{ |
|||
|
|||
if (BufferedPCMData.Num() == 0 || !bHasBufferedAudioInformation) |
|||
return; |
|||
|
|||
TArray<int16> PCMDataCopy = BufferedPCMData; |
|||
FAudioInformation AudioInfoCopy = BufferedAudioInformation; |
|||
BufferedPCMData.Empty(); |
|||
bHasBufferedAudioInformation = false; |
|||
|
|||
// Require at least x seconds of audio before sending to Whisper
|
|||
if (AudioInfoCopy.SampleRate > 0 && AudioInfoCopy.NumChannels > 0) |
|||
{ |
|||
const float Frames = static_cast<float>(PCMDataCopy.Num()) / static_cast<float>(AudioInfoCopy.NumChannels); |
|||
const float DurationSeconds = Frames / static_cast<float>(AudioInfoCopy.SampleRate); |
|||
if (DurationSeconds < WhisperProcessorConfig->MinDuration) |
|||
{ |
|||
return; |
|||
} |
|||
} |
|||
|
|||
TArray<uint8> WavData; |
|||
if (!BuildWavFromPCM(PCMDataCopy, AudioInfoCopy, WavData)) |
|||
{ |
|||
if (IsValid(STTManager)) |
|||
STTManager->OnSTTError.Broadcast(TEXT("Failed to build WAV data for Whisper transcription.")); |
|||
return; |
|||
} |
|||
|
|||
const int64 MaxUploadBytes = static_cast<int64>(25) * 1024 * 1024; |
|||
if (WavData.Num() > MaxUploadBytes) |
|||
{ |
|||
if (IsValid(STTManager)) |
|||
STTManager->OnSTTError.Broadcast(TEXT("Whisper audio size exceeds 25MB limit. Transcription aborted.")); |
|||
return; |
|||
} |
|||
|
|||
SendWhisperRequest(MoveTemp(WavData)); |
|||
} |
|||
|
|||
bool USTTProcessorWhisper::BuildWavFromPCM(const TArray<int16>& PCMData, const FAudioInformation& AudioInformation, TArray<uint8>& OutWavData) const |
|||
{ |
|||
if (PCMData.Num() == 0) |
|||
return false; |
|||
|
|||
if (AudioInformation.SampleRate <= 0 || AudioInformation.NumChannels <= 0) |
|||
return false; |
|||
|
|||
const uint32 BitsPerSample = 16; |
|||
const uint32 BytesPerSample = BitsPerSample / 8; |
|||
const uint32 NumSamples = static_cast<uint32>(PCMData.Num()); |
|||
const uint32 ByteRate = static_cast<uint32>(AudioInformation.SampleRate) * static_cast<uint32>(AudioInformation.NumChannels) * BytesPerSample; |
|||
const uint32 BlockAlign = static_cast<uint32>(AudioInformation.NumChannels) * BytesPerSample; |
|||
const uint32 Subchunk1Size = 16; |
|||
const uint32 AudioFormat = 1; |
|||
const uint32 Subchunk2Size = NumSamples * BytesPerSample; |
|||
const uint32 ChunkSize = 4 + (8 + Subchunk1Size) + (8 + Subchunk2Size); |
|||
|
|||
OutWavData.Reset(); |
|||
OutWavData.Reserve(ChunkSize + 8); |
|||
|
|||
auto AppendLittleEndian = [&OutWavData](uint32 Value, int32 ByteCount) |
|||
{ |
|||
for (int32 i = 0; i < ByteCount; i++) |
|||
{ |
|||
OutWavData.Add(static_cast<uint8>((Value >> (i * 8)) & 0xFF)); |
|||
} |
|||
}; |
|||
|
|||
OutWavData.Append(reinterpret_cast<const uint8*>("RIFF"), 4); |
|||
AppendLittleEndian(ChunkSize, 4); |
|||
OutWavData.Append(reinterpret_cast<const uint8*>("WAVE"), 4); |
|||
|
|||
OutWavData.Append(reinterpret_cast<const uint8*>("fmt "), 4); |
|||
AppendLittleEndian(Subchunk1Size, 4); |
|||
AppendLittleEndian(AudioFormat, 2); |
|||
AppendLittleEndian(static_cast<uint32>(AudioInformation.NumChannels), 2); |
|||
AppendLittleEndian(static_cast<uint32>(AudioInformation.SampleRate), 4); |
|||
AppendLittleEndian(ByteRate, 4); |
|||
AppendLittleEndian(BlockAlign, 2); |
|||
AppendLittleEndian(BitsPerSample, 2); |
|||
|
|||
OutWavData.Append(reinterpret_cast<const uint8*>("data"), 4); |
|||
AppendLittleEndian(Subchunk2Size, 4); |
|||
|
|||
const uint8* PCMDataPtr = reinterpret_cast<const uint8*>(PCMData.GetData()); |
|||
OutWavData.Append(PCMDataPtr, Subchunk2Size); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
void USTTProcessorWhisper::BuildMultipartBody(const TArray<uint8>& WavData, const FString& Boundary, TArray<uint8>& OutBody, const FString& Prompt) const |
|||
{ |
|||
OutBody.Reset(); |
|||
|
|||
FString BoundaryLine = FString::Printf(TEXT("--%s\r\n"), *Boundary); |
|||
AppendStringToBody(OutBody, BoundaryLine); |
|||
AppendStringToBody(OutBody, TEXT("Content-Disposition: form-data; name=\"model\"\r\n\r\n")); |
|||
AppendStringToBody(OutBody, TranscribeModelEnumToString(WhisperProcessorConfig->Model) + TEXT("\r\n")); |
|||
|
|||
if (!Prompt.IsEmpty()) |
|||
{ |
|||
BoundaryLine = FString::Printf(TEXT("--%s\r\n"), *Boundary); |
|||
AppendStringToBody(OutBody, BoundaryLine); |
|||
AppendStringToBody(OutBody, TEXT("Content-Disposition: form-data; name=\"prompt\"\r\n\r\n")); |
|||
AppendStringToBody(OutBody, Prompt + TEXT("\r\n")); |
|||
} |
|||
|
|||
BoundaryLine = FString::Printf(TEXT("--%s\r\n"), *Boundary); |
|||
AppendStringToBody(OutBody, BoundaryLine); |
|||
AppendStringToBody(OutBody, TEXT("Content-Disposition: form-data; name=\"file\"; filename=\"audio.wav\"\r\n")); |
|||
AppendStringToBody(OutBody, TEXT("Content-Type: audio/wav\r\n\r\n")); |
|||
OutBody.Append(WavData); |
|||
AppendStringToBody(OutBody, TEXT("\r\n")); |
|||
|
|||
BoundaryLine = FString::Printf(TEXT("--%s--\r\n"), *Boundary); |
|||
AppendStringToBody(OutBody, BoundaryLine); |
|||
} |
|||
|
|||
void USTTProcessorWhisper::NormalizeWhisperURL() |
|||
{ |
|||
if (!WhisperProcessorConfig) |
|||
return; |
|||
|
|||
NormalizedWhisperURL = WhisperProcessorConfig->WhisperURL; |
|||
if (!NormalizedWhisperURL.StartsWith(TEXT("http://")) && !NormalizedWhisperURL.StartsWith(TEXT("https://"))) |
|||
{ |
|||
NormalizedWhisperURL = FString::Printf(TEXT("https://%s"), *NormalizedWhisperURL); |
|||
} |
|||
} |
|||
|
|||
void USTTProcessorWhisper::PerformHealthCheck() |
|||
{ |
|||
if (!WhisperProcessorConfig) |
|||
return; |
|||
|
|||
if (NormalizedWhisperURL.IsEmpty()) |
|||
NormalizeWhisperURL(); |
|||
|
|||
FHttpModule& HttpModule = FHttpModule::Get(); |
|||
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = HttpModule.CreateRequest(); |
|||
Request->SetURL(NormalizedWhisperURL); |
|||
Request->SetVerb(TEXT("GET")); |
|||
FString AuthHeader = FString::Printf(TEXT("Bearer %s"), *WhisperProcessorConfig->OpenAI_API_Key); |
|||
Request->SetHeader(TEXT("Authorization"), AuthHeader); |
|||
Request->OnProcessRequestComplete().BindLambda([ |
|||
WeakManager = TWeakObjectPtr<USTTManagerBase>(STTManager)](FHttpRequestPtr Req, FHttpResponsePtr Resp, bool bWasSuccessful) |
|||
{ |
|||
if (!WeakManager.IsValid()) |
|||
return; |
|||
|
|||
USTTManagerBase* Manager = WeakManager.Get(); |
|||
if (!bWasSuccessful || !Resp.IsValid()) |
|||
{ |
|||
Manager->OnSTTError.Broadcast(TEXT("Whisper initialization check failed: URL not reachable.")); |
|||
return; |
|||
} |
|||
|
|||
int32 StatusCode = Resp->GetResponseCode(); |
|||
if (StatusCode == 401) |
|||
{ |
|||
Manager->OnSTTError.Broadcast(TEXT("Whisper initialization check failed: API key invalid (401).")); |
|||
} |
|||
}); |
|||
|
|||
Request->ProcessRequest(); |
|||
} |
|||
|
|||
void USTTProcessorWhisper::SendWhisperRequest(TArray<uint8>&& WavData) |
|||
{ |
|||
if (!WhisperProcessorConfig) |
|||
return; |
|||
|
|||
if (NormalizedWhisperURL.IsEmpty()) |
|||
NormalizeWhisperURL(); |
|||
|
|||
FHttpModule& HttpModule = FHttpModule::Get(); |
|||
TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = HttpModule.CreateRequest(); |
|||
Request->SetURL(NormalizedWhisperURL); |
|||
Request->SetVerb(TEXT("POST")); |
|||
|
|||
FString AuthHeader = FString::Printf(TEXT("Bearer %s"), *WhisperProcessorConfig->OpenAI_API_Key); |
|||
Request->SetHeader(TEXT("Authorization"), AuthHeader); |
|||
Request->SetHeader(TEXT("Accept"), TEXT("application/json")); |
|||
|
|||
FString Boundary = TEXT("----AvatarCoreSTTWhisperBoundary"); |
|||
FString ContentType = FString::Printf(TEXT("multipart/form-data; boundary=%s"), *Boundary); |
|||
Request->SetHeader(TEXT("Content-Type"), ContentType); |
|||
|
|||
FString Prompt; |
|||
if (IsValid(STTManager)) |
|||
{ |
|||
Prompt = STTManager->GetSpecialWordsAsString(); |
|||
} |
|||
|
|||
TArray<uint8> Body; |
|||
BuildMultipartBody(WavData, Boundary, Body, Prompt); |
|||
Request->SetContent(Body); |
|||
|
|||
OnTranscriptionStarted(); |
|||
int32 TranscriptionId = TranscriptionCounter; |
|||
|
|||
TWeakObjectPtr<USTTProcessorWhisper> WeakThis(this); |
|||
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> RequestPtr = Request; |
|||
Request->OnProcessRequestComplete().BindLambda([ |
|||
WeakThis, |
|||
RequestPtr, |
|||
TranscriptionId](FHttpRequestPtr Req, FHttpResponsePtr Resp, bool bWasSuccessful) |
|||
{ |
|||
if (!WeakThis.IsValid()) |
|||
return; |
|||
|
|||
USTTProcessorWhisper* Self = WeakThis.Get(); |
|||
Self->ActiveRequests.Remove(RequestPtr); |
|||
|
|||
if (!bWasSuccessful || !Resp.IsValid()) |
|||
{ |
|||
if (IsValid(Self->STTManager)) |
|||
Self->STTManager->OnSTTError.Broadcast(TEXT("Whisper request failed or no response received.")); |
|||
Self->bTranscriptionRunning = false; |
|||
return; |
|||
} |
|||
|
|||
int32 StatusCode = Resp->GetResponseCode(); |
|||
if (StatusCode == 401) |
|||
{ |
|||
if (IsValid(Self->STTManager)) |
|||
Self->STTManager->OnSTTError.Broadcast(TEXT("Whisper request unauthorized (401). Please check API key.")); |
|||
Self->bTranscriptionRunning = false; |
|||
return; |
|||
} |
|||
else if (StatusCode < 200 || StatusCode >= 300) |
|||
{ |
|||
FString ErrorBody = Resp->GetContentAsString(); |
|||
if (IsValid(Self->STTManager)) |
|||
{ |
|||
FString ErrorMessage = FString::Printf(TEXT("Whisper request failed with HTTP %d: %s"), StatusCode, *ErrorBody); |
|||
Self->STTManager->OnSTTError.Broadcast(ErrorMessage); |
|||
} |
|||
Self->bTranscriptionRunning = false; |
|||
return; |
|||
} |
|||
|
|||
FString JsonString = Resp->GetContentAsString(); |
|||
TSharedPtr<FJsonObject> RootObject; |
|||
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(JsonString); |
|||
if (!FJsonSerializer::Deserialize(Reader, RootObject) || !RootObject.IsValid()) |
|||
{ |
|||
if (IsValid(Self->STTManager)) |
|||
Self->STTManager->OnSTTError.Broadcast(TEXT("Failed to parse Whisper JSON response.")); |
|||
Self->bTranscriptionRunning = false; |
|||
return; |
|||
} |
|||
|
|||
FString Text; |
|||
if (!RootObject->TryGetStringField(TEXT("text"), Text)) |
|||
{ |
|||
if (IsValid(Self->STTManager)) |
|||
Self->STTManager->OnSTTError.Broadcast(TEXT("Whisper response JSON does not contain 'text' field.")); |
|||
Self->bTranscriptionRunning = false; |
|||
return; |
|||
} |
|||
|
|||
Self->OnTranscriptionResult(TranscriptionId, Text); |
|||
}); |
|||
|
|||
ActiveRequests.Add(RequestPtr); |
|||
Request->ProcessRequest(); |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
|||
|
|||
|
|||
#include "Processor/Whisper/STTWhisperProcessorConfig.h" |
|||
#include "Processor/Whisper/STTProcessorWhisper.h" |
|||
|
|||
USTTWhisperProcessorConfig::USTTWhisperProcessorConfig(const FObjectInitializer& ObjectInitializer) |
|||
{ |
|||
STTProcessorClass = USTTProcessorWhisper::StaticClass(); |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
|||
|
|||
#pragma once |
|||
|
|||
#include "CoreMinimal.h" |
|||
#include "Processor/STTProcessorBase.h" |
|||
#include "Processor/Whisper/STTWhisperProcessorConfig.h" |
|||
#include "STTProcessorWhisper.generated.h" |
|||
|
|||
/**
|
|||
* |
|||
*/ |
|||
UCLASS() |
|||
class USTTProcessorWhisper : public USTTProcessorBase |
|||
{ |
|||
GENERATED_BODY() |
|||
|
|||
public: |
|||
|
|||
void InitSTTProcessor(USTTManagerBase* BaseSTTManager, USTTBaseProcessorConfig* InProcessorConfig, bool InDebugMode = false) override; |
|||
virtual void ClearSTTProcessor() override; |
|||
virtual void DestroySTTProcessor() override; |
|||
|
|||
virtual void OnChunkReceived(TArray<int16> PCMData, FAudioInformation AudioInformation) override; |
|||
|
|||
UFUNCTION() |
|||
void OnSpeechStateChanged(ESTTTalkingState TalkingState); |
|||
|
|||
private: |
|||
|
|||
void StartTranscriptionFromBuffer(); |
|||
bool BuildWavFromPCM(const TArray<int16>& PCMData, const FAudioInformation& AudioInformation, TArray<uint8>& OutWavData) const; |
|||
void BuildMultipartBody(const TArray<uint8>& WavData, const FString& Boundary, TArray<uint8>& OutBody, const FString& Prompt) const; |
|||
void NormalizeWhisperURL(); |
|||
void PerformHealthCheck(); |
|||
void SendWhisperRequest(TArray<uint8>&& WavData); |
|||
|
|||
private: |
|||
|
|||
USTTWhisperProcessorConfig* WhisperProcessorConfig = nullptr; |
|||
FString NormalizedWhisperURL; |
|||
TArray<int16> BufferedPCMData; |
|||
FAudioInformation BufferedAudioInformation; |
|||
bool bHasBufferedAudioInformation = false; |
|||
TArray<TSharedPtr<class IHttpRequest, ESPMode::ThreadSafe>> ActiveRequests; |
|||
ESTTTalkingState CurrentTalkingState = ESTTTalkingState::SILENCE; |
|||
}; |
|||
@ -0,0 +1,38 @@ |
|||
// Fill out your copyright notice in the Description page of Project Settings.
|
|||
|
|||
#pragma once |
|||
|
|||
#include "CoreMinimal.h" |
|||
#include "Processor/STTBaseProcessorConfig.h" |
|||
#include "STTWhisperProcessorConfig.generated.h" |
|||
|
|||
UENUM(BlueprintType) |
|||
enum class EOpenAITranscriptionModel : uint8 |
|||
{ |
|||
Whisper1 UMETA(DisplayName = "Whisper-1"), |
|||
TranscribeMini4o UMETA(DisplayName = "4o Transcribe Mini"), |
|||
Transcribe4o UMETA(DisplayName = "4o Transcribe") |
|||
}; |
|||
|
|||
/**
|
|||
* |
|||
*/ |
|||
UCLASS() |
|||
class USTTWhisperProcessorConfig : public USTTBaseProcessorConfig |
|||
{ |
|||
GENERATED_BODY() |
|||
|
|||
public: |
|||
|
|||
USTTWhisperProcessorConfig(const FObjectInitializer& ObjectInitializer); |
|||
|
|||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreSTT|Whisper", meta = (ExposeOnSpawn = "true")) |
|||
FString OpenAI_API_Key = ""; |
|||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreSTT|Whisper", meta = (ExposeOnSpawn = "true")) |
|||
FString WhisperURL = "api.openai.com/v1/audio/transcriptions"; |
|||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreSTT|Whisper", meta = (ExposeOnSpawn = "true")) |
|||
EOpenAITranscriptionModel Model = EOpenAITranscriptionModel::Transcribe4o; |
|||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AvatarCoreSTT|Whisper", meta = (ExposeOnSpawn = "true")) |
|||
float MinDuration = 0.75f; |
|||
|
|||
}; |
|||
@ -0,0 +1,8 @@ |
|||
cmake_minimum_required(VERSION 3.19) |
|||
|
|||
project(c_headers) |
|||
|
|||
set(SRC_DIR "${PROJECT_SOURCE_DIR}") |
|||
add_library(${PROJECT_NAME} INTERFACE ${SPEECH_C_API_HEADERS}) |
|||
target_include_directories(${PROJECT_NAME} INTERFACE ${PROJECT_SOURCE_DIR}) |
|||
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER api) |
|||
@ -0,0 +1,81 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#include <stdbool.h> |
|||
#include <azac_error.h> |
|||
|
|||
#ifdef __cplusplus |
|||
#define AZAC_EXTERN_C extern "C" |
|||
#else |
|||
#define AZAC_EXTERN_C |
|||
#endif |
|||
|
|||
#ifdef _WIN32 |
|||
#define AZAC_DLL_EXPORT __declspec(dllexport) |
|||
#define AZAC_DLL_IMPORT __declspec(dllimport) |
|||
#define AZAC_API_NOTHROW __declspec(nothrow) |
|||
#define AZAC_API_RESULTTYPE AZACHR |
|||
#define AZAC_API_CALLTYPE __stdcall |
|||
#define AZAC_API_VCALLTYPE __cdecl |
|||
#else |
|||
#define AZAC_DLL_EXPORT __attribute__ ((__visibility__("default"))) |
|||
#define AZAC_DLL_IMPORT |
|||
#define AZAC_API_NOTHROW __attribute__((nothrow)) |
|||
#define AZAC_API_RESULTTYPE AZACHR |
|||
#define AZAC_API_CALLTYPE |
|||
#define AZAC_API_VCALLTYPE __attribute__((cdecl)) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_EXPORTAPIS |
|||
#define AZAC_API_EXPORT AZAC_DLL_EXPORT |
|||
#endif |
|||
#ifdef AZAC_CONFIG_IMPORTAPIS |
|||
#define AZAC_API_EXPORT AZAC_DLL_IMPORT |
|||
#endif |
|||
#ifdef AZAC_CONFIG_STATIC_LINK_APIS |
|||
#define AZAC_API_EXPORT |
|||
#endif |
|||
#ifndef AZAC_API_EXPORT |
|||
#define AZAC_API_EXPORT AZAC_DLL_IMPORT |
|||
#endif |
|||
|
|||
#define AZAC_API AZAC_EXTERN_C AZAC_API_EXPORT AZAC_API_RESULTTYPE AZAC_API_NOTHROW AZAC_API_CALLTYPE |
|||
#define AZAC_API_(type) AZAC_EXTERN_C AZAC_API_EXPORT type AZAC_API_NOTHROW AZAC_API_CALLTYPE |
|||
#define AZAC_API__(type) AZAC_EXTERN_C AZAC_API_EXPORT AZAC_API_NOTHROW type AZAC_API_CALLTYPE |
|||
#define AZAC_APIV AZAC_EXTERN_C AZAC_API_EXPORT AZAC_API_NOTHROW AZAC_API_RESULTTYPE AZAC_API_VCALLTYPE |
|||
#define AZAC_APIV_(type) AZAC_EXTERN_C AZAC_API_EXPORT AZAC_API_NOTHROW type AZAC_API_VCALLTYPE |
|||
#define AZAC_API_PRIVATE AZAC_EXTERN_C AZAC_API_RESULTTYPE AZAC_API_NOTHROW AZAC_API_CALLTYPE |
|||
#define AZAC_API_PRIVATE_(type) AZAC_EXTERN_C type AZAC_API_NOTHROW AZAC_API_CALLTYPE |
|||
|
|||
struct _azac_empty {}; |
|||
typedef struct _azac_empty* _azachandle; |
|||
typedef _azachandle AZAC_HANDLE; |
|||
|
|||
#define AZAC_HANDLE_INVALID ((AZAC_HANDLE)-1) |
|||
#define AZAC_HANDLE_RESERVED1 ((AZAC_HANDLE)+1) |
|||
|
|||
#ifndef AZAC_SUPPRESS_DIAGNOSTICS_INCLUDE_FROM_COMMON |
|||
#define AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DIAGNOSTICS |
|||
#include <azac_api_c_diagnostics.h> |
|||
#undef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DIAGNOSTICS |
|||
#endif |
|||
|
|||
#ifndef AZAC_SUPPRESS_ERROR_INCLUDE_FROM_COMMON |
|||
#define AZAC_SUPPRESS_COMMON_INCLUDE_FROM_ERROR |
|||
#include <azac_api_c_error.h> |
|||
#undef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_ERROR |
|||
#endif |
|||
|
|||
#ifndef AZAC_SUPPRESS_DEBUG_INCLUDE_FROM_COMMON |
|||
#define AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DEBUG |
|||
#include <azac_debug.h> |
|||
#undef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DEBUG |
|||
#endif |
|||
|
|||
#define AZACPROPERTYBAGHANDLE AZAC_HANDLE |
|||
@ -0,0 +1,80 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#ifndef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DIAGNOSTICS |
|||
#define AZAC_SUPPRESS_DIAGNOSTICS_INCLUDE_FROM_COMMON |
|||
#include <azac_api_c_common.h> |
|||
#undef AZAC_SUPPRESS_DIAGNOSTICS_INCLUDE_FROM_COMMON |
|||
#endif |
|||
|
|||
#include <stdarg.h> |
|||
#include <stddef.h> |
|||
|
|||
//
|
|||
// APIs to manage logging to file
|
|||
//
|
|||
AZAC_API diagnostics_log_start_logging(AZAC_HANDLE hpropbag, void* reserved); |
|||
AZAC_API diagnostics_log_apply_properties(AZAC_HANDLE hpropbag, void* reserved); |
|||
AZAC_API diagnostics_log_stop_logging(); |
|||
|
|||
//
|
|||
// APIs to manage logging events
|
|||
//
|
|||
typedef void(*DIAGNOSTICS_CALLBACK_FUNC)(const char *logLine); |
|||
AZAC_API diagnostics_logmessage_set_callback(DIAGNOSTICS_CALLBACK_FUNC callback); |
|||
AZAC_API diagnostics_logmessage_set_filters(const char* filters); |
|||
|
|||
//
|
|||
// APIs to managed eventSource events
|
|||
//
|
|||
typedef void(*DIAGNOSTICS_EVENTSOURCE_CALLBACK_FUNC)(const char *logLine, const int level); |
|||
AZAC_API diagnostics_eventsource_logmessage_set_callback(DIAGNOSTICS_EVENTSOURCE_CALLBACK_FUNC callback); |
|||
AZAC_API diagnostics_eventsource_logmessage_set_filters(const char* filters); |
|||
|
|||
//
|
|||
// APIs to manage logging to memory
|
|||
//
|
|||
AZAC_API_(void) diagnostics_log_memory_start_logging(); |
|||
AZAC_API_(void) diagnostics_log_memory_stop_logging(); |
|||
AZAC_API_(void) diagnostics_log_memory_set_filters(const char* filters); |
|||
|
|||
// The binding layers use these to implement a dump to vector of strings or an output stream
|
|||
AZAC_API_(size_t) diagnostics_log_memory_get_line_num_oldest(); |
|||
AZAC_API_(size_t) diagnostics_log_memory_get_line_num_newest(); |
|||
AZAC_API__(const char*) diagnostics_log_memory_get_line(size_t lineNum); |
|||
|
|||
// Dump to file, std out or std err with optional prefix string
|
|||
AZAC_API diagnostics_log_memory_dump_to_stderr(); // This calls diagnostics_log_memory_dump(nullptr, nullptr, false, true)
|
|||
AZAC_API diagnostics_log_memory_dump(const char* filename, const char* linePrefix, bool emitToStdOut, bool emitToStdErr); |
|||
AZAC_API diagnostics_log_memory_dump_on_exit(const char* filename, const char* linePrefix, bool emitToStdOut, bool emitToStdErr); |
|||
|
|||
//
|
|||
// APIs to manage logging to the console
|
|||
//
|
|||
AZAC_API_(void) diagnostics_log_console_start_logging(bool logToStderr); |
|||
AZAC_API_(void) diagnostics_log_console_stop_logging(); |
|||
AZAC_API_(void) diagnostics_log_console_set_filters(const char* filters); |
|||
|
|||
//
|
|||
// APIs to log a string
|
|||
//
|
|||
AZAC_API_(void) diagnostics_log_format_message(char* buffer, size_t bufferSize, int level, const char* pszTitle, const char* fileName, const int lineNumber, const char* pszFormat, va_list argptr); |
|||
AZAC_API_(void) diagnostics_log_trace_string(int level, const char* pszTitle, const char* fileName, const int lineNumber, const char* psz); |
|||
AZAC_API_(void) diagnostics_log_trace_message(int level, const char* pszTitle, const char* fileName, const int lineNumber, const char* pszFormat, ...); |
|||
AZAC_API_(void) diagnostics_log_trace_message2(int level, const char* pszTitle, const char* fileName, const int lineNumber, const char* pszFormat, va_list argptr); |
|||
|
|||
AZAC_API_(void) diagnostics_set_log_level(const char * logger, const char * level); |
|||
AZAC_API_(bool) diagnostics_is_log_level_enabled(int level); |
|||
|
|||
//
|
|||
// Memory tracking API's
|
|||
//
|
|||
AZAC_API_(size_t) diagnostics_get_handle_count(); |
|||
AZAC_API__(const char*) diagnostics_get_handle_info(); |
|||
AZAC_API diagnostics_free_string(const char* value); |
|||
@ -0,0 +1,24 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/vision/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#ifndef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_ERROR |
|||
#define AZAC_SUPPRESS_ERROR_INCLUDE_FROM_COMMON |
|||
#include <azac_api_c_common.h> |
|||
#undef AZAC_SUPPRESS_ERROR_INCLUDE_FROM_COMMON |
|||
#endif |
|||
|
|||
typedef const char * const_char_ptr; |
|||
|
|||
AZAC_API_(const_char_ptr) error_get_message(AZAC_HANDLE errorHandle); |
|||
|
|||
AZAC_API_(const_char_ptr) error_get_call_stack(AZAC_HANDLE errorHandle); |
|||
|
|||
AZAC_API error_get_error_code(AZAC_HANDLE errorHandle); |
|||
|
|||
AZAC_API error_release(AZAC_HANDLE errorHandle); |
|||
@ -0,0 +1,13 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#include "azac_api_c_common.h" |
|||
|
|||
AZAC_API_(size_t) pal_wstring_to_string(char * dst, const wchar_t * src, size_t dstSize); |
|||
AZAC_API_(size_t) pal_string_to_wstring(wchar_t * dst, const char * src, size_t dstSize); |
|||
@ -0,0 +1,845 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <azac_error.h> |
|||
#include <inttypes.h> |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#ifndef _MSC_VER |
|||
// macros in this header generate a bunch of
|
|||
// "ISO C++11 requires at least one argument for the "..." in a variadic macro" errors.
|
|||
// system_header pragma is the only mechanism that helps to suppress them.
|
|||
// https://stackoverflow.com/questions/35587137/how-to-suppress-gcc-variadic-macro-argument-warning-for-zero-arguments-for-a-par
|
|||
// TODO: try to make macros standard-compliant.
|
|||
#pragma GCC system_header |
|||
#endif |
|||
|
|||
#ifndef __cplusplus |
|||
#define static_assert _Static_assert |
|||
#endif |
|||
|
|||
#define UNUSED(x) (void)(x) |
|||
|
|||
//-------------------------------------------------------
|
|||
// Re-enabled ability to compile out all macros...
|
|||
// However, currently still need to keep all macros until
|
|||
// final review of all macros is complete.
|
|||
//-------------------------------------------------------
|
|||
|
|||
#define AZAC_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL 1 |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL |
|||
#if defined(AZAC_CONFIG_TRACE_ALL) && !defined(AZAC_CONFIG_DBG_TRACE_ALL) && (!defined(DEBUG) || !defined(_DEBUG)) |
|||
#define AZAC_CONFIG_DBG_TRACE_ALL 1 |
|||
#endif |
|||
#endif |
|||
|
|||
//-------------------------------------------------------
|
|||
// AZAC_ and AZAC_DBG_ macro configuration
|
|||
//-------------------------------------------------------
|
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_ALL |
|||
#define AZAC_CONFIG_DBG_TRACE_VERBOSE 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_INFO 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_WARNING 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_ERROR 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_FUNCTION 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_SCOPE 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_ASSERT 1 |
|||
#define AZAC_CONFIG_DBG_TRACE_VERIFY 1 |
|||
#ifndef AZAC_CONFIG_TRACE_ALL |
|||
#define AZAC_CONFIG_TRACE_ALL 1 |
|||
#endif |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_ALL |
|||
#define AZAC_CONFIG_TRACE_VERBOSE 1 |
|||
#define AZAC_CONFIG_TRACE_INFO 1 |
|||
#define AZAC_CONFIG_TRACE_WARNING 1 |
|||
#define AZAC_CONFIG_TRACE_ERROR 1 |
|||
#define AZAC_CONFIG_TRACE_FUNCTION 1 |
|||
#define AZAC_CONFIG_TRACE_SCOPE 1 |
|||
#define AZAC_CONFIG_TRACE_THROW_ON_FAIL 1 |
|||
#define AZAC_CONFIG_TRACE_REPORT_ON_FAIL 1 |
|||
#define AZAC_CONFIG_TRACE_RETURN_ON_FAIL 1 |
|||
#define AZAC_CONFIG_TRACE_EXITFN_ON_FAIL 1 |
|||
#endif |
|||
|
|||
//-----------------------------------------------------------
|
|||
// AZAC_TRACE macro common implementations
|
|||
//-----------------------------------------------------------
|
|||
|
|||
#define __AZAC_TRACE_LEVEL_INFO 0x08 // Trace_Info
|
|||
#define __AZAC_TRACE_LEVEL_WARNING 0x04 // Trace_Warning
|
|||
#define __AZAC_TRACE_LEVEL_ERROR 0x02 // Trace_Error
|
|||
#define __AZAC_TRACE_LEVEL_VERBOSE 0x10 // Trace_Verbose
|
|||
|
|||
#ifndef __AZAC_DO_TRACE_IMPL |
|||
#ifdef __cplusplus |
|||
#include <algorithm> |
|||
#include <stdio.h> |
|||
#include <stdarg.h> |
|||
#include <string> |
|||
inline void __azac_do_trace_message(int level, const char* pszTitle, const char* fileName, const int lineNumber, const char* pszFormat, ...) throw() |
|||
{ |
|||
UNUSED(level); |
|||
|
|||
bool logToConsole = false; |
|||
#if defined(DEBUG) || defined(_DEBUG) |
|||
logToConsole = true; |
|||
#endif |
|||
|
|||
if (!logToConsole) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
try |
|||
{ |
|||
va_list argptr; |
|||
va_start(argptr, pszFormat); |
|||
|
|||
std::string format; |
|||
while (*pszFormat == '\n' || *pszFormat == '\r') |
|||
{ |
|||
if (*pszFormat == '\r') |
|||
{ |
|||
pszTitle = nullptr; |
|||
} |
|||
|
|||
format += *pszFormat++; |
|||
} |
|||
|
|||
if (pszTitle != nullptr) |
|||
{ |
|||
format += pszTitle; |
|||
} |
|||
|
|||
std::string fileNameOnly(fileName); |
|||
std::replace(fileNameOnly.begin(), fileNameOnly.end(), '\\', '/'); |
|||
|
|||
std::string fileNameLineNumber = " " + fileNameOnly.substr(fileNameOnly.find_last_of('/', std::string::npos) + 1) + ":" + std::to_string(lineNumber) + " "; |
|||
|
|||
format += fileNameLineNumber; |
|||
|
|||
format += pszFormat; |
|||
|
|||
if (format.length() < 1 || format[format.length() - 1] != '\n') |
|||
{ |
|||
format += "\n"; |
|||
} |
|||
|
|||
vfprintf(stderr, format.c_str(), argptr); |
|||
|
|||
va_end(argptr); |
|||
} |
|||
catch(...) |
|||
{ |
|||
} |
|||
} |
|||
#define __AZAC_DO_TRACE_IMPL __azac_do_trace_message |
|||
#else // __cplusplus
|
|||
#define __AZAC_DO_TRACE_IMPL |
|||
#endif // __cplusplus
|
|||
#endif |
|||
|
|||
#define __AZAC_DOTRACE(level, title, fileName, lineNumber, ...) \ |
|||
do { \ |
|||
__AZAC_DO_TRACE_IMPL(level, title, fileName, lineNumber, ##__VA_ARGS__); \ |
|||
} while (0) |
|||
|
|||
#define __AZAC_TRACE_INFO(title, fileName, lineNumber, msg, ...) __AZAC_DOTRACE(__AZAC_TRACE_LEVEL_INFO, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
#define __AZAC_TRACE_INFO_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
__AZAC_TRACE_INFO(title, fileName, lineNumber, msg, ##__VA_ARGS__); \ |
|||
} } while (0) |
|||
|
|||
#define __AZAC_TRACE_WARNING(title, fileName, lineNumber, msg, ...) __AZAC_DOTRACE(__AZAC_TRACE_LEVEL_WARNING, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
#define __AZAC_TRACE_WARNING_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
__AZAC_TRACE_WARNING(title, fileName, lineNumber, msg, ##__VA_ARGS__); \ |
|||
} } while (0) |
|||
|
|||
#define __AZAC_TRACE_ERROR(title, fileName, lineNumber, msg, ...) __AZAC_DOTRACE(__AZAC_TRACE_LEVEL_ERROR, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
#define __AZAC_TRACE_ERROR_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
__AZAC_TRACE_ERROR(title, fileName, lineNumber, msg, ##__VA_ARGS__); \ |
|||
} } while (0) |
|||
|
|||
#define __AZAC_TRACE_VERBOSE(title, fileName, lineNumber, msg, ...) __AZAC_DOTRACE(__AZAC_TRACE_LEVEL_VERBOSE, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
#define __AZAC_TRACE_VERBOSE_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
__AZAC_TRACE_VERBOSE(title, fileName, lineNumber, msg, ##__VA_ARGS__); \ |
|||
} } while (0) |
|||
|
|||
#define ___AZAC_EXPR_AS_STRING(_String) "" #_String |
|||
#define __AZAC_EXPR_AS_STRING(_String) ___AZAC_EXPR_AS_STRING(_String) |
|||
|
|||
#define __AZAC_TRACE_HR(title, fileName, lineNumber, hr, x) __AZAC_TRACE_ERROR(title, fileName, lineNumber, __AZAC_EXPR_AS_STRING(hr) " = 0x%0" PRIxPTR, x) |
|||
|
|||
#define __AZAC_REPORT_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} } while (0) |
|||
#define __AZAC_REPORT_ON_FAIL_IFNOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} } } while (0) |
|||
|
|||
#define __AZAC_T_RETURN_HR(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} \ |
|||
return x; \ |
|||
} while (0) |
|||
#define __AZAC_T_RETURN_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} \ |
|||
return x; \ |
|||
} } while (0) |
|||
#define __AZAC_T_RETURN_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
return x; \ |
|||
} } while (0) |
|||
#define __AZAC_T_RETURN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
return x; \ |
|||
} } } while (0) |
|||
#define __AZAC_RETURN_HR(hr) return hr |
|||
#define __AZAC_RETURN_HR_IF(hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
return hr; \ |
|||
} } while (0) |
|||
#define __AZAC_RETURN_ON_FAIL(hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
return x; \ |
|||
} } while (0) |
|||
#define __AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
return x; \ |
|||
} } } while (0) |
|||
|
|||
#define __AZAC_T_EXITFN_HR(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} while (0) |
|||
#define __AZAC_T_EXITFN_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
} \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
#define __AZAC_T_EXITFN_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
#define __AZAC_T_EXITFN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } } while (0) |
|||
|
|||
#define __AZAC_EXITFN_HR(hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} while (0) |
|||
#define __AZAC_EXITFN_HR_IF(hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
AZACHR x = hr; \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
#define __AZAC_EXITFN_ON_FAIL(hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
#define __AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } } while (0) |
|||
|
|||
#define __AZAC_TRACE_ASSERT(title, fileName, lineNumber, expr) __AZAC_TRACE_ERROR(title, fileName, lineNumber, __AZAC_EXPR_AS_STRING(expr) " = false") |
|||
#define __AZAC_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ...) __AZAC_TRACE_ERROR(title, fileName, lineNumber, __AZAC_EXPR_AS_STRING(expr) " = false; " __VA_ARGS__) |
|||
|
|||
#define __AZAC_DBG_ASSERT(title, fileName, lineNumber, expr) \ |
|||
do { \ |
|||
int fCond = !!(expr); \ |
|||
if (!fCond) { \ |
|||
__AZAC_TRACE_ASSERT(title, fileName, lineNumber, expr); \ |
|||
abort(); \ |
|||
} } while (0) |
|||
#define __AZAC_DBG_ASSERT_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \ |
|||
do { \ |
|||
int fCond = !!(expr); \ |
|||
if (!fCond) { \ |
|||
__AZAC_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ##__VA_ARGS__); \ |
|||
abort(); \ |
|||
} } while (0) |
|||
|
|||
#define __AZAC_DBG_VERIFY(title, fileName, lineNumber, expr) \ |
|||
do { \ |
|||
int fCond = !!(expr); \ |
|||
if (!fCond) { \ |
|||
__AZAC_TRACE_ASSERT(title, fileName, lineNumber, expr); \ |
|||
abort(); \ |
|||
} } while (0) |
|||
#define __AZAC_DBG_VERIFY_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \ |
|||
do { \ |
|||
int fCond = !!(expr); \ |
|||
if (!fCond) { \ |
|||
__AZAC_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ##__VA_ARGS__); \ |
|||
abort(); \ |
|||
} } while (0) |
|||
|
|||
#ifdef __cplusplus |
|||
|
|||
#include <memory> |
|||
#define __AZAC_TRACE_SCOPE(t1, fileName, lineNumber, t2, x, y) \ |
|||
__AZAC_TRACE_INFO(t1, fileName, lineNumber, "%s", x); \ |
|||
auto evaluateYInScopeInMacros##lineNumber = y; \ |
|||
auto leavingScopePrinterInMacros##lineNumber = [&evaluateYInScopeInMacros##lineNumber](int*) -> void { \ |
|||
__AZAC_TRACE_INFO(t2, fileName, lineNumber, "%s", evaluateYInScopeInMacros##lineNumber); \ |
|||
}; \ |
|||
std::unique_ptr<int, decltype(leavingScopePrinterInMacros##lineNumber)> onExit##lineNumber((int*)1, leavingScopePrinterInMacros##lineNumber) |
|||
|
|||
#ifndef __AZAC_THROW_HR_IMPL |
|||
#define __AZAC_THROW_HR_IMPL(hr) __azac_rethrow(hr) |
|||
#endif |
|||
#ifndef __AZAC_THROW_HR |
|||
#define __AZAC_THROW_HR(hr) __AZAC_THROW_HR_IMPL(hr) |
|||
#endif |
|||
|
|||
#ifndef __AZAC_LOG_HR_IMPL |
|||
#define __AZAC_LOG_HR_IMPL(hr) __azac_log_only(hr) |
|||
#endif |
|||
#ifndef __AZAC_LOG_HR |
|||
#define __AZAC_LOG_HR(hr) __AZAC_LOG_HR_IMPL(hr) |
|||
#endif |
|||
|
|||
#define __AZAC_T_LOG_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
__AZAC_LOG_HR(x); \ |
|||
} } while (0) |
|||
#define __AZAC_T_THROW_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } while (0) |
|||
#define __AZAC_T_THROW_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } } while (0) |
|||
#define __AZAC_T_THROW_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
AZACHR x = hr; \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } while (0) |
|||
#define __AZAC_T_THROW_HR(title, fileName, lineNumber, hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x); \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} while (0) |
|||
|
|||
|
|||
#define __AZAC_LOG_ON_FAIL(hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_LOG_HR(x); \ |
|||
} } while (0) |
|||
#define __AZAC_THROW_ON_FAIL(hr) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } while (0) |
|||
#define __AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
do { \ |
|||
AZACHR x = hr; \ |
|||
if (x != hrNot) { \ |
|||
if (AZAC_FAILED(x)) { \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } } while (0) |
|||
#define __AZAC_THROW_HR_IF(hr, cond) \ |
|||
do { \ |
|||
int fCond = !!(cond); \ |
|||
if (fCond) { \ |
|||
AZACHR x = hr; \ |
|||
__AZAC_THROW_HR(x); \ |
|||
} } while (0) |
|||
|
|||
#endif // __cplusplus
|
|||
|
|||
|
|||
|
|||
//-------------------------------------------------------
|
|||
// AZAC_ macro definitions
|
|||
//-------------------------------------------------------
|
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_VERBOSE |
|||
#define AZAC_TRACE_VERBOSE(msg, ...) __AZAC_TRACE_VERBOSE("AZAC_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_TRACE_VERBOSE_IF(cond, msg, ...) __AZAC_TRACE_VERBOSE_IF(cond, "AZAC_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_TRACE_VERBOSE(...) |
|||
#define AZAC_TRACE_VERBOSE_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_VERBOSE |
|||
#define AZAC_DBG_TRACE_VERBOSE(msg, ...) __AZAC_TRACE_VERBOSE("AZAC_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_DBG_TRACE_VERBOSE_IF(cond, msg, ...) __AZAC_TRACE_VERBOSE_IF(cond, "AZAC_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_TRACE_VERBOSE(...) |
|||
#define AZAC_DBG_TRACE_VERBOSE_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_INFO |
|||
#define AZAC_TRACE_INFO(msg, ...) __AZAC_TRACE_INFO("AZAC_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_TRACE_INFO_IF(cond, msg, ...) __AZAC_TRACE_INFO_IF(cond, "AZAC_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_TRACE_INFO(...) |
|||
#define AZAC_TRACE_INFO_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_INFO |
|||
#define AZAC_DBG_TRACE_INFO(msg, ...) __AZAC_TRACE_INFO("AZAC_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_DBG_TRACE_INFO_IF(cond, msg, ...) __AZAC_TRACE_INFO_IF(cond, "AZAC_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_TRACE_INFO(...) |
|||
#define AZAC_DBG_TRACE_INFO_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_WARNING |
|||
#define AZAC_TRACE_WARNING(msg, ...) __AZAC_TRACE_WARNING("AZAC_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_TRACE_WARNING_IF(cond, msg, ...) __AZAC_TRACE_WARNING_IF(cond, "AZAC_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_TRACE_WARNING(...) |
|||
#define AZAC_TRACE_WARNING_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_WARNING |
|||
#define AZAC_DBG_TRACE_WARNING(msg, ...) __AZAC_TRACE_WARNING("AZAC_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_DBG_TRACE_WARNING_IF(cond, msg, ...) __AZAC_TRACE_WARNING_IF(cond, "AZAC_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_TRACE_WARNING(...) |
|||
#define AZAC_DBG_TRACE_WARNING_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_ERROR |
|||
#define AZAC_TRACE_ERROR(msg, ...) __AZAC_TRACE_ERROR("AZAC_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_TRACE_ERROR_IF(cond, msg, ...) __AZAC_TRACE_ERROR_IF(cond, "AZAC_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_TRACE_ERROR(...) |
|||
#define AZAC_TRACE_ERROR_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_ERROR |
|||
#define AZAC_DBG_TRACE_ERROR(msg, ...) __AZAC_TRACE_ERROR("AZAC_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define AZAC_DBG_TRACE_ERROR_IF(cond, msg, ...) __AZAC_TRACE_ERROR_IF(cond, "AZAC_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_TRACE_ERROR(...) |
|||
#define AZAC_DBG_TRACE_ERROR_IF(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_FUNCTION |
|||
#define AZAC_TRACE_FUNCTION(...) __AZAC_TRACE_VERBOSE("AZAC_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__) |
|||
#else |
|||
#define AZAC_TRACE_FUNCTION(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_FUNCTION |
|||
#define AZAC_DBG_TRACE_FUNCTION(...) __AZAC_TRACE_VERBOSE("AZAC_DBG_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__) |
|||
#else |
|||
#define AZAC_DBG_TRACE_FUNCTION(...) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_REPORT_ON_FAIL |
|||
#define AZAC_REPORT_ON_FAIL(hr) __AZAC_REPORT_ON_FAIL("AZAC_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_REPORT_ON_FAIL_IFNOT(hr, hrNot) __AZAC_REPORT_ON_FAIL_IFNOT("AZAC_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define AZAC_REPORT_ON_FAIL(hr) UNUSED(hr) |
|||
#define AZAC_REPORT_ON_FAIL_IFNOT(hr, hrNot) UNUSED(hr); UNUSED(hrNot) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_RETURN_ON_FAIL |
|||
#define AZAC_RETURN_HR(hr) __AZAC_T_RETURN_HR("AZAC_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_RETURN_HR_IF(hr, cond) __AZAC_T_RETURN_HR_IF("AZAC_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, cond) |
|||
#define AZAC_RETURN_ON_FAIL(hr) __AZAC_T_RETURN_ON_FAIL("AZAC_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_T_RETURN_ON_FAIL_IF_NOT("AZAC_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define AZAC_RETURN_HR(hr) __AZAC_RETURN_HR(hr) |
|||
#define AZAC_RETURN_HR_IF(hr, cond) __AZAC_RETURN_HR_IF(hr, cond) |
|||
#define AZAC_RETURN_ON_FAIL(hr) __AZAC_RETURN_ON_FAIL(hr) |
|||
#define AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#endif |
|||
|
|||
#define AZAC_IFTRUE_RETURN_HR(cond, hr) AZAC_RETURN_HR_IF(hr, cond) |
|||
#define AZAC_IFFALSE_RETURN_HR(cond, hr) AZAC_RETURN_HR_IF(hr, !(cond)) |
|||
#define AZAC_IFFAILED_RETURN_HR(hr) AZAC_RETURN_ON_FAIL(hr) |
|||
#define AZAC_IFFAILED_RETURN_HR_IFNOT(hr, hrNot) AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_EXITFN_ON_FAIL |
|||
#define AZAC_EXITFN_HR(hr) __AZAC_T_EXITFN_HR("AZAC_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_EXITFN_HR_IF(hr, cond) __AZAC_T_EXITFN_HR_IF("AZAC_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, cond) |
|||
#define AZAC_EXITFN_ON_FAIL(hr) __AZAC_T_EXITFN_ON_FAIL("AZAC_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_EXITFN_ON_FAIL_IF_NOT("AZAC_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define AZAC_EXITFN_HR(hr) __AZAC_EXITFN_HR(hr) |
|||
#define AZAC_EXITFN_HR_IF(hr, cond) __AZAC_EXITFN_HR_IF(hr, cond) |
|||
#define AZAC_EXITFN_ON_FAIL(hr) __AZAC_EXITFN_ON_FAIL(hr) |
|||
#define AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#endif |
|||
|
|||
#define AZAC_IFTRUE_EXITFN_WHR(cond, hr) AZAC_EXITFN_HR_IF(hr, cond) |
|||
#define AZAC_IFFALSE_EXITFN_WHR(cond, hr) AZAC_EXITFN_HR_IF(hr, !(cond)) |
|||
#define AZAC_IFFAILED_EXITFN_WHR(hr) AZAC_EXITFN_ON_FAIL(hr) |
|||
#define AZAC_IFFAILED_EXITFN_WHR_IFNOT(hr, hrNot) AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#define AZAC_IFTRUE_EXITFN_CLEANUP(cond, expr) \ |
|||
do { \ |
|||
int fCondT = !!(cond); \ |
|||
if (fCondT) { \ |
|||
expr; \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
|
|||
#define AZAC_IFFALSE_EXITFN_CLEANUP(cond, expr) \ |
|||
do { \ |
|||
int fCondF = !!(cond); \ |
|||
if (!fCondF) { \ |
|||
expr; \ |
|||
goto AZAC_EXITFN_CLEANUP; \ |
|||
} } while (0) |
|||
|
|||
#if defined(AZAC_CONFIG_DBG_TRACE_ASSERT) && (defined(DEBUG) || defined(_DEBUG)) |
|||
#define AZAC_DBG_ASSERT(expr) __AZAC_DBG_ASSERT("AZAC_ASSERT: ", __FILE__, __LINE__, expr) |
|||
#define AZAC_DBG_ASSERT_WITH_MESSAGE(expr, ...) __AZAC_DBG_ASSERT_WITH_MESSAGE("AZAC_ASSERT: ", __FILE__, __LINE__, expr, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_ASSERT(expr) |
|||
#define AZAC_DBG_ASSERT_WITH_MESSAGE(expr, ...) |
|||
#endif |
|||
|
|||
#if defined(AZAC_CONFIG_DBG_TRACE_VERIFY) && (defined(DEBUG) || defined(_DEBUG)) |
|||
#define AZAC_DBG_VERIFY(expr) __AZAC_DBG_VERIFY("AZAC_VERIFY: ", __FILE__, __LINE__, expr) |
|||
#define AZAC_DBG_VERIFY_WITH_MESSAGE(expr, ...) __AZAC_DBG_VERIFY_WITH_MESSAGE("AZAC_VERIFY: ", __FILE__, __LINE__, expr, ##__VA_ARGS__) |
|||
#else |
|||
#define AZAC_DBG_VERIFY(expr) (expr) |
|||
#define AZAC_DBG_VERIFY_WITH_MESSAGE(expr, ...) (expr) |
|||
#endif |
|||
|
|||
#define AZAC_IFTRUE(cond, expr) \ |
|||
do { \ |
|||
int fCondT = !!(cond); \ |
|||
if (fCondT) { \ |
|||
expr; \ |
|||
} } while (0) |
|||
|
|||
#define AZAC_IFFALSE(cond, expr) \ |
|||
do { \ |
|||
int fCondF = !!(cond); \ |
|||
if (!fCondF) { \ |
|||
expr; \ |
|||
} } while (0) |
|||
|
|||
// handle circular dependency
|
|||
#ifndef AZAC_SUPPRESS_COMMON_INCLUDE_FROM_DEBUG |
|||
#define AZAC_SUPPRESS_DEBUG_INCLUDE_FROM_COMMON |
|||
#include <azac_api_c_common.h> |
|||
#undef AZAC_SUPPRESS_DEBUG_INCLUDE_FROM_COMMON |
|||
#endif |
|||
|
|||
#ifdef __cplusplus |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_SCOPE |
|||
#define AZAC_TRACE_SCOPE(x, y) __AZAC_TRACE_SCOPE("AZAC_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "AZAC_TRACE_SCOPE_EXIT: ", x, y) |
|||
#else |
|||
#define AZAC_TRACE_SCOPE(x, y) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_DBG_TRACE_SCOPE |
|||
#define AZAC_DBG_TRACE_SCOPE(x, y) __AZAC_TRACE_SCOPE("AZAC_DBG_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "AZAC_DBG_TRACE_SCOPE_EXIT: ", x, y) |
|||
#else |
|||
#define AZAC_DBG_TRACE_SCOPE(x, y) |
|||
#endif |
|||
|
|||
#ifdef AZAC_CONFIG_TRACE_THROW_ON_FAIL |
|||
#define AZAC_THROW_ON_FAIL(hr) __AZAC_T_THROW_ON_FAIL("AZAC_THROW_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_T_THROW_ON_FAIL_IF_NOT("AZAC_THROW_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#define AZAC_LOG_ON_FAIL(hr) __AZAC_T_LOG_ON_FAIL("AZAC_LOG_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define AZAC_THROW_HR_IF(hr, cond) __AZAC_T_THROW_HR_IF("AZAC_THROW_HR_IF: ", __FILE__, __LINE__, hr, cond) |
|||
#define AZAC_THROW_HR(hr) __AZAC_T_THROW_HR("AZAC_THROW_HR: ", __FILE__, __LINE__, hr) |
|||
#else |
|||
#define AZAC_THROW_ON_FAIL(hr) __AZAC_THROW_ON_FAIL(hr) |
|||
#define AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) __AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#define AZAC_LOG_ON_FAIL(hr) __AZAC_LOG_ON_FAIL(hr) |
|||
#define AZAC_THROW_HR_IF(hr, cond) __AZAC_THROW_HR_IF(hr, cond) |
|||
#define AZAC_THROW_HR(hr) __AZAC_THROW_HR(hr) |
|||
#endif |
|||
|
|||
#define AZAC_IFTRUE_THROW_HR(cond, hr) AZAC_THROW_HR_IF(hr, cond) |
|||
#define AZAC_IFFALSE_THROW_HR(cond, hr) AZAC_THROW_HR_IF(hr, !(cond)) |
|||
#define AZAC_IFFAILED_THROW_HR(hr) AZAC_THROW_ON_FAIL(hr) |
|||
#define AZAC_IFFAILED_THROW_HR_IFNOT(hr, hrNot) AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#include <azac_api_c_error.h> |
|||
#include <azac_api_c_diagnostics.h> |
|||
#include <stdexcept> |
|||
#include <string> |
|||
|
|||
inline void __azac_handle_native_ex(AZACHR hr, bool throwException) |
|||
{ |
|||
AZAC_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
|
|||
auto handle = reinterpret_cast<AZAC_HANDLE>(hr); |
|||
auto error = error_get_error_code(handle); |
|||
if (error == AZAC_ERR_NONE) |
|||
{ |
|||
if (throwException) |
|||
{ |
|||
throw hr; |
|||
} |
|||
else |
|||
{ |
|||
// do nothing. This is already logged by the macros that call this function
|
|||
return; |
|||
} |
|||
} |
|||
|
|||
std::string errorMsg; |
|||
try |
|||
{ |
|||
auto callstack = error_get_call_stack(handle); |
|||
auto what = error_get_message(handle); |
|||
|
|||
if (what) |
|||
{ |
|||
errorMsg += what; |
|||
} |
|||
else |
|||
{ |
|||
errorMsg += "Exception with error code: "; |
|||
errorMsg += std::to_string(error); |
|||
} |
|||
|
|||
if (callstack) |
|||
{ |
|||
errorMsg += callstack; |
|||
} |
|||
} |
|||
catch (...) |
|||
{ |
|||
error_release(handle); |
|||
throw hr; |
|||
} |
|||
|
|||
error_release(handle); |
|||
if (throwException) |
|||
{ |
|||
throw std::runtime_error(errorMsg); |
|||
} |
|||
else |
|||
{ |
|||
AZAC_TRACE_ERROR("Error details: %s", errorMsg.c_str()); |
|||
} |
|||
} |
|||
|
|||
inline void __azac_log_only(AZACHR hr) |
|||
{ |
|||
__azac_handle_native_ex(hr, false); |
|||
} |
|||
|
|||
inline void __azac_rethrow(AZACHR hr) |
|||
{ |
|||
__azac_handle_native_ex(hr, true); |
|||
} |
|||
|
|||
#else // __cplusplus
|
|||
|
|||
#define AZAC_TRACE_SCOPE(x, y) static_assert(false) |
|||
#define AZAC_DBG_TRACE_SCOPE(x, y) static_assert(false) |
|||
#define AZAC_LOG_ON_FAIL(hr) static_assert(false) |
|||
#define AZAC_THROW_ON_FAIL(hr) static_assert(false) |
|||
#define AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) static_assert(false) |
|||
#define AZAC_THROW_HR_IF(hr, cond) static_assert(false) |
|||
#define AZAC_THROW_HR(hr) static_assert(false) |
|||
#define AZAC_IFTRUE_THROW_HR(cond, hr) static_assert(false) |
|||
#define AZAC_IFFALSE_THROW_HR(cond, hr) static_assert(false) |
|||
#define AZAC_IFFAILED_THROW_HR(hr) static_assert(false) |
|||
#define AZAC_IFFAILED_THROW_HR_IFNOT(hr, hrNot) static_assert(false) |
|||
|
|||
#endif // __cplusplus
|
|||
|
|||
//---------------------------------------------------------------------------
|
|||
|
|||
#ifdef __AZAC_DEBUG_H_EXAMPLES_IN_MAIN |
|||
|
|||
void main() |
|||
{ |
|||
int x = 4; |
|||
printf("%s = %d\n", __AZAC_EXPR_AS_STRING(x + 3), x + 3); |
|||
|
|||
AZAC_TRACE_INFO("hello there"); |
|||
AZAC_TRACE_ERROR("hello there"); |
|||
AZAC_TRACE_WARNING("hello there"); |
|||
AZAC_TRACE_VERBOSE("hello there"); |
|||
|
|||
AZAC_TRACE_INFO("hello there %d", 5); |
|||
AZAC_TRACE_ERROR("hello there %d", 5); |
|||
AZAC_TRACE_WARNING("hello there %d", 5); |
|||
AZAC_TRACE_VERBOSE("hello there %d", 5); |
|||
|
|||
AZAC_TRACE_INFO_IF(false, "hello there false"); |
|||
AZAC_TRACE_ERROR_IF(false, "hello there false"); |
|||
AZAC_TRACE_WARNING_IF(false, "hello there false"); |
|||
AZAC_TRACE_VERBOSE_IF(false, "hello there false"); |
|||
|
|||
AZAC_TRACE_INFO_IF(false, "hello there false %d", 5); |
|||
AZAC_TRACE_ERROR_IF(false, "hello there false %d", 5); |
|||
AZAC_TRACE_WARNING_IF(false, "hello there false %d", 5); |
|||
AZAC_TRACE_VERBOSE_IF(false, "hello there false %d", 5); |
|||
|
|||
AZAC_TRACE_INFO_IF(true, "hello there true"); |
|||
AZAC_TRACE_ERROR_IF(true, "hello there true"); |
|||
AZAC_TRACE_WARNING_IF(true, "hello there true"); |
|||
AZAC_TRACE_VERBOSE_IF(true, "hello there true"); |
|||
|
|||
AZAC_TRACE_INFO_IF(true, "hello there true %d", 5); |
|||
AZAC_TRACE_ERROR_IF(true, "hello there true %d", 5); |
|||
AZAC_TRACE_WARNING_IF(true, "hello there true %d", 5); |
|||
AZAC_TRACE_VERBOSE_IF(true, "hello there true %d", 5); |
|||
|
|||
AZAC_DBG_TRACE_INFO("hello there"); |
|||
AZAC_DBG_TRACE_ERROR("hello there"); |
|||
AZAC_DBG_TRACE_WARNING("hello there"); |
|||
AZAC_DBG_TRACE_VERBOSE("hello there"); |
|||
|
|||
AZAC_DBG_TRACE_INFO("hello there %d", 5); |
|||
AZAC_DBG_TRACE_ERROR("hello there %d", 5); |
|||
AZAC_DBG_TRACE_WARNING("hello there %d", 5); |
|||
AZAC_DBG_TRACE_VERBOSE("hello there %d", 5); |
|||
|
|||
AZAC_DBG_TRACE_INFO_IF(false, "hello there false"); |
|||
AZAC_DBG_TRACE_ERROR_IF(false, "hello there false"); |
|||
AZAC_DBG_TRACE_WARNING_IF(false, "hello there false"); |
|||
AZAC_DBG_TRACE_VERBOSE_IF(false, "hello there false"); |
|||
|
|||
AZAC_DBG_TRACE_INFO_IF(false, "hello there false %d", 5); |
|||
AZAC_DBG_TRACE_ERROR_IF(false, "hello there false %d", 5); |
|||
AZAC_DBG_TRACE_WARNING_IF(false, "hello there false %d", 5); |
|||
AZAC_DBG_TRACE_VERBOSE_IF(false, "hello there false %d", 5); |
|||
|
|||
AZAC_DBG_TRACE_INFO_IF(true, "hello there true"); |
|||
AZAC_DBG_TRACE_ERROR_IF(true, "hello there true"); |
|||
AZAC_DBG_TRACE_WARNING_IF(true, "hello there true"); |
|||
AZAC_DBG_TRACE_VERBOSE_IF(true, "hello there true"); |
|||
|
|||
AZAC_DBG_TRACE_INFO_IF(true, "hello there true %d", 5); |
|||
AZAC_DBG_TRACE_ERROR_IF(true, "hello there true %d", 5); |
|||
AZAC_DBG_TRACE_WARNING_IF(true, "hello there true %d", 5); |
|||
AZAC_DBG_TRACE_VERBOSE_IF(true, "hello there true %d", 5); |
|||
|
|||
AZAC_TRACE_SCOPE("A", "B"); |
|||
|
|||
AZAC_TRACE_FUNCTION(); |
|||
AZAC_DBG_TRACE_FUNCTION(); |
|||
|
|||
AZAC_DBG_ASSERT(false); |
|||
AZAC_DBG_ASSERT(true); |
|||
|
|||
AZAC_DBG_ASSERT_WITH_MESSAGE(false, "HEY!"); |
|||
AZAC_DBG_ASSERT_WITH_MESSAGE(true, "HEY!!"); |
|||
|
|||
AZAC_DBG_VERIFY(false); |
|||
AZAC_DBG_VERIFY(true); |
|||
|
|||
AZAC_DBG_VERIFY_WITH_MESSAGE(false, "HEY!"); |
|||
AZAC_DBG_VERIFY_WITH_MESSAGE(true, "HEY!!"); |
|||
|
|||
AZACHR hr1 { 0x80001111 }; |
|||
AZACHR hr2 { 0x00001111 }; |
|||
|
|||
AZAC_TRACE_VERBOSE("Testing out AZAC_REPORT_ON_FAIL, should see two failures..."); |
|||
AZAC_REPORT_ON_FAIL(hr1); |
|||
AZAC_REPORT_ON_FAIL_IFNOT(hr1, 0x80001000); |
|||
AZAC_TRACE_VERBOSE("Testing out AZAC_REPORT_ON_FAIL, should see two failures... Done!"); |
|||
|
|||
AZAC_TRACE_VERBOSE("Testing out AZAC_REPORT_ON_FAIL, should see zero failures..."); |
|||
AZAC_REPORT_ON_FAIL(hr2); |
|||
AZAC_REPORT_ON_FAIL_IFNOT(hr1, 0x80001111); |
|||
AZAC_REPORT_ON_FAIL_IFNOT(hr2, 0x80001111); |
|||
AZAC_REPORT_ON_FAIL_IFNOT(hr2, 0x80001000); |
|||
AZAC_TRACE_VERBOSE("Testing out AZAC_REPORT_ON_FAIL, should see zero failures... Done!"); |
|||
} |
|||
|
|||
#endif |
|||
@ -0,0 +1,455 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#include <stdint.h> |
|||
|
|||
/// <summary>
|
|||
/// Type definition for Azure AI Core result codes.
|
|||
/// </summary>
|
|||
typedef uintptr_t AZACHR; |
|||
|
|||
/// <summary>
|
|||
/// Default result code indicating no error.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NONE 0 |
|||
|
|||
/// <summary>
|
|||
/// Declare and initialize result code variable.
|
|||
/// </summary>
|
|||
#define AZAC_INIT_HR(hr) AZACHR hr = AZAC_ERR_NONE; \ |
|||
(void)(hr) |
|||
|
|||
/// <summary>
|
|||
/// Check if result code indicates success.
|
|||
/// </summary>
|
|||
#define AZAC_SUCCEEDED(x) ((x) == AZAC_ERR_NONE) |
|||
|
|||
/// <summary>
|
|||
/// Check if result code indicates error.
|
|||
/// </summary>
|
|||
#define AZAC_FAILED(x) (!AZAC_SUCCEEDED(x)) |
|||
|
|||
/// <summary>
|
|||
/// Base macros for all error codes.
|
|||
/// </summary>
|
|||
#define __AZAC_ERRCODE_FAILED(x) (x) |
|||
|
|||
/// <summary>
|
|||
/// The function is not implemented.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NOT_IMPL __AZAC_ERRCODE_FAILED(0xfff) |
|||
|
|||
/// <summary>
|
|||
/// The object has not been properly initialized.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNINITIALIZED __AZAC_ERRCODE_FAILED(0x001) |
|||
|
|||
/// <summary>
|
|||
/// The object has already been initialized.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_ALREADY_INITIALIZED __AZAC_ERRCODE_FAILED(0x002) |
|||
|
|||
/// <summary>
|
|||
/// An unhandled exception was detected.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNHANDLED_EXCEPTION __AZAC_ERRCODE_FAILED(0x003) |
|||
|
|||
/// <summary>
|
|||
/// The object or property was not found.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NOT_FOUND __AZAC_ERRCODE_FAILED(0x004) |
|||
|
|||
/// <summary>
|
|||
/// One or more arguments are not valid.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_ARG __AZAC_ERRCODE_FAILED(0x005) |
|||
|
|||
/// <summary>
|
|||
/// The specified timeout value has elapsed.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_TIMEOUT __AZAC_ERRCODE_FAILED(0x006) |
|||
|
|||
/// <summary>
|
|||
/// The asynchronous operation is already in progress.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_ALREADY_IN_PROGRESS __AZAC_ERRCODE_FAILED(0x007) |
|||
|
|||
/// <summary>
|
|||
/// The attempt to open the file failed.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_FILE_OPEN_FAILED __AZAC_ERRCODE_FAILED(0x008) |
|||
|
|||
/// <summary>
|
|||
/// The end of the file was reached unexpectedly.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_EOF __AZAC_ERRCODE_FAILED(0x009) |
|||
|
|||
/// <summary>
|
|||
/// Invalid audio header encountered.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_HEADER __AZAC_ERRCODE_FAILED(0x00a) |
|||
|
|||
/// <summary>
|
|||
/// The requested operation cannot be performed while audio is pumping
|
|||
/// </summary>
|
|||
#define AZAC_ERR_AUDIO_IS_PUMPING __AZAC_ERRCODE_FAILED(0x00b) |
|||
|
|||
/// <summary>
|
|||
/// Unsupported audio format.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNSUPPORTED_FORMAT __AZAC_ERRCODE_FAILED(0x00c) |
|||
|
|||
/// <summary>
|
|||
/// Operation aborted.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_ABORT __AZAC_ERRCODE_FAILED(0x00d) |
|||
|
|||
/// <summary>
|
|||
/// Microphone is not available.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MIC_NOT_AVAILABLE __AZAC_ERRCODE_FAILED(0x00e) |
|||
|
|||
/// <summary>
|
|||
/// An invalid state was encountered.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_STATE __AZAC_ERRCODE_FAILED(0x00f) |
|||
|
|||
/// <summary>
|
|||
/// Attempting to create a UUID failed.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UUID_CREATE_FAILED __AZAC_ERRCODE_FAILED(0x010) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected session state transition was encountered when setting the session audio format.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Valid transitions are:
|
|||
/// * WaitForPumpSetFormatStart --> ProcessingAudio (at the beginning of stream)
|
|||
/// * StoppingPump --> WaitForAdapterCompletedSetFormatStop (at the end of stream)
|
|||
/// * ProcessingAudio --> WaitForAdapterCompletedSetFormatStop (when the stream runs out of data)
|
|||
/// All other state transitions are invalid.
|
|||
/// </remarks>
|
|||
#define AZAC_ERR_SETFORMAT_UNEXPECTED_STATE_TRANSITION __AZAC_ERRCODE_FAILED(0x011) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected session state was encountered in while processing audio.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Valid states to encounter are:
|
|||
/// * ProcessingAudio: We're allowed to process audio while in this state.
|
|||
/// * StoppingPump: We're allowed to be called to process audio, but we'll ignore the data passed in while we're attempting to stop the pump.
|
|||
/// All other states are invalid while processing audio.
|
|||
/// </remarks>
|
|||
#define AZAC_ERR_PROCESS_AUDIO_INVALID_STATE __AZAC_ERRCODE_FAILED(0x012) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected state transition was encountered while attempting to start recognizing.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A valid transition is:
|
|||
/// * Idle --> WaitForPumpSetFormatStart
|
|||
/// All other state transitions are invalid when attempting to start recognizing
|
|||
/// </remarks>
|
|||
#define AZAC_ERR_START_RECOGNIZING_INVALID_STATE_TRANSITION __AZAC_ERRCODE_FAILED(0x013) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to create an internal object.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_CREATE_OBJECT_FAILURE __AZAC_ERRCODE_FAILED(0x014) |
|||
|
|||
/// <summary>
|
|||
/// An error in the audio-capturing system.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MIC_ERROR __AZAC_ERRCODE_FAILED(0x015) |
|||
|
|||
/// <summary>
|
|||
/// The requested operation cannot be performed; there is no audio input.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NO_AUDIO_INPUT __AZAC_ERRCODE_FAILED(0x016) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the USP site.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_USP_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x017) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the LU site.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_LU_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x018) |
|||
|
|||
/// <summary>
|
|||
/// The buffer is too small.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_BUFFER_TOO_SMALL __AZAC_ERRCODE_FAILED(0x019) |
|||
|
|||
/// <summary>
|
|||
/// A method failed to allocate memory.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_OUT_OF_MEMORY __AZAC_ERRCODE_FAILED(0x01A) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected runtime error occurred.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_RUNTIME_ERROR __AZAC_ERRCODE_FAILED(0x01B) |
|||
|
|||
/// <summary>
|
|||
/// The url specified is invalid.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_URL __AZAC_ERRCODE_FAILED(0x01C) |
|||
|
|||
/// <summary>
|
|||
/// The region specified is invalid or missing.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_REGION __AZAC_ERRCODE_FAILED(0x01D) |
|||
|
|||
/// <summary>
|
|||
/// Switch between single shot and continuous recognition is not supported.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_SWITCH_MODE_NOT_ALLOWED __AZAC_ERRCODE_FAILED(0x01E) |
|||
|
|||
/// <summary>
|
|||
/// Changing connection status is not supported in the current recognition state.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_CHANGE_CONNECTION_STATUS_NOT_ALLOWED __AZAC_ERRCODE_FAILED(0x01F) |
|||
|
|||
/// <summary>
|
|||
/// Explicit connection management is not supported by the specified recognizer.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_EXPLICIT_CONNECTION_NOT_SUPPORTED_BY_RECOGNIZER __AZAC_ERRCODE_FAILED(0x020) |
|||
|
|||
/// <summary>
|
|||
/// The handle is invalid.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_HANDLE __AZAC_ERRCODE_FAILED(0x021) |
|||
|
|||
/// <summary>
|
|||
/// The recognizer is invalid.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_RECOGNIZER __AZAC_ERRCODE_FAILED(0x022) |
|||
|
|||
/// <summary>
|
|||
/// The value is out of range.
|
|||
/// Added in version 1.3.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_OUT_OF_RANGE __AZAC_ERRCODE_FAILED(0x023) |
|||
|
|||
/// <summary>
|
|||
/// Extension library not found.
|
|||
/// Added in version 1.3.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_EXTENSION_LIBRARY_NOT_FOUND __AZAC_ERRCODE_FAILED(0x024) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the TTS engine site.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_TTS_ENGINE_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x025) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the audio output stream.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_AUDIO_OUTPUT_FAILURE __AZAC_ERRCODE_FAILED(0x026) |
|||
|
|||
/// <summary>
|
|||
/// Gstreamer internal error.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_GSTREAMER_INTERNAL_ERROR __AZAC_ERRCODE_FAILED(0x027) |
|||
|
|||
/// <summary>
|
|||
/// Compressed container format not supported.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_CONTAINER_FORMAT_NOT_SUPPORTED_ERROR __AZAC_ERRCODE_FAILED(0x028) |
|||
|
|||
/// <summary>
|
|||
/// Codec extension or gstreamer not found.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_GSTREAMER_NOT_FOUND_ERROR __AZAC_ERRCODE_FAILED(0x029) |
|||
|
|||
/// <summary>
|
|||
/// The language specified is missing.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_LANGUAGE __AZAC_ERRCODE_FAILED(0x02A) |
|||
|
|||
/// <summary>
|
|||
/// The API is not applicable.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNSUPPORTED_API_ERROR __AZAC_ERRCODE_FAILED(0x02B) |
|||
|
|||
/// <summary>
|
|||
/// The ring buffer is unavailable.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_RINGBUFFER_DATA_UNAVAILABLE __AZAC_ERRCODE_FAILED(0x02C) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Conversation site.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_CONVERSATION_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x030) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Conversation site.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_CONVERSATION_TRANSLATOR_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x031) |
|||
|
|||
/// <summary>
|
|||
/// An asynchronous operation was canceled before it was executed.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_CANCELED __AZAC_ERRCODE_FAILED(0x032) |
|||
|
|||
/// <summary>
|
|||
/// Codec for compression could not be initialized.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_COMPRESS_AUDIO_CODEC_INITIFAILED __AZAC_ERRCODE_FAILED(0x033) |
|||
|
|||
/// <summary>
|
|||
/// Data not available.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_DATA_NOT_AVAILABLE __AZAC_ERRCODE_FAILED(0x034) |
|||
|
|||
/// <summary>
|
|||
/// Invalid result reason.
|
|||
/// Added in version 1.12.0
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_RESULT_REASON __AZAC_ERRCODE_FAILED(0x035) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the RNN-T site.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNEXPECTED_RNNT_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x036) |
|||
|
|||
/// <summary>
|
|||
/// Sending of a network message failed.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NETWORK_SEND_FAILED __AZAC_ERRCODE_FAILED(0x037) |
|||
|
|||
/// <summary>
|
|||
/// Audio extension library not found.
|
|||
/// Added in version 1.16.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_AUDIO_SYS_LIBRARY_NOT_FOUND __AZAC_ERRCODE_FAILED(0x038) |
|||
|
|||
/// <summary>
|
|||
/// An error in the audio-rendering system.
|
|||
/// Added in version 1.20.0
|
|||
/// </summary>
|
|||
#define AZAC_ERR_LOUDSPEAKER_ERROR __AZAC_ERRCODE_FAILED(0x039) |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Vision site.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_VISION_SITE_FAILURE __AZAC_ERRCODE_FAILED(0x050) |
|||
|
|||
/// <summary>
|
|||
/// Stream number provided was invalid in the current context.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_INVALID_STREAM __AZAC_ERRCODE_FAILED(0x060) |
|||
|
|||
/// <summary>
|
|||
/// Offset required is invalid in the current context.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_INVALID_OFFSET __AZAC_ERRCODE_FAILED(0x061) |
|||
|
|||
/// <summary>
|
|||
/// No more data is available in source.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_NO_MORE_DATA __AZAC_ERRCODE_FAILED(0x062) |
|||
|
|||
/// <summary>
|
|||
/// Source has not been started.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_NOT_STARTED __AZAC_ERRCODE_FAILED(0x063) |
|||
|
|||
/// <summary>
|
|||
/// Source has already been started.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_ALREADY_STARTED __AZAC_ERRCODE_FAILED(0x064) |
|||
|
|||
/// <summary>
|
|||
/// Media device creation failed.
|
|||
/// Added in version 1.18.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_DEVICE_CREATION_FAILED __AZAC_ERRCODE_FAILED(0x065) |
|||
|
|||
/// <summary>
|
|||
/// No devices of the selected category are available.
|
|||
/// Added in version 1.18.0.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_MEDIA_NO_DEVICE_AVAILABLE __AZAC_ERRCODE_FAILED(0x066) |
|||
|
|||
/// <summary>
|
|||
/// Enabled Voice Activity Detection while using keyword recognition is not allowed.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_VAD_COULD_NOT_USE_WITH_KEYWORD_RECOGNIZER __AZAC_ERRCODE_FAILED(0x067) |
|||
|
|||
/// <summary>
|
|||
/// The specified RecoEngineAdapter could not be created.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_COULD_NOT_CREATE_ENGINE_ADAPTER __AZAC_ERRCODE_FAILED(0x070) |
|||
|
|||
/// <summary>
|
|||
/// The input file has a size of 0 bytes.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INPUT_FILE_SIZE_IS_ZERO_BYTES __AZAC_ERRCODE_FAILED(0x072) |
|||
|
|||
/// <summary>
|
|||
/// Cannot open the input media file for reading. Does it exist?
|
|||
/// </summary>
|
|||
#define AZAC_ERR_FAILED_TO_OPEN_INPUT_FILE_FOR_READING __AZAC_ERRCODE_FAILED(0x073) |
|||
|
|||
/// <summary>
|
|||
/// Failed to read from the input media file.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_FAILED_TO_READ_FROM_INPUT_FILE __AZAC_ERRCODE_FAILED(0x074) |
|||
|
|||
/// <summary>
|
|||
/// Input media file is too large.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INPUT_FILE_TOO_LARGE __AZAC_ERRCODE_FAILED(0x075) |
|||
|
|||
/// <summary>
|
|||
/// The input URL is unsupported. It should start with `http://`, `https://` or `rtsp://`.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_UNSUPPORTED_URL_PROTOCOL __AZAC_ERRCODE_FAILED(0x076) |
|||
|
|||
/// <summary>
|
|||
/// The Nullable value is empty. Check HasValue() before getting the value.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_EMPTY_NULLABLE __AZAC_ERRCODE_FAILED(0x077) |
|||
|
|||
/// <summary>
|
|||
/// The given model version string is not in the expected format. The format
|
|||
/// is specified by the regular expression `^(latest|\d{4}-\d{2}-\d{2})(-preview)?$`.
|
|||
/// </summary>
|
|||
#define AZAC_ERR_INVALID_MODEL_VERSION_FORMAT __AZAC_ERRCODE_FAILED(0x078) |
|||
|
|||
/// <summary>
|
|||
/// Malformed network message
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NETWORK_MALFORMED __AZAC_ERRCODE_FAILED(0x090) |
|||
|
|||
/// <summary>
|
|||
/// Unexpected message received
|
|||
/// </summary>
|
|||
#define AZAC_ERR_NETWORK_PROTOCOL_VIOLATION __AZAC_ERRCODE_FAILED(0x091) |
|||
@ -0,0 +1,51 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c.h: Master include header for public C API declarations
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_error.h> |
|||
#include <speechapi_c_diagnostics.h> |
|||
#include <speechapi_c_property_bag.h> |
|||
#include <speechapi_c_intent_result.h> |
|||
#include <speechapi_c_intent_trigger.h> |
|||
#include <speechapi_c_intent_recognizer.h> |
|||
#include <speechapi_c_translation_result.h> |
|||
#include <speechapi_c_translation_recognizer.h> |
|||
#include <speechapi_c_pattern_matching_model.h> |
|||
#include <speechapi_c_language_understanding_model.h> |
|||
#include <speechapi_c_keyword_recognition_model.h> |
|||
#include <speechapi_c_audio_stream_format.h> |
|||
#include <speechapi_c_audio_stream.h> |
|||
#include <speechapi_c_audio_config.h> |
|||
#include <speechapi_c_audio_processing_options.h> |
|||
#include <speechapi_c_speech_config.h> |
|||
#include <speechapi_c_embedded_speech_config.h> |
|||
#include <speechapi_c_hybrid_speech_config.h> |
|||
#include <speechapi_c_speech_translation_config.h> |
|||
#include <speechapi_c_factory.h> |
|||
#include <speechapi_c_recognizer.h> |
|||
#include <speechapi_c_synthesis_request.h> |
|||
#include <speechapi_c_synthesizer.h> |
|||
#include <speechapi_c_result.h> |
|||
#include <speechapi_c_grammar.h> |
|||
#include <speechapi_c_session.h> |
|||
#include <speechapi_c_connection.h> |
|||
#include <speechapi_c_dialog_service_config.h> |
|||
#include <speechapi_c_dialog_service_connector.h> |
|||
#include <speechapi_c_conversation.h> |
|||
#include <speechapi_c_conversation_transcription_result.h> |
|||
#include <speechapi_c_meeting.h> |
|||
#include <speechapi_c_meeting_transcription_result.h> |
|||
#include <speechapi_c_user.h> |
|||
#include <speechapi_c_participant.h> |
|||
#include <speechapi_c_conversation_translator.h> |
|||
#include <speechapi_c_ext_audiocompression.h> |
|||
#include <speechapi_c_speaker_recognition.h> |
|||
#include <speechapi_c_pronunciation_assessment_config.h> |
|||
#include <speechapi_c_speech_recognition_model.h> |
|||
#include <speechapi_c_speech_translation_model.h> |
|||
@ -0,0 +1,27 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_audio_config.h: Public API declarations for audio configuration related C methods and types
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
|
|||
SPXAPI_(bool) audio_config_is_handle_valid(SPXAUDIOCONFIGHANDLE haudioConfig); |
|||
SPXAPI audio_config_create_audio_input_from_default_microphone(SPXAUDIOCONFIGHANDLE* haudioConfig); |
|||
SPXAPI audio_config_create_audio_input_from_a_microphone(SPXAUDIOCONFIGHANDLE* haudioConfig, const char* deviceName); |
|||
SPXAPI audio_config_create_audio_input_from_wav_file_name(SPXAUDIOCONFIGHANDLE* haudioConfig, const char* fileName); |
|||
SPXAPI audio_config_create_audio_input_from_stream(SPXAUDIOCONFIGHANDLE* haudioConfig, SPXAUDIOSTREAMHANDLE haudioStream); |
|||
SPXAPI audio_config_create_push_audio_input_stream(SPXAUDIOCONFIGHANDLE* haudioConfig, SPXAUDIOSTREAMHANDLE* haudioStream, SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
SPXAPI audio_config_create_pull_audio_input_stream(SPXAUDIOCONFIGHANDLE* haudioConfig, SPXAUDIOSTREAMHANDLE* haudioStream, SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
SPXAPI audio_config_create_audio_output_from_default_speaker(SPXAUDIOCONFIGHANDLE* haudioConfig); |
|||
SPXAPI audio_config_create_audio_output_from_a_speaker(SPXAUDIOCONFIGHANDLE* haudioConfig, const char* deviceName); |
|||
SPXAPI audio_config_create_audio_output_from_wav_file_name(SPXAUDIOCONFIGHANDLE* haudioConfig, const char* fileName); |
|||
SPXAPI audio_config_create_audio_output_from_stream(SPXAUDIOCONFIGHANDLE* haudioConfig, SPXAUDIOSTREAMHANDLE haudioStream); |
|||
SPXAPI audio_config_set_audio_processing_options(SPXAUDIOCONFIGHANDLE haudioConfig, SPXAUDIOPROCESSINGOPTIONSHANDLE haudioProcessingOptions); |
|||
SPXAPI audio_config_get_audio_processing_options(SPXAUDIOCONFIGHANDLE haudioConfig, SPXAUDIOPROCESSINGOPTIONSHANDLE* haudioProcessingOptions); |
|||
SPXAPI audio_config_release(SPXAUDIOCONFIGHANDLE haudioConfig); |
|||
SPXAPI audio_config_get_property_bag(SPXAUDIOCONFIGHANDLE haudioConfig, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
@ -0,0 +1,173 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_audio_processing_options.h: Public API declarations for audio processing options related C methods and types
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
/// <summary>
|
|||
/// Types of preset microphone array geometries.
|
|||
/// See [Microphone Array Recommendations](/azure/cognitive-services/speech-service/speech-devices-sdk-microphone) for more details.
|
|||
/// </summary>
|
|||
typedef enum |
|||
{ |
|||
/// <summary>
|
|||
/// Indicates that no geometry specified. Speech SDK will determine the microphone array geometry.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Uninitialized, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with one microphone in the center and six microphones evenly spaced
|
|||
/// in a circle with radius approximately equal to 42.5 mm.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Circular7, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with one microphone in the center and three microphones evenly spaced
|
|||
/// in a circle with radius approximately equal to 42.5 mm.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Circular4, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with four linearly placed microphones with 40 mm spacing between them.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Linear4, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with two linearly placed microphones with 40 mm spacing between them.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Linear2, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with a single microphone.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Mono, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with custom geometry.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_PresetMicrophoneArrayGeometry_Custom |
|||
} AudioProcessingOptions_PresetMicrophoneArrayGeometry; |
|||
|
|||
/// <summary>
|
|||
/// Types of microphone arrays.
|
|||
/// </summary>
|
|||
typedef enum |
|||
{ |
|||
AudioProcessingOptions_MicrophoneArrayType_Linear, |
|||
AudioProcessingOptions_MicrophoneArrayType_Planar |
|||
} AudioProcessingOptions_MicrophoneArrayType; |
|||
|
|||
/// <summary>
|
|||
/// Defines speaker reference channel position in input audio.
|
|||
/// </summary>
|
|||
typedef enum |
|||
{ |
|||
/// <summary>
|
|||
/// Indicates that the input audio does not have a speaker reference channel.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_SpeakerReferenceChannel_None, |
|||
/// <summary>
|
|||
/// Indicates that the last channel in the input audio corresponds to the speaker
|
|||
/// reference for echo cancellation.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_SpeakerReferenceChannel_LastChannel |
|||
} AudioProcessingOptions_SpeakerReferenceChannel; |
|||
|
|||
#pragma pack(push, 1) |
|||
|
|||
/// <summary>
|
|||
/// Represents coordinates of a microphone.
|
|||
/// </summary>
|
|||
typedef struct |
|||
{ |
|||
/// <summary>
|
|||
/// X-coordinate of the microphone in millimeters.
|
|||
/// </summary>
|
|||
int X; |
|||
/// <summary>
|
|||
/// Y-coordinate of the microphone in millimeters.
|
|||
/// </summary>
|
|||
int Y; |
|||
/// <summary>
|
|||
/// Z-coordinate of the microphone in millimeters.
|
|||
/// </summary>
|
|||
int Z; |
|||
} AudioProcessingOptions_MicrophoneCoordinates; |
|||
|
|||
/// <summary>
|
|||
/// Represents the geometry of a microphone array.
|
|||
/// </summary>
|
|||
typedef struct |
|||
{ |
|||
/// <summary>
|
|||
/// Type of microphone array.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_MicrophoneArrayType microphoneArrayType; |
|||
/// <summary>
|
|||
/// Start angle for beamforming in degrees.
|
|||
/// </summary>
|
|||
uint16_t beamformingStartAngle; |
|||
/// <summary>
|
|||
/// End angle for beamforming in degrees.
|
|||
/// </summary>
|
|||
uint16_t beamformingEndAngle; |
|||
/// <summary>
|
|||
/// Number of microphones in the microphone array.
|
|||
/// </summary>
|
|||
uint16_t numberOfMicrophones; |
|||
/// <summary>
|
|||
/// Coordinates of microphones in the microphone array.
|
|||
/// </summary>
|
|||
AudioProcessingOptions_MicrophoneCoordinates* microphoneCoordinates; |
|||
} AudioProcessingOptions_MicrophoneArrayGeometry; |
|||
|
|||
#pragma pack(pop) |
|||
|
|||
/// <summary>
|
|||
/// Disables built-in input audio processing.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_NONE = 0x00000000; |
|||
/// <summary>
|
|||
/// Enables default built-in input audio processing.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_ENABLE_DEFAULT = 0x00000001; |
|||
/// <summary>
|
|||
/// Disables dereverberation in the default audio processing pipeline.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_DISABLE_DEREVERBERATION = 0x00000002; |
|||
/// <summary>
|
|||
/// Disables noise suppression in the default audio processing pipeline.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_DISABLE_NOISE_SUPPRESSION = 0x00000004; |
|||
/// <summary>
|
|||
/// Disables automatic gain control in the default audio processing pipeline.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_DISABLE_GAIN_CONTROL = 0x00000008; |
|||
/// <summary>
|
|||
/// Disables echo cancellation in the default audio processing pipeline.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_DISABLE_ECHO_CANCELLATION = 0x00000010; |
|||
/// <summary>
|
|||
/// Enables voice activity detection in input audio processing.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_ENABLE_VOICE_ACTIVITY_DETECTION = 0x00000020; |
|||
/// <summary>
|
|||
/// Enables the new version (V2) of input audio processing with improved echo cancellation performance.
|
|||
/// This flag is mutually exclusive with AUDIO_INPUT_PROCESSING_ENABLE_DEFAULT flag.
|
|||
/// AUDIO_INPUT_PROCESSING_DISABLE_* flags do not affect this pipeline.
|
|||
/// This feature is currently in preview and only available for Windows x64 and ARM64 platform.
|
|||
/// </summary>
|
|||
const int AUDIO_INPUT_PROCESSING_ENABLE_V2 = 0x00000040; |
|||
|
|||
SPXAPI_(bool) audio_processing_options_is_handle_valid(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions); |
|||
SPXAPI audio_processing_options_create(SPXAUDIOPROCESSINGOPTIONSHANDLE* hoptions, int audioProcessingFlags); |
|||
SPXAPI audio_processing_options_create_from_preset_microphone_array_geometry(SPXAUDIOPROCESSINGOPTIONSHANDLE* hoptions, int audioProcessingFlags, AudioProcessingOptions_PresetMicrophoneArrayGeometry microphoneArrayGeometry, AudioProcessingOptions_SpeakerReferenceChannel speakerReferenceChannel); |
|||
SPXAPI audio_processing_options_create_from_microphone_array_geometry(SPXAUDIOPROCESSINGOPTIONSHANDLE* hoptions, int audioProcessingFlags, const AudioProcessingOptions_MicrophoneArrayGeometry* microphoneArrayGeometry, AudioProcessingOptions_SpeakerReferenceChannel speakerReferenceChannel); |
|||
SPXAPI audio_processing_options_get_audio_processing_flags(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, int* audioProcessingFlags); |
|||
SPXAPI audio_processing_options_get_preset_microphone_array_geometry(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, AudioProcessingOptions_PresetMicrophoneArrayGeometry* microphoneArrayGeometry); |
|||
SPXAPI audio_processing_options_get_microphone_array_type(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, AudioProcessingOptions_MicrophoneArrayType* microphoneArrayType); |
|||
SPXAPI audio_processing_options_get_beamforming_start_angle(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, uint16_t* startAngle); |
|||
SPXAPI audio_processing_options_get_beamforming_end_angle(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, uint16_t* endAngle); |
|||
SPXAPI audio_processing_options_get_microphone_count(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, uint16_t* microphoneCount); |
|||
SPXAPI audio_processing_options_get_microphone_coordinates(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, AudioProcessingOptions_MicrophoneCoordinates* microphoneCoordinates, uint16_t microphoneCount); |
|||
SPXAPI audio_processing_options_get_speaker_reference_channel(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, AudioProcessingOptions_SpeakerReferenceChannel* speakerReferenceChannel); |
|||
SPXAPI audio_processing_options_release(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions); |
|||
SPXAPI audio_processing_options_get_property_bag(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,67 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_audio_stream.h: Public API declarations for audio stream related C methods and types
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_result.h> |
|||
|
|||
typedef enum |
|||
{ |
|||
StreamStatus_Unknown = 0, |
|||
StreamStatus_NoData = 1, |
|||
StreamStatus_PartialData = 2, |
|||
StreamStatus_AllData = 3, |
|||
StreamStatus_Canceled = 4 |
|||
} Stream_Status; |
|||
|
|||
// audio_stream
|
|||
SPXAPI_(bool) audio_stream_is_handle_valid(SPXAUDIOSTREAMHANDLE haudioStream); |
|||
SPXAPI audio_stream_create_push_audio_input_stream(SPXAUDIOSTREAMHANDLE* haudioStream, SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
SPXAPI audio_stream_create_pull_audio_input_stream(SPXAUDIOSTREAMHANDLE* haudioStream, SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
SPXAPI audio_stream_create_pull_audio_output_stream(SPXAUDIOSTREAMHANDLE* haudioStream); |
|||
SPXAPI audio_stream_create_push_audio_output_stream(SPXAUDIOSTREAMHANDLE* haudioStream); |
|||
SPXAPI audio_stream_release(SPXAUDIOSTREAMHANDLE haudioStream); |
|||
|
|||
// pull_audio_input_stream
|
|||
typedef int (*CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK)(void* pvContext, uint8_t* buffer, uint32_t size); |
|||
typedef void (*CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK)(void* pvContext); |
|||
typedef void (*CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK)(void* pvContext, int id, uint8_t* value, uint32_t size); |
|||
SPXAPI pull_audio_input_stream_set_callbacks(SPXAUDIOSTREAMHANDLE haudioStream, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback); |
|||
SPXAPI pull_audio_input_stream_set_getproperty_callback(SPXAUDIOSTREAMHANDLE haudioStream, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback); |
|||
|
|||
// push_audio_input_stream
|
|||
SPXAPI push_audio_input_stream_write(SPXAUDIOSTREAMHANDLE haudioStream, uint8_t* buffer, uint32_t size); |
|||
SPXAPI push_audio_input_stream_close(SPXAUDIOSTREAMHANDLE haudioStream); |
|||
SPXAPI push_audio_input_stream_set_property_by_id(SPXAUDIOSTREAMHANDLE haudioStream, int id, const char* value); |
|||
SPXAPI push_audio_input_stream_set_property_by_name(SPXAUDIOSTREAMHANDLE haudioStream, const char* name, const char* value); |
|||
|
|||
// pull audio output stream
|
|||
SPXAPI pull_audio_output_stream_read(SPXAUDIOSTREAMHANDLE haudioStream, uint8_t* buffer, uint32_t bufferSize, uint32_t* pfilledSize); |
|||
|
|||
// push_audio_output_stream
|
|||
typedef int(*CUSTOM_AUDIO_PUSH_STREAM_WRITE_CALLBACK)(void* pvContext, uint8_t* buffer, uint32_t size); |
|||
typedef void(*CUSTOM_AUDIO_PUSH_STREAM_CLOSE_CALLBACK)(void* pvContext); |
|||
SPXAPI push_audio_output_stream_set_callbacks(SPXAUDIOSTREAMHANDLE haudioStream, void* pvContext, CUSTOM_AUDIO_PUSH_STREAM_WRITE_CALLBACK writeCallback, CUSTOM_AUDIO_PUSH_STREAM_CLOSE_CALLBACK closeCallback); |
|||
|
|||
// audio data stream
|
|||
SPXAPI_(bool) audio_data_stream_is_handle_valid(SPXAUDIOSTREAMHANDLE haudioStream); |
|||
SPXAPI audio_data_stream_create_from_file(SPXAUDIOSTREAMHANDLE* haudioStream, const char* fileName); |
|||
SPXAPI audio_data_stream_create_from_result(SPXAUDIOSTREAMHANDLE* haudioStream, SPXRESULTHANDLE hresult); |
|||
SPXAPI audio_data_stream_create_from_keyword_result(SPXAUDIOSTREAMHANDLE* audioStreamHandle, SPXRESULTHANDLE resultHandle); |
|||
SPXAPI audio_data_stream_get_status(SPXAUDIOSTREAMHANDLE haudioStream, Stream_Status* status); |
|||
SPXAPI audio_data_stream_get_reason_canceled(SPXAUDIOSTREAMHANDLE haudioStream, Result_CancellationReason* reason); |
|||
SPXAPI audio_data_stream_get_canceled_error_code(SPXAUDIOSTREAMHANDLE haudioStream, Result_CancellationErrorCode* errorCode); |
|||
SPXAPI_(bool) audio_data_stream_can_read_data(SPXAUDIOSTREAMHANDLE haudioStream, uint32_t requestedSize); |
|||
SPXAPI_(bool) audio_data_stream_can_read_data_from_position(SPXAUDIOSTREAMHANDLE haudioStream, uint32_t requestedSize, uint32_t position); |
|||
SPXAPI audio_data_stream_read(SPXAUDIOSTREAMHANDLE haudioStream, uint8_t* buffer, uint32_t bufferSize, uint32_t* pfilledSize); |
|||
SPXAPI audio_data_stream_read_from_position(SPXAUDIOSTREAMHANDLE haudioStream, uint8_t* buffer, uint32_t bufferSize, uint32_t position, uint32_t* pfilledSize); |
|||
SPXAPI audio_data_stream_save_to_wave_file(SPXAUDIOSTREAMHANDLE haudioStream, const char* fileName); |
|||
SPXAPI audio_data_stream_get_position(SPXAUDIOSTREAMHANDLE haudioStream, uint32_t* position); |
|||
SPXAPI audio_data_stream_set_position(SPXAUDIOSTREAMHANDLE haudioStream, uint32_t position); |
|||
SPXAPI audio_data_stream_detach_input(SPXAUDIOSTREAMHANDLE audioStreamHandle); |
|||
SPXAPI audio_data_stream_get_property_bag(SPXAUDIOSTREAMHANDLE haudioStream, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI audio_data_stream_release(SPXAUDIOSTREAMHANDLE haudioStream); |
|||
@ -0,0 +1,93 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_audio_stream_format.h: Public API declarations for audio stream format related C methods and types
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
/// <summary>
|
|||
/// Defines supported audio stream container format.
|
|||
/// Changed in version 1.4.0.
|
|||
/// </summary>
|
|||
enum Audio_Stream_Container_Format |
|||
{ |
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for OGG OPUS.
|
|||
/// </summary>
|
|||
StreamFormat_Ogg_Opus = 0x101, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for MP3.
|
|||
/// </summary>
|
|||
StreamFormat_Mp3 = 0x102, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for FLAC. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
StreamFormat_Flac = 0x103, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for ALAW. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
StreamFormat_Alaw = 0x104, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for MULAW. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
StreamFormat_Mulaw = 0x105, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for AMRNB. Currently not supported.
|
|||
/// </summary>
|
|||
StreamFormat_Amrnb = 0x106, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for AMRWB. Currently not supported.
|
|||
/// </summary>
|
|||
StreamFormat_Amrwb = 0x107, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for any other or unknown format.
|
|||
/// </summary>
|
|||
StreamFormat_Any = 0x108, |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Defines supported audio stream wave format in WAV container.
|
|||
/// </summary>
|
|||
enum Audio_Stream_Wave_Format |
|||
{ |
|||
/// <summary>
|
|||
/// Stream WaveFormat definition for PCM (pulse-code modulated) data in integer format.
|
|||
/// </summary>
|
|||
StreamWaveFormat_PCM = 0x0001, |
|||
|
|||
/// <summary>
|
|||
/// Stream WaveFormat definition for A-law-encoded format.
|
|||
/// </summary>
|
|||
StreamWaveFormat_ALAW = 0x0006, |
|||
|
|||
/// <summary>
|
|||
/// Stream WaveFormat definition for Mu-law-encoded format.
|
|||
/// </summary>
|
|||
StreamWaveFormat_MULAW = 0x0007, |
|||
|
|||
/// <summary>
|
|||
/// Stream WaveFormat definition for G.722-encoded format.
|
|||
/// </summary>
|
|||
StreamWaveFormat_G722 = 0x028F |
|||
}; |
|||
|
|||
typedef enum Audio_Stream_Container_Format Audio_Stream_Container_Format; |
|||
typedef enum Audio_Stream_Wave_Format Audio_Stream_Wave_Format; |
|||
|
|||
SPXAPI_(bool) audio_stream_format_is_handle_valid(SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
SPXAPI audio_stream_format_create_from_default_input(SPXAUDIOSTREAMFORMATHANDLE* hformat); |
|||
SPXAPI audio_stream_format_create_from_waveformat(SPXAUDIOSTREAMFORMATHANDLE* hformat, uint32_t samplesPerSecond, uint8_t bitsPerSample, uint8_t channels, Audio_Stream_Wave_Format waveFormat); |
|||
SPXAPI audio_stream_format_create_from_waveformat_pcm(SPXAUDIOSTREAMFORMATHANDLE* hformat, uint32_t samplesPerSecond, uint8_t bitsPerSample, uint8_t channels); |
|||
SPXAPI audio_stream_format_create_from_default_output(SPXAUDIOSTREAMFORMATHANDLE* hformat); |
|||
SPXAPI audio_stream_format_create_from_compressed_format(SPXAUDIOSTREAMFORMATHANDLE* hformat, Audio_Stream_Container_Format compressedFormat); |
|||
SPXAPI audio_stream_format_release(SPXAUDIOSTREAMFORMATHANDLE hformat); |
|||
@ -0,0 +1,15 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI create_auto_detect_source_lang_config_from_open_range(SPXAUTODETECTSOURCELANGCONFIGHANDLE* hAutoDetectSourceLanguageconfig); |
|||
SPXAPI create_auto_detect_source_lang_config_from_languages(SPXAUTODETECTSOURCELANGCONFIGHANDLE* hAutoDetectSourceLanguageconfig, const char* languages); |
|||
SPXAPI create_auto_detect_source_lang_config_from_source_lang_config(SPXAUTODETECTSOURCELANGCONFIGHANDLE* hAutoDetectSourceLanguageconfig, SPXSOURCELANGCONFIGHANDLE hSourceLanguageConfig); |
|||
SPXAPI add_source_lang_config_to_auto_detect_source_lang_config(SPXAUTODETECTSOURCELANGCONFIGHANDLE hAutoDetectSourceLanguageconfig, SPXSOURCELANGCONFIGHANDLE hSourceLanguageConfig); |
|||
SPXAPI_(bool) auto_detect_source_lang_config_is_handle_valid(SPXAUTODETECTSOURCELANGCONFIGHANDLE hAutoDetectSourceLanguageconfig); |
|||
SPXAPI auto_detect_source_lang_config_release(SPXAUTODETECTSOURCELANGCONFIGHANDLE hAutoDetectSourceLanguageconfig); |
|||
SPXAPI auto_detect_source_lang_config_get_property_bag(SPXAUTODETECTSOURCELANGCONFIGHANDLE hAutoDetectSourceLanguageconfig, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,81 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_common.h: Public API declarations for global C definitions and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <spxdebug.h> |
|||
#include <azac_api_c_common.h> // must include after spxdebug.h or speechapi*.h (can NOT be included before) |
|||
#include <stdbool.h> |
|||
#include <spxerror.h> |
|||
|
|||
#define SPX_EXTERN_C AZAC_EXTERN_C |
|||
#ifndef SPXAPI_EXPORT |
|||
#define SPXAPI_EXPORT AZAC_API_EXPORT |
|||
#endif |
|||
|
|||
#define SPXAPI_NOTHROW AZAC_API_NOTHROW |
|||
#define SPXAPI_RESULTTYPE SPXHR |
|||
#define SPXAPI_CALLTYPE AZAC_API_CALLTYPE |
|||
#define SPXAPI_VCALLTYPE AZAC_VCALLTYPE |
|||
|
|||
#define SPXDLL_EXPORT AZAC_DLL_EXPORT |
|||
|
|||
#define SPXAPI SPX_EXTERN_C SPXAPI_EXPORT SPXAPI_RESULTTYPE SPXAPI_NOTHROW SPXAPI_CALLTYPE |
|||
#define SPXAPI_(type) SPX_EXTERN_C SPXAPI_EXPORT type SPXAPI_NOTHROW SPXAPI_CALLTYPE |
|||
#define SPXAPI__(type) SPX_EXTERN_C SPXAPI_EXPORT SPXAPI_NOTHROW type SPXAPI_CALLTYPE |
|||
|
|||
#define SPXAPIV SPX_EXTERN_C SPXAPI_EXPORT SPXAPI_NOTHROW SPXAPI_RESULTTYPE SPXAPI_VCALLTYPE |
|||
#define SPXAPIV_(type) SPX_EXTERN_C SPXAPI_EXPORT SPXAPI_NOTHROW type SPXAPI_VCALLTYPE |
|||
|
|||
#define SPXAPI_PRIVATE SPX_EXTERN_C SPXAPI_RESULTTYPE SPXAPI_NOTHROW SPXAPI_CALLTYPE |
|||
#define SPXAPI_PRIVATE_(type) SPX_EXTERN_C type SPXAPI_NOTHROW SPXAPI_CALLTYPE |
|||
|
|||
#define _spx_empty _azac_empty |
|||
#define _spxhandle _azac_handle |
|||
#define SPXHANDLE AZAC_HANDLE |
|||
#define SPXERRORHANDLE AZAC_HANDLE |
|||
|
|||
#define SPXPROPERTYBAGHANDLE AZAC_HANDLE |
|||
typedef SPXHANDLE SPXASYNCHANDLE; |
|||
typedef SPXHANDLE SPXFACTORYHANDLE; |
|||
typedef SPXHANDLE SPXRECOHANDLE; |
|||
typedef SPXHANDLE SPXSYNTHHANDLE; |
|||
typedef SPXHANDLE SPXRESULTHANDLE; |
|||
typedef SPXHANDLE SPXEVENTHANDLE; |
|||
typedef SPXHANDLE SPXSESSIONHANDLE; |
|||
typedef SPXHANDLE SPXTRIGGERHANDLE; |
|||
typedef SPXHANDLE SPXLUMODELHANDLE; |
|||
typedef SPXHANDLE SPXKEYWORDHANDLE; |
|||
typedef SPXHANDLE SPXAUDIOSTREAMFORMATHANDLE; |
|||
typedef SPXHANDLE SPXAUDIOSTREAMHANDLE; |
|||
typedef SPXHANDLE SPXAUDIOCONFIGHANDLE; |
|||
typedef SPXHANDLE SPXSPEECHCONFIGHANDLE; |
|||
typedef SPXHANDLE SPXCONNECTIONHANDLE; |
|||
typedef SPXHANDLE SPXCONNECTIONMESSAGEHANDLE; |
|||
typedef SPXHANDLE SPXACTIVITYHANDLE; |
|||
typedef SPXHANDLE SPXACTIVITYJSONHANDLE; |
|||
typedef SPXHANDLE SPXGRAMMARHANDLE; |
|||
typedef SPXHANDLE SPXPHRASEHANDLE; |
|||
typedef SPXHANDLE SPXUSERHANDLE; |
|||
typedef SPXHANDLE SPXPARTICIPANTHANDLE; |
|||
typedef SPXHANDLE SPXAUTODETECTSOURCELANGCONFIGHANDLE; |
|||
typedef SPXHANDLE SPXSOURCELANGCONFIGHANDLE; |
|||
typedef SPXHANDLE SPXCONVERSATIONHANDLE; |
|||
typedef SPXHANDLE SPXMEETINGHANDLE; |
|||
typedef SPXHANDLE SPXCONVERSATIONTRANSLATORHANDLE; |
|||
typedef SPXHANDLE SPXVOICEPROFILECLIENTHANDLE; |
|||
typedef SPXHANDLE SPXVOICEPROFILEHANDLE; |
|||
typedef SPXHANDLE SPXSPEAKERIDHANDLE; |
|||
typedef SPXHANDLE SPXSIMODELHANDLE; |
|||
typedef SPXHANDLE SPXSVMODELHANDLE; |
|||
typedef SPXHANDLE SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE; |
|||
typedef SPXHANDLE SPXAUDIOPROCESSINGOPTIONSHANDLE; |
|||
typedef SPXHANDLE SPXSPEECHRECOMODELHANDLE; |
|||
typedef SPXHANDLE SPXREQUESTHANDLE; |
|||
|
|||
#define SPXHANDLE_INVALID ((SPXHANDLE)-1) |
|||
#define SPXHANDLE_RESERVED1 ((SPXHANDLE)+1) |
|||
@ -0,0 +1,46 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI connection_from_recognizer(SPXRECOHANDLE recognizerHandle, SPXCONNECTIONHANDLE* connectionHandle); |
|||
SPXAPI connection_from_conversation_translator(SPXCONVERSATIONTRANSLATORHANDLE convTransHandle, SPXCONNECTIONHANDLE* connectionHandle); |
|||
SPXAPI connection_from_dialog_service_connector(SPXRECOHANDLE convTransHandle, SPXCONNECTIONHANDLE* connectionHandle); |
|||
SPXAPI connection_from_speech_synthesizer(SPXSYNTHHANDLE synthesizerHandle, SPXCONNECTIONHANDLE* connectionHandle); |
|||
|
|||
SPXAPI_(bool) connection_handle_is_valid(SPXCONNECTIONHANDLE handle); |
|||
SPXAPI connection_handle_release(SPXCONNECTIONHANDLE handle); |
|||
SPXAPI connection_async_handle_release(SPXASYNCHANDLE hasync); |
|||
|
|||
SPXAPI connection_open(SPXCONNECTIONHANDLE handle, bool forContinuousRecognition); |
|||
SPXAPI connection_close(SPXCONNECTIONHANDLE handle); |
|||
SPXAPI connection_set_message_property(SPXCONNECTIONHANDLE handle, const char* path, const char* name, const char* value); |
|||
SPXAPI connection_send_message(SPXCONNECTIONHANDLE handle, const char* path, const char* payload); |
|||
SPXAPI connection_send_message_async(SPXCONNECTIONHANDLE handle, const char* path, const char* payload, SPXASYNCHANDLE* phasync); |
|||
|
|||
SPXAPI connection_send_message_data(SPXCONNECTIONHANDLE handle, const char* path, uint8_t* data, uint32_t size); |
|||
SPXAPI connection_send_message_data_async(SPXCONNECTIONHANDLE handle, const char* path, uint8_t* data, uint32_t size, SPXASYNCHANDLE* phasync); |
|||
|
|||
SPXAPI connection_send_message_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
SPXAPI connection_get_property_bag(SPXRECOHANDLE hconn, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
typedef void(*CONNECTION_CALLBACK_FUNC)(SPXEVENTHANDLE event, void* context); |
|||
SPXAPI connection_connected_set_callback(SPXCONNECTIONHANDLE connection, CONNECTION_CALLBACK_FUNC callback, void* context); |
|||
SPXAPI connection_disconnected_set_callback(SPXCONNECTIONHANDLE connection, CONNECTION_CALLBACK_FUNC callback, void* context); |
|||
SPXAPI connection_message_received_set_callback(SPXCONNECTIONHANDLE connection, CONNECTION_CALLBACK_FUNC callback, void* context); |
|||
|
|||
SPXAPI_(bool) connection_message_received_event_handle_is_valid(SPXEVENTHANDLE hevent); |
|||
SPXAPI connection_message_received_event_handle_release(SPXEVENTHANDLE hevent); |
|||
|
|||
SPXAPI connection_message_received_event_get_message(SPXEVENTHANDLE hevent, SPXCONNECTIONMESSAGEHANDLE* hcm); |
|||
|
|||
SPXAPI_(bool) connection_message_handle_is_valid(SPXCONNECTIONMESSAGEHANDLE handle); |
|||
SPXAPI connection_message_handle_release(SPXCONNECTIONMESSAGEHANDLE handle); |
|||
|
|||
SPXAPI connection_message_get_property_bag(SPXCONNECTIONMESSAGEHANDLE hcm, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI connection_message_get_data(SPXCONNECTIONMESSAGEHANDLE hcm, uint8_t* data, uint32_t size); |
|||
SPXAPI_(uint32_t) connection_message_get_data_size(SPXCONNECTIONMESSAGEHANDLE hcm); |
|||
@ -0,0 +1,28 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_conversation.h: Public API declarations for conversation related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI conversation_create_from_config(SPXCONVERSATIONHANDLE* phconv, SPXSPEECHCONFIGHANDLE hspeechconfig, const char* id); |
|||
SPXAPI conversation_update_participant_by_user_id(SPXCONVERSATIONHANDLE hconv, bool add, const char* userId); |
|||
SPXAPI conversation_update_participant_by_user(SPXCONVERSATIONHANDLE hconv, bool add, SPXUSERHANDLE huser); |
|||
SPXAPI conversation_update_participant(SPXCONVERSATIONHANDLE hconv, bool add, SPXPARTICIPANTHANDLE hparticipant); |
|||
SPXAPI conversation_get_conversation_id(SPXCONVERSATIONHANDLE hconv, char* id, size_t size); |
|||
SPXAPI conversation_end_conversation(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_get_property_bag(SPXCONVERSATIONHANDLE hconv, SPXPROPERTYBAGHANDLE* phpropbag); |
|||
SPXAPI conversation_release_handle(SPXHANDLE handle); |
|||
|
|||
SPXAPI conversation_start_conversation(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_delete_conversation(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_lock_conversation(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_unlock_conversation(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_mute_all_participants(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_unmute_all_participants(SPXCONVERSATIONHANDLE hconv); |
|||
SPXAPI conversation_mute_participant(SPXCONVERSATIONHANDLE hconv, const char * participantId); |
|||
SPXAPI conversation_unmute_participant(SPXCONVERSATIONHANDLE hconv, const char * participantId); |
|||
|
|||
@ -0,0 +1,11 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_conversation_transcriber_result.h: Public API declarations for ConversationTranscriberResult related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI conversation_transcription_result_get_speaker_id(SPXRESULTHANDLE hresult, char* pszSpeakerId, uint32_t cchSpeakerId); |
|||
@ -0,0 +1,63 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_conversation_translator.h: Public API declarations for conversation translator related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_connection.h> |
|||
|
|||
#ifdef __cplusplus |
|||
#include <speechapi_cxx_enums.h> |
|||
typedef Microsoft::CognitiveServices::Speech::Transcription::ParticipantChangedReason ParticipantChangedReason; |
|||
#else |
|||
#include <speechapi_c_property_bag.h> |
|||
#endif |
|||
|
|||
typedef void(*PCONV_TRANS_CALLBACK)(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, SPXEVENTHANDLE hEvent, void* pvContext); |
|||
|
|||
SPXAPI conversation_translator_create_from_config(SPXCONVERSATIONTRANSLATORHANDLE* phandle, SPXAUDIOCONFIGHANDLE haudioinput); |
|||
SPXAPI conversation_translator_get_property_bag(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator, SPXPROPERTYBAGHANDLE* phpropertyBag); |
|||
|
|||
SPXAPI conversation_translator_join(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator, SPXCONVERSATIONHANDLE hconv, const char* psznickname); |
|||
SPXAPI conversation_translator_join_with_id(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator, const char *pszconversationid, const char* psznickname, const char * pszlang); |
|||
SPXAPI conversation_translator_start_transcribing(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator); |
|||
SPXAPI conversation_translator_stop_transcribing(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator); |
|||
SPXAPI conversation_translator_send_text_message(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator, const char *pszmessage); |
|||
SPXAPI conversation_translator_leave(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator); |
|||
SPXAPI conversation_translator_set_authorization_token(SPXCONVERSATIONTRANSLATORHANDLE hconvtranslator, const char* pszAuthToken, const char* pszRegion); |
|||
|
|||
SPXAPI_(bool) conversation_translator_handle_is_valid(SPXCONVERSATIONTRANSLATORHANDLE handle); |
|||
SPXAPI conversation_translator_handle_release(SPXHANDLE handle); |
|||
|
|||
SPXAPI conversation_translator_session_started_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_session_stopped_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_canceled_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_participants_changed_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_conversation_expiration_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_transcribing_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_transcribed_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
SPXAPI conversation_translator_text_message_recevied_set_callback(SPXCONVERSATIONTRANSLATORHANDLE hConvTrans, PCONV_TRANS_CALLBACK pCallback, void* pvContext); |
|||
|
|||
SPXAPI conversation_translator_connection_connected_set_callback(SPXCONNECTIONHANDLE hConnection, CONNECTION_CALLBACK_FUNC pCallback, void * pvContext); |
|||
SPXAPI conversation_translator_connection_disconnected_set_callback(SPXCONNECTIONHANDLE hConnection, CONNECTION_CALLBACK_FUNC pCallback, void * pvContext); |
|||
|
|||
SPXAPI_(bool) conversation_translator_event_handle_is_valid(SPXCONVERSATIONTRANSLATORHANDLE handle); |
|||
SPXAPI conversation_translator_event_handle_release(SPXHANDLE handle); |
|||
|
|||
SPXAPI conversation_translator_event_get_expiration_time(SPXEVENTHANDLE hevent, int32_t* pexpirationminutes); |
|||
SPXAPI conversation_translator_event_get_participant_changed_reason(SPXEVENTHANDLE hevent, ParticipantChangedReason* preason); |
|||
SPXAPI conversation_translator_event_get_participant_changed_at_index(SPXEVENTHANDLE hevent, int index, SPXPARTICIPANTHANDLE* phparticipant); |
|||
|
|||
SPXAPI conversation_translator_result_get_user_id(SPXRESULTHANDLE hresult, char* pszUserId, uint32_t cchUserId); |
|||
|
|||
SPXAPI conversation_translator_result_get_original_lang(SPXRESULTHANDLE hresult, char * psz, uint32_t * pcch); |
|||
|
|||
SPXAPI conversation_translator_participant_get_avatar(SPXEVENTHANDLE hevent, char * psz, uint32_t * pcch); |
|||
SPXAPI conversation_translator_participant_get_displayname(SPXEVENTHANDLE hevent, char * psz, uint32_t * pcch); |
|||
SPXAPI conversation_translator_participant_get_id(SPXEVENTHANDLE hevent, char * psz, uint32_t * pcch); |
|||
SPXAPI conversation_translator_participant_get_is_muted(SPXEVENTHANDLE hevent, bool * pMuted); |
|||
SPXAPI conversation_translator_participant_get_is_host(SPXEVENTHANDLE hevent, bool * pIsHost); |
|||
SPXAPI conversation_translator_participant_get_is_using_tts(SPXEVENTHANDLE hevent, bool * ptts); |
|||
@ -0,0 +1,8 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <azac_api_c_diagnostics.h> // must include after spxdebug.h or speechapi*.h (can NOT be included before) |
|||
@ -0,0 +1,15 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_dialog_service_config.h: Public API declarations for dialog service connector configuration related C methods and types
|
|||
//
|
|||
#pragma once |
|||
|
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI bot_framework_config_from_subscription(SPXSPEECHCONFIGHANDLE* ph_config, const char* subscription, const char* region, const char *bot_Id); |
|||
SPXAPI bot_framework_config_from_authorization_token(SPXSPEECHCONFIGHANDLE* ph_config, const char* auth_token, const char* region, const char* bot_Id); |
|||
|
|||
SPXAPI custom_commands_config_from_subscription(SPXSPEECHCONFIGHANDLE* ph_dialog_service_config, const char* app_id, const char *subscription, const char* region); |
|||
SPXAPI custom_commands_config_from_authorization_token(SPXSPEECHCONFIGHANDLE* ph_dialog_service_config, const char* app_id, const char *auth_token, const char* region); |
|||
@ -0,0 +1,92 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_dialog_service_connector.h: Public API declaration for Dialog Service Connector related C methods.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_handle_is_valid(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_handle_release(SPXRECOHANDLE h_connector); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_async_handle_is_valid(SPXASYNCHANDLE h_async); |
|||
SPXAPI dialog_service_connector_async_handle_release(SPXASYNCHANDLE h_async); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_async_void_handle_is_valid(SPXASYNCHANDLE h_async); |
|||
SPXAPI dialog_service_connector_async_void_handle_release(SPXASYNCHANDLE h_async); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_async_string_handle_is_valid(SPXASYNCHANDLE h_async); |
|||
SPXAPI dialog_service_connector_async_string_handle_release(SPXASYNCHANDLE h_async); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_async_reco_result_handle_is_valid(SPXASYNCHANDLE h_async); |
|||
SPXAPI dialog_service_connector_async_reco_result_handle_release(SPXASYNCHANDLE h_async); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_activity_received_event_handle_is_valid(SPXEVENTHANDLE h_event); |
|||
SPXAPI dialog_service_connector_activity_received_event_release(SPXEVENTHANDLE h_event); |
|||
|
|||
SPXAPI_(bool) dialog_service_connector_turn_status_received_handle_is_valid(SPXEVENTHANDLE h_event); |
|||
SPXAPI dialog_service_connector_turn_status_received_release(SPXEVENTHANDLE h_event); |
|||
|
|||
SPXAPI dialog_service_connector_get_property_bag(SPXRECOHANDLE h_connector, SPXPROPERTYBAGHANDLE* h_prop_bag); |
|||
|
|||
SPXAPI dialog_service_connector_connect(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_connect_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_connect_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds); |
|||
|
|||
SPXAPI dialog_service_connector_disconnect(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_disconnect_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_disconnect_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds); |
|||
|
|||
SPXAPI dialog_service_connector_send_activity(SPXRECOHANDLE h_connector, const char* activity, char* interaction_id); |
|||
SPXAPI dialog_service_connector_send_activity_async(SPXRECOHANDLE h_connector, const char* activity, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_send_activity_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds, char* interaction_id); |
|||
|
|||
SPXAPI dialog_service_connector_start_keyword_recognition(SPXRECOHANDLE h_connector, SPXKEYWORDHANDLE h_keyword); |
|||
SPXAPI dialog_service_connector_start_keyword_recognition_async(SPXRECOHANDLE h_connector, SPXKEYWORDHANDLE h_keyword, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_start_keyword_recognition_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds); |
|||
|
|||
SPXAPI dialog_service_connector_stop_keyword_recognition(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_stop_keyword_recognition_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_stop_keyword_recognition_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds); |
|||
|
|||
SPXAPI dialog_service_connector_listen_once(SPXRECOHANDLE h_connector, SPXRESULTHANDLE* p_result); |
|||
SPXAPI dialog_service_connector_listen_once_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
SPXAPI dialog_service_connector_listen_once_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds, SPXRESULTHANDLE* p_result); |
|||
|
|||
SPXAPI dialog_service_connector_start_continuous_listening(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_start_continuous_listening_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
|
|||
SPXAPI dialog_service_connector_stop_listening(SPXRECOHANDLE h_connector); |
|||
SPXAPI dialog_service_connector_stop_listening_async(SPXRECOHANDLE h_connector, SPXASYNCHANDLE* p_async); |
|||
|
|||
typedef void(*PSESSION_CALLBACK_FUNC)(SPXRECOHANDLE h_connector, SPXEVENTHANDLE h_event, void* pv_context); |
|||
|
|||
SPXAPI dialog_service_connector_session_started_set_callback(SPXRECOHANDLE h_connector, PSESSION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
SPXAPI dialog_service_connector_session_stopped_set_callback(SPXRECOHANDLE h_connector, PSESSION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
|
|||
SPXAPI dialog_service_connector_speech_start_detected_set_callback(SPXRECOHANDLE h_connector, PSESSION_CALLBACK_FUNC p_callback, void* pv_context); |
|||
SPXAPI dialog_service_connector_speech_end_detected_set_callback(SPXRECOHANDLE h_connector, PSESSION_CALLBACK_FUNC p_callback, void* pv_context); |
|||
|
|||
typedef void(*PRECOGNITION_CALLBACK_FUNC)(SPXRECOHANDLE h_connector, SPXEVENTHANDLE h_event, void* pv_context); |
|||
|
|||
SPXAPI dialog_service_connector_recognized_set_callback(SPXRECOHANDLE h_connector, PRECOGNITION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
SPXAPI dialog_service_connector_recognizing_set_callback(SPXRECOHANDLE h_connector, PRECOGNITION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
SPXAPI dialog_service_connector_canceled_set_callback(SPXRECOHANDLE h_connector, PRECOGNITION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
SPXAPI dialog_service_connector_activity_received_set_callback(SPXRECOHANDLE h_connector, PRECOGNITION_CALLBACK_FUNC p_callback, void *pv_context); |
|||
SPXAPI dialog_service_connector_turn_status_received_set_callback(SPXRECOHANDLE h_connector, PRECOGNITION_CALLBACK_FUNC p_callback, void* pv_context); |
|||
|
|||
SPXAPI dialog_service_connector_activity_received_event_get_activity_size(SPXEVENTHANDLE h_event, size_t* size); |
|||
SPXAPI dialog_service_connector_activity_received_event_get_activity(SPXEVENTHANDLE h_event, char* p_activity, size_t size); |
|||
SPXAPI_(bool) dialog_service_connector_activity_received_event_has_audio(SPXEVENTHANDLE h_event); |
|||
SPXAPI dialog_service_connector_activity_received_event_get_audio(SPXEVENTHANDLE h_event, SPXAUDIOSTREAMHANDLE* p_audio); |
|||
|
|||
SPXAPI dialog_service_connector_turn_status_received_get_interaction_id_size(SPXEVENTHANDLE h_event, size_t* size); |
|||
SPXAPI dialog_service_connector_turn_status_received_get_interaction_id(SPXEVENTHANDLE h_event, char* p_interaction_id, size_t size); |
|||
SPXAPI dialog_service_connector_turn_status_received_get_conversation_id_size(SPXEVENTHANDLE h_event, size_t* size); |
|||
SPXAPI dialog_service_connector_turn_status_received_get_conversation_id(SPXEVENTHANDLE h_event, char* p_interaction_id, size_t size); |
|||
SPXAPI dialog_service_connector_turn_status_received_get_status(SPXEVENTHANDLE h_event, int* p_status); |
|||
|
|||
SPXAPI dialog_service_connector_recognized_size(SPXEVENTHANDLE h_event, uint32_t* size); |
|||
SPXAPI dialog_service_connector_recognized_get_result(SPXEVENTHANDLE h_event, uint32_t* size); |
|||
@ -0,0 +1,21 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_speech_config.h> |
|||
#include <speechapi_c_speech_recognition_model.h> |
|||
#include <speechapi_c_speech_translation_model.h> |
|||
|
|||
SPXAPI embedded_speech_config_create(SPXSPEECHCONFIGHANDLE* hconfig); |
|||
SPXAPI embedded_speech_config_add_path(SPXSPEECHCONFIGHANDLE hconfig, const char* path); |
|||
SPXAPI embedded_speech_config_get_num_speech_reco_models(SPXSPEECHCONFIGHANDLE hconfig, uint32_t* numModels); |
|||
SPXAPI embedded_speech_config_get_speech_reco_model(SPXSPEECHCONFIGHANDLE hconfig, uint32_t index, SPXSPEECHRECOMODELHANDLE* hmodel); |
|||
SPXAPI embedded_speech_config_get_num_speech_translation_models(SPXSPEECHCONFIGHANDLE hconfig, uint32_t* numModels); |
|||
SPXAPI embedded_speech_config_get_speech_translation_model(SPXSPEECHCONFIGHANDLE hconfig, uint32_t index, SPXSPEECHRECOMODELHANDLE* hmodel); |
|||
SPXAPI embedded_speech_config_set_speech_recognition_model(SPXSPEECHCONFIGHANDLE hconfig, const char* name, const char* license); |
|||
SPXAPI embedded_speech_config_set_speech_synthesis_voice(SPXSPEECHCONFIGHANDLE hconfig, const char* name, const char* license); |
|||
SPXAPI embedded_speech_config_set_speech_translation_model(SPXSPEECHCONFIGHANDLE hconfig, const char* name, const char* license); |
|||
SPXAPI embedded_speech_config_set_keyword_recognition_model(SPXSPEECHCONFIGHANDLE hconfig, const char* name, const char* license); |
|||
@ -0,0 +1,9 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <azac_api_c_error.h> // must include after spxdebug.h or speechapi*.h (can NOT be included before) |
|||
@ -0,0 +1,105 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include "speechapi_c_common.h" |
|||
|
|||
const char CODECCREATEEXPORTNAME[] = "codec_create"; |
|||
struct codec_c_interface; |
|||
typedef struct codec_c_interface* codec_c_interface_P; |
|||
typedef codec_c_interface_P SPXCODECCTYPE; |
|||
|
|||
/*! \cond INTERNAL */ |
|||
|
|||
/**
|
|||
* The SPX_CODEC_CLIENT_GET_PROPERTY represents the function reading a property value |
|||
* @param id Property id. |
|||
* @param buffer caller provided buffer to receive the value of the property |
|||
* @param buffersize buffer size. If buffer is passed as null it will return the required buffer size. |
|||
* @param codecContext A pointer to caller data provided through the codec_create call. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
typedef SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE *SPX_CODEC_CLIENT_GET_PROPERTY)(const char* id, char* buffer, uint64_t* buffersize, void* codecContext); |
|||
|
|||
/**
|
|||
* The AUDIO_ENCODER_ONENCODEDDATA type represents an application-defined |
|||
* status callback function used to provide the encoded data. |
|||
* @param pBuffer audio data buffer. |
|||
* @param bytesToWrite The length of pBuffer in bytes. |
|||
* @param duration_100nanos The duration of the audio sample |
|||
* @param pContext A pointer to the application-defined callback context. |
|||
*/ |
|||
typedef void(SPXAPI_CALLTYPE *AUDIO_ENCODER_ONENCODEDDATA)(const uint8_t* pBuffer, size_t bytesToWrite, uint64_t duration_100nanos, void* pContext); |
|||
|
|||
struct codec_c_interface |
|||
{ |
|||
/**
|
|||
* @param codec codec Object returned by the codec_create call to be initialized |
|||
* @param inputSamplesPerSecond sample rate for the input audio |
|||
* @param inputBitsPerSample bits per sample for the input audio |
|||
* @param inputChannels number of channel of the input audio |
|||
* @param dataCallback An application defined callback. |
|||
* @param pContext A pointer to the application-defined callback context. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE *init)( |
|||
SPXCODECCTYPE codec, |
|||
uint32_t inputSamplesPerSecond, |
|||
uint8_t inputBitsPerSample, |
|||
uint8_t inputChannels, |
|||
AUDIO_ENCODER_ONENCODEDDATA datacallback, |
|||
void* pContext); |
|||
|
|||
/**
|
|||
* @param codec codec object returned by the codec_create call. |
|||
* @param buffer caller provided buffer to receive the value of the property |
|||
* @param buffersize buffer size. If buffer is passed as null it will return the required buffer size. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE* get_format_type)(SPXCODECCTYPE codec, char* buffer, uint64_t* buffersize); |
|||
|
|||
/**
|
|||
* Encodes raw PCM data. |
|||
* @param codec codec object returned by the codec_create call. |
|||
* @param pBuffer The PCM data. |
|||
* @param bytesToWrite The length pBuffer. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE *encode) (SPXCODECCTYPE codec, const uint8_t* pBuffer, size_t bytesToWrite); |
|||
|
|||
/**
|
|||
* Flushes the encoder. |
|||
* @param codec codec object returned by the codec_create call. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE(SPXAPI_CALLTYPE* flush)(SPXCODECCTYPE codec); |
|||
|
|||
/**
|
|||
* Terminate the encoded stream immediately |
|||
* @param codec codec object returned by the codec_create call. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE *endstream)(SPXCODECCTYPE codec); |
|||
|
|||
/**
|
|||
* Destroys the encoder. The codec object should not be used anymore after this call. |
|||
* @param codec codec object returned by the codec_create call. |
|||
* @return A return code or zero if successful. |
|||
*/ |
|||
SPXAPI_RESULTTYPE (SPXAPI_CALLTYPE *destroy) (SPXCODECCTYPE codec); |
|||
}; |
|||
|
|||
/**
|
|||
* Creates a codec object. This method needs to be exported from the dll |
|||
* @param codecid - codec id, can be null or empty if the library implements only one codec. |
|||
* @param codecContext - context to be used to call back to the caller |
|||
* @param property_read_func - function to read properties |
|||
* @return A codec object |
|||
*/ |
|||
|
|||
SPX_EXTERN_C SPXDLL_EXPORT SPXCODECCTYPE codec_create(const char* codecid, void* codecContext, SPX_CODEC_CLIENT_GET_PROPERTY property_read_func); |
|||
typedef SPXCODECCTYPE (*PCODEC_CREATE_FUNC)(const char* codecid, void* codecContext, SPX_CODEC_CLIENT_GET_PROPERTY property_read_func); |
|||
|
|||
/*! \endcond */ |
|||
@ -0,0 +1,29 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI recognizer_create_speech_recognizer_from_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_speech_recognizer_from_auto_detect_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUTODETECTSOURCELANGCONFIGHANDLE hautoDetectSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_speech_recognizer_from_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXSOURCELANGCONFIGHANDLE hSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_translation_recognizer_from_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_translation_recognizer_from_auto_detect_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUTODETECTSOURCELANGCONFIGHANDLE hautoDetectSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_intent_recognizer_from_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_keyword_recognizer_from_audio_config(SPXRECOHANDLE* phreco, SPXAUDIOCONFIGHANDLE haudio); |
|||
SPXAPI recognizer_create_source_language_recognizer_from_auto_detect_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUTODETECTSOURCELANGCONFIGHANDLE hautoDetectSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI synthesizer_create_speech_synthesizer_from_config(SPXSYNTHHANDLE* phsynth, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioOuput); |
|||
SPXAPI synthesizer_create_speech_synthesizer_from_auto_detect_source_lang_config(SPXSYNTHHANDLE* phsynth, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUTODETECTSOURCELANGCONFIGHANDLE hautoDetectSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioOutput); |
|||
SPXAPI dialog_service_connector_create_dialog_service_connector_from_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
//SPXAPI recognizer_create_conversation_transcriber_from_config(SPXRECOHANDLE* phreco, SPXAUDIOCONFIGHANDLE haudioInput);
|
|||
SPXAPI recognizer_create_conversation_transcriber_from_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_conversation_transcriber_from_auto_detect_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUTODETECTSOURCELANGCONFIGHANDLE hautoDetectSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_create_conversation_transcriber_from_source_lang_config(SPXRECOHANDLE* phreco, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXSOURCELANGCONFIGHANDLE hSourceLangConfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_join_conversation(SPXCONVERSATIONHANDLE hconv, SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_leave_conversation(SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_create_meeting_transcriber_from_config(SPXRECOHANDLE* phreco, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI recognizer_join_meeting(SPXMEETINGHANDLE hmeeting, SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_leave_meeting(SPXRECOHANDLE hreco); |
|||
SPXAPI transcriber_get_participants_list(SPXRECOHANDLE hreco, SPXPARTICIPANTHANDLE* participants, int size); |
|||
@ -0,0 +1,33 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_grammar.h: Public API declarations for Grammar related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
typedef enum |
|||
{ |
|||
// A Recognition Factor will apply to grammars that are referenced as individual words.
|
|||
PartialPhrase = 1 |
|||
} GrammarList_RecognitionFactorScope; |
|||
|
|||
SPXAPI_(bool) grammar_handle_is_valid(SPXGRAMMARHANDLE hgrammar); |
|||
SPXAPI phrase_list_grammar_from_recognizer_by_name(SPXGRAMMARHANDLE* hgrammar, SPXRECOHANDLE hreco, const char* name); |
|||
SPXAPI grammar_handle_release(SPXGRAMMARHANDLE hgrammar); |
|||
|
|||
SPXAPI phrase_list_grammar_add_phrase(SPXGRAMMARHANDLE hgrammar, SPXPHRASEHANDLE hphrase); |
|||
SPXAPI phrase_list_grammar_clear(SPXGRAMMARHANDLE hgrammar); |
|||
|
|||
SPXAPI_(bool) grammar_phrase_handle_is_valid(SPXPHRASEHANDLE hphrase); |
|||
SPXAPI grammar_phrase_create_from_text(SPXPHRASEHANDLE* hphrase, const char* phrase); |
|||
SPXAPI grammar_phrase_handle_release(SPXPHRASEHANDLE hphrase); |
|||
|
|||
SPXAPI grammar_create_from_storage_id(SPXGRAMMARHANDLE *hgrammarlist, const char *id); |
|||
SPXAPI grammar_list_from_recognizer(SPXGRAMMARHANDLE *hgrammarlist, SPXRECOHANDLE hreco); |
|||
SPXAPI grammar_list_add_grammar(SPXGRAMMARHANDLE hgrammarlist, SPXGRAMMARHANDLE hgrammar); |
|||
SPXAPI grammar_list_set_recognition_factor(SPXGRAMMARHANDLE hgrammarlist, double factor, GrammarList_RecognitionFactorScope scope); |
|||
SPXAPI class_language_model_from_storage_id(SPXGRAMMARHANDLE* hclm, const char *storageid); |
|||
SPXAPI class_language_model_assign_class(SPXGRAMMARHANDLE hclm, const char *classname, SPXGRAMMARHANDLE hgrammar); |
|||
@ -0,0 +1,9 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI hybrid_speech_config_create(SPXSPEECHCONFIGHANDLE* hconfig, SPXSPEECHCONFIGHANDLE hcloudSpeechConfig, SPXSPEECHCONFIGHANDLE hembeddedSpeechConfig); |
|||
@ -0,0 +1,16 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_intent_recognizer.h: Public API declarations for IntentRecognizer related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI intent_recognizer_add_intent(SPXRECOHANDLE hreco, const char* intentId, SPXTRIGGERHANDLE htrigger); |
|||
SPXAPI intent_recognizer_add_intent_with_model_id(SPXRECOHANDLE hreco, SPXTRIGGERHANDLE htrigger, const char* modelId); |
|||
SPXAPI intent_recognizer_recognize_text_once(SPXRECOHANDLE hreco, const char* text, SPXRESULTHANDLE* hresult); |
|||
SPXAPI intent_recognizer_clear_language_models(SPXRECOHANDLE hreco); |
|||
SPXAPI intent_recognizer_import_pattern_matching_model(SPXRECOHANDLE hreco, const char* jsonData); |
|||
SPXAPI intent_recognizer_add_conversational_language_understanding_model(SPXRECOHANDLE hreco, const char* languageResourceKey, const char* endpoint, const char* projectName, const char* deploymentName); |
|||
@ -0,0 +1,11 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_intent_result.h: Public API declarations for IntentResult related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI intent_result_get_intent_id(SPXRESULTHANDLE hresult, char* pszIntentId, uint32_t cchIntentId); |
|||
@ -0,0 +1,17 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_intent_trigger.h: Public API declarations for IntentTrigger related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
|
|||
SPXAPI_(bool) intent_trigger_handle_is_valid(SPXTRIGGERHANDLE htrigger); |
|||
|
|||
SPXAPI intent_trigger_create_from_phrase(SPXTRIGGERHANDLE* htrigger, const char* phrase); |
|||
SPXAPI intent_trigger_create_from_language_understanding_model(SPXTRIGGERHANDLE* htrigger, SPXLUMODELHANDLE hlumodel, const char* intentName); |
|||
|
|||
SPXAPI intent_trigger_handle_release(SPXTRIGGERHANDLE htrigger); |
|||
@ -0,0 +1,37 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/vision/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI__(const char*) ai_core_string_create(const char* str, size_t size); |
|||
SPXAPI_(void) ai_core_string_free(const char* str); |
|||
|
|||
SPXAPI_(int) ai_core_json_parser_create(SPXHANDLE* parser, const char* json, size_t jsize); // returns item for root
|
|||
SPXAPI_(bool) ai_core_json_parser_handle_is_valid(SPXHANDLE parser); |
|||
SPXAPI ai_core_json_parser_handle_release(SPXHANDLE parser); |
|||
|
|||
SPXAPI_(int) ai_core_json_builder_create(SPXHANDLE* builder, const char* json, size_t jsize); // returns item for root
|
|||
SPXAPI_(bool) ai_core_json_builder_handle_is_valid(SPXHANDLE builder); |
|||
SPXAPI ai_core_json_builder_handle_release(SPXHANDLE builder); |
|||
|
|||
SPXAPI_(int) ai_core_json_item_count(SPXHANDLE parserOrBuilder, int item); |
|||
SPXAPI_(int) ai_core_json_item_at(SPXHANDLE parserOrBuilder, int item, int index, const char* find); // returns item found
|
|||
SPXAPI_(int) ai_core_json_item_next(SPXHANDLE parserOrBuilder, int item); // returns next item
|
|||
SPXAPI_(int) ai_core_json_item_name(SPXHANDLE parserOrBuilder, int item); // returns item representing name of item specified
|
|||
|
|||
SPXAPI_(int) ai_core_json_value_kind(SPXHANDLE parserOrBuilder, int item); |
|||
SPXAPI_(bool) ai_core_json_value_as_bool(SPXHANDLE parserOrBuilder, int item, bool defaultValue); |
|||
SPXAPI_(double) ai_core_json_value_as_double(SPXHANDLE parserOrBuilder, int item, double defaultValue); |
|||
SPXAPI_(int64_t) ai_core_json_value_as_int(SPXHANDLE parserOrBuilder, int item, int64_t defaultValue); |
|||
SPXAPI_(uint64_t) ai_core_json_value_as_uint(SPXHANDLE parserOrBuilder, int item, uint64_t defaultValue); |
|||
|
|||
SPXAPI__(const char*) ai_core_json_value_as_string_ptr(SPXHANDLE parserOrBuilder, int item, size_t* size); |
|||
|
|||
SPXAPI__(const char*) ai_core_json_value_as_string_copy(SPXHANDLE parserOrBuilder, int item, const char* defaultValue); |
|||
SPXAPI__(const char*) ai_core_json_value_as_json_copy(SPXHANDLE parserOrBuilder, int item); |
|||
|
|||
SPXAPI_(int) ai_core_json_builder_item_add(SPXHANDLE builder, int item, int index, const char* find); |
|||
SPXAPI ai_core_json_builder_item_set(SPXHANDLE builder, int item, const char* json, size_t jsize, int kind, const char* str, size_t ssize, bool boolean, int integer, double number); |
|||
@ -0,0 +1,17 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_keyword_recognition_model.h: Public API declarations for KeywordRecognitionModel related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
|
|||
SPXAPI_(bool) keyword_recognition_model_handle_is_valid(SPXKEYWORDHANDLE hkeyword); |
|||
SPXAPI keyword_recognition_model_handle_release(SPXKEYWORDHANDLE hkeyword); |
|||
|
|||
SPXAPI keyword_recognition_model_create_from_file(const char* fileName, SPXKEYWORDHANDLE* phkwmodel); |
|||
SPXAPI keyword_recognition_model_create_from_config(SPXSPEECHCONFIGHANDLE hconfig, SPXKEYWORDHANDLE* phkwmodel); |
|||
SPXAPI keyword_recognition_model_add_user_defined_wake_word(SPXKEYWORDHANDLE hkwmodel, const char* wakeWord); |
|||
@ -0,0 +1,18 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_language_understanding_model.h: Public API declarations for LanguageUnderstandingModel related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI_(bool) language_understanding_model_handle_is_valid(SPXLUMODELHANDLE hlumodel); |
|||
|
|||
SPXAPI language_understanding_model_create_from_uri(SPXLUMODELHANDLE* hlumodel, const char* uri); |
|||
SPXAPI language_understanding_model_create_from_app_id(SPXLUMODELHANDLE* hlumodel, const char* appId); |
|||
SPXAPI language_understanding_model_create_from_subscription(SPXLUMODELHANDLE* hlumodel, const char* subscriptionKey, const char* appId, const char* region); |
|||
|
|||
SPXAPI language_understanding_model__handle_release(SPXLUMODELHANDLE hlumodel); |
|||
SPXAPI__(const char *) language_understanding_model_get_model_id(SPXLUMODELHANDLE hlumodel); |
|||
@ -0,0 +1,28 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_meeting.h: Public API declarations for meeting related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI meeting_create_from_config(SPXMEETINGHANDLE* phmeeting, SPXSPEECHCONFIGHANDLE hspeechconfig, const char* id); |
|||
SPXAPI meeting_update_participant_by_user_id(SPXMEETINGHANDLE hconv, bool add, const char* userId); |
|||
SPXAPI meeting_update_participant_by_user(SPXMEETINGHANDLE hconv, bool add, SPXUSERHANDLE huser); |
|||
SPXAPI meeting_update_participant(SPXMEETINGHANDLE hconv, bool add, SPXPARTICIPANTHANDLE hparticipant); |
|||
SPXAPI meeting_get_meeting_id(SPXMEETINGHANDLE hconv, char* id, size_t size); |
|||
SPXAPI meeting_end_meeting(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_get_property_bag(SPXMEETINGHANDLE hconv, SPXPROPERTYBAGHANDLE* phpropbag); |
|||
SPXAPI meeting_release_handle(SPXHANDLE handle); |
|||
|
|||
SPXAPI meeting_start_meeting(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_delete_meeting(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_lock_meeting(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_unlock_meeting(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_mute_all_participants(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_unmute_all_participants(SPXMEETINGHANDLE hconv); |
|||
SPXAPI meeting_mute_participant(SPXMEETINGHANDLE hconv, const char * participantId); |
|||
SPXAPI meeting_unmute_participant(SPXMEETINGHANDLE hconv, const char * participantId); |
|||
|
|||
@ -0,0 +1,12 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_meeting_transcriber_result.h: Public API declarations for MeetingTranscriberResult related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI meeting_transcription_result_get_user_id(SPXRESULTHANDLE hresult, char* pszUserId, uint32_t cchUserId); |
|||
SPXAPI meeting_transcription_result_get_utterance_id(SPXRESULTHANDLE hresult, char* pszUtteranceId, uint32_t cchUtteranceId); |
|||
@ -0,0 +1,12 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_operations.h: Public API declaration for common operation methods in the C API layer.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI speechapi_async_handle_release(SPXASYNCHANDLE h_async); |
|||
SPXAPI speechapi_async_wait_for(SPXASYNCHANDLE h_async, uint32_t milliseconds); |
|||
@ -0,0 +1,15 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_participant.h: Public API declarations for conversation transcriber participant related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI participant_create_handle(SPXPARTICIPANTHANDLE* hparticipant, const char* userId, const char* preferred_language, const char* voice_signature); |
|||
SPXAPI participant_release_handle(SPXPARTICIPANTHANDLE hparticipant); |
|||
SPXAPI participant_set_preferred_langugage(SPXPARTICIPANTHANDLE hparticipant, const char* preferred_language); |
|||
SPXAPI participant_set_voice_signature(SPXPARTICIPANTHANDLE hparticipant, const char* voice_signature); |
|||
SPXAPI participant_get_property_bag(SPXPARTICIPANTHANDLE hparticipant, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,33 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_pattern_matching_model.h: Public API declarations for PatternMatchingModel related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI_(bool) pattern_matching_model_handle_is_valid(SPXLUMODELHANDLE hlumodel); |
|||
|
|||
SPXAPI pattern_matching_model_create(SPXLUMODELHANDLE* hlumodel, SPXRECOHANDLE hIntentReco, const char* id); |
|||
SPXAPI pattern_matching_model_create_from_id(SPXLUMODELHANDLE* hlumodel, const char* id); |
|||
|
|||
typedef SPXAPI_RESULTTYPE(SPXAPI_CALLTYPE* PATTERN_MATCHING_MODEL_GET_STR_FROM_INDEX)(void* context, size_t index, const char** str, size_t* size); |
|||
|
|||
SPXAPI pattern_matching_model_add_entity( |
|||
SPXLUMODELHANDLE hlumodel, |
|||
const char* id, |
|||
int32_t type, |
|||
int32_t mode, |
|||
size_t numPhrases, |
|||
void* phraseContext, |
|||
PATTERN_MATCHING_MODEL_GET_STR_FROM_INDEX phraseGetter); |
|||
|
|||
SPXAPI pattern_matching_model_add_intent( |
|||
SPXLUMODELHANDLE hlumodel, |
|||
const char* id, |
|||
uint32_t priority, |
|||
size_t numPhrases, |
|||
void* phraseContext, |
|||
PATTERN_MATCHING_MODEL_GET_STR_FROM_INDEX phraseGetter); |
|||
@ -0,0 +1,33 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
typedef enum |
|||
{ |
|||
PronunciationAssessmentGradingSystem_FivePoint = 1, |
|||
PronunciationAssessmentGradingSystem_HundredMark = 2 |
|||
} Pronunciation_Assessment_Grading_System; |
|||
|
|||
typedef enum |
|||
{ |
|||
PronunciationAssessmentGranularity_Phoneme = 1, |
|||
PronunciationAssessmentGranularity_Word = 2, |
|||
PronunciationAssessmentGranularity_FullText = 3 |
|||
} Pronunciation_Assessment_Granularity; |
|||
|
|||
SPXAPI create_pronunciation_assessment_config(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE* hPronunciationAssessmentConfig, |
|||
const char* referenceText, |
|||
Pronunciation_Assessment_Grading_System gradingSystem, |
|||
Pronunciation_Assessment_Granularity granularity, |
|||
bool enableMiscue); |
|||
SPXAPI create_pronunciation_assessment_config_from_json(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE* hPronunciationAssessmentConfig, const char* json); |
|||
SPXAPI_(bool) pronunciation_assessment_config_is_handle_valid(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE hPronunciationAssessmentConfig); |
|||
SPXAPI pronunciation_assessment_config_release(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE hPronunciationAssessmentConfig); |
|||
SPXAPI pronunciation_assessment_config_get_property_bag( |
|||
SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE hPronunciationAssessmentConfig, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI__(const char*) pronunciation_assessment_config_to_json(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE hPronunciationAssessmentConfig); |
|||
SPXAPI pronunciation_assessment_config_apply_to_recognizer(SPXPRONUNCIATIONASSESSMENTCONFIGHANDLE hPronunciationAssessmentConfig, SPXRECOHANDLE hreco); |
|||
@ -0,0 +1,159 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_property_bag.h: Public API declarations for Property Bag related C methods
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI property_bag_create(SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI_(bool) property_bag_is_valid(SPXPROPERTYBAGHANDLE hpropbag); |
|||
SPXAPI property_bag_set_string(SPXPROPERTYBAGHANDLE hpropbag, int id, const char* name, const char* value); |
|||
SPXAPI__(const char*) property_bag_get_string(SPXPROPERTYBAGHANDLE hpropbag, int id, const char* name, const char* defaultValue); |
|||
SPXAPI property_bag_free_string(const char* value); |
|||
SPXAPI property_bag_release(SPXPROPERTYBAGHANDLE hpropbag); |
|||
SPXAPI property_bag_copy(SPXPROPERTYBAGHANDLE hfrom, SPXPROPERTYBAGHANDLE hto); |
|||
|
|||
// NOTE: Currently this enum is duplicated with C++ side,
|
|||
// because SWIG cannot properly resolve conditional compilation.
|
|||
#ifndef __cplusplus |
|||
enum PropertyId |
|||
{ |
|||
SpeechServiceConnection_Key = 1000, |
|||
SpeechServiceConnection_Endpoint = 1001, |
|||
SpeechServiceConnection_Region = 1002, |
|||
SpeechServiceAuthorization_Token = 1003, |
|||
SpeechServiceAuthorization_Type = 1004, |
|||
SpeechServiceConnection_EndpointId = 1005, |
|||
SpeechServiceConnection_Host = 1006, |
|||
|
|||
SpeechServiceConnection_ProxyHostName = 1100, |
|||
SpeechServiceConnection_ProxyPort = 1101, |
|||
SpeechServiceConnection_ProxyUserName = 1102, |
|||
SpeechServiceConnection_ProxyPassword = 1103, |
|||
SpeechServiceConnection_Url = 1104, |
|||
SpeechServiceConnection_ProxyHostBypass = 1105, |
|||
|
|||
SpeechServiceConnection_TranslationToLanguages = 2000, |
|||
SpeechServiceConnection_TranslationVoice = 2001, |
|||
SpeechServiceConnection_TranslationFeatures = 2002, |
|||
SpeechServiceConnection_IntentRegion = 2003, |
|||
|
|||
SpeechServiceConnection_RecoMode = 3000, |
|||
SpeechServiceConnection_RecoLanguage = 3001, |
|||
Speech_SessionId = 3002, |
|||
SpeechServiceConnection_UserDefinedQueryParameters = 3003, |
|||
SpeechServiceConnection_RecoModelBackend = 3004, |
|||
SpeechServiceConnection_RecoModelName = 3005, |
|||
SpeechServiceConnection_RecoModelKey = 3006, |
|||
SpeechServiceConnection_RecoModelIniFile = 3007, |
|||
|
|||
SpeechServiceConnection_SynthLanguage = 3100, |
|||
SpeechServiceConnection_SynthVoice = 3101, |
|||
SpeechServiceConnection_SynthOutputFormat = 3102, |
|||
SpeechServiceConnection_SynthEnableCompressedAudioTransmission = 3103, |
|||
SpeechServiceConnection_SynthBackend = 3110, |
|||
SpeechServiceConnection_SynthOfflineDataPath = 3112, |
|||
SpeechServiceConnection_SynthOfflineVoice = 3113, |
|||
SpeechServiceConnection_SynthModelKey = 3114, |
|||
SpeechServiceConnection_VoicesListEndpoint = 3130, |
|||
|
|||
SpeechServiceConnection_InitialSilenceTimeoutMs = 3200, |
|||
SpeechServiceConnection_EndSilenceTimeoutMs = 3201, |
|||
SpeechServiceConnection_EnableAudioLogging = 3202, |
|||
SpeechServiceConnection_LanguageIdMode = 3205, |
|||
SpeechServiceConnection_TranslationCategoryId = 3206, |
|||
|
|||
SpeechServiceConnection_AutoDetectSourceLanguages = 3300, |
|||
SpeechServiceConnection_AutoDetectSourceLanguageResult = 3301, |
|||
|
|||
SpeechServiceResponse_RequestDetailedResultTrueFalse = 4000, |
|||
SpeechServiceResponse_RequestProfanityFilterTrueFalse = 4001, |
|||
SpeechServiceResponse_ProfanityOption = 4002, |
|||
SpeechServiceResponse_PostProcessingOption = 4003, |
|||
SpeechServiceResponse_RequestWordLevelTimestamps = 4004, |
|||
SpeechServiceResponse_StablePartialResultThreshold = 4005, |
|||
SpeechServiceResponse_OutputFormatOption = 4006, |
|||
SpeechServiceResponse_RequestSnr = 4007, |
|||
|
|||
SpeechServiceResponse_TranslationRequestStablePartialResult = 4100, |
|||
|
|||
SpeechServiceResponse_RequestWordBoundary = 4200, |
|||
SpeechServiceResponse_RequestPunctuationBoundary = 4201, |
|||
SpeechServiceResponse_RequestSentenceBoundary = 4202, |
|||
SpeechServiceResponse_SynthesisEventsSyncToAudio = 4210, |
|||
|
|||
SpeechServiceResponse_JsonResult = 5000, |
|||
SpeechServiceResponse_JsonErrorDetails = 5001, |
|||
SpeechServiceResponse_RecognitionLatencyMs = 5002, |
|||
SpeechServiceResponse_RecognitionBackend = 5003, |
|||
|
|||
SpeechServiceResponse_SynthesisFirstByteLatencyMs = 5010, |
|||
SpeechServiceResponse_SynthesisFinishLatencyMs = 5011, |
|||
SpeechServiceResponse_SynthesisUnderrunTimeMs = 5012, |
|||
SpeechServiceResponse_SynthesisConnectionLatencyMs = 5013, |
|||
SpeechServiceResponse_SynthesisNetworkLatencyMs = 5014, |
|||
SpeechServiceResponse_SynthesisServiceLatencyMs = 5015, |
|||
SpeechServiceResponse_DiarizeIntermediateResults = 5025, |
|||
|
|||
CancellationDetails_Reason = 6000, |
|||
CancellationDetails_ReasonText = 6001, |
|||
CancellationDetails_ReasonDetailedText = 6002, |
|||
|
|||
LanguageUnderstandingServiceResponse_JsonResult = 7000, |
|||
|
|||
AudioConfig_DeviceNameForCapture = 8000, |
|||
AudioConfig_NumberOfChannelsForCapture = 8001, |
|||
AudioConfig_SampleRateForCapture = 8002, |
|||
AudioConfig_BitsPerSampleForCapture = 8003, |
|||
AudioConfig_AudioSource = 8004, |
|||
AudioConfig_DeviceNameForRender = 8005, |
|||
AudioConfig_PlaybackBufferLengthInMs = 8006, |
|||
|
|||
Speech_LogFilename = 9001, |
|||
Speech_SegmentationSilenceTimeoutMs = 9002, |
|||
Speech_SegmentationMaximumTimeMs = 9003, |
|||
Speech_SegmentationMaximumTimeMs = 9004, |
|||
|
|||
Conversation_ApplicationId = 10000, |
|||
Conversation_DialogType = 10001, |
|||
Conversation_Initial_Silence_Timeout = 10002, |
|||
Conversation_From_Id = 10003, |
|||
Conversation_Conversation_Id = 10004, |
|||
Conversation_Custom_Voice_Deployment_Ids = 10005, |
|||
Conversation_Speech_Activity_Template = 10006, |
|||
Conversation_ParticipantId = 10007, |
|||
DataBuffer_TimeStamp = 11001, |
|||
DataBuffer_UserId = 11002, |
|||
|
|||
PronunciationAssessment_ReferenceText = 12001, |
|||
PronunciationAssessment_GradingSystem = 12002, |
|||
PronunciationAssessment_Granularity = 12003, |
|||
PronunciationAssessment_EnableMiscue = 12005, |
|||
PronunciationAssessment_PhonemeAlphabet = 12006, |
|||
PronunciationAssessment_NBestPhonemeCount = 12007, |
|||
PronunciationAssessment_EnableProsodyAssessment = 12008, |
|||
PronunciationAssessment_Json = 12009, |
|||
PronunciationAssessment_Params = 12010, |
|||
PronunciationAssessment_ContentTopic = 12020, |
|||
SpeakerRecognition_Api_Version = 13001, |
|||
|
|||
SpeechTranslation_ModelName = 13100, |
|||
SpeechTranslation_ModelKey = 13101, |
|||
|
|||
KeywordRecognition_ModelName = 13200, |
|||
KeywordRecognition_ModelKey = 13201, |
|||
|
|||
EmbeddedSpeech_EnablePerformanceMetrics = 13300 |
|||
}; |
|||
|
|||
typedef enum _ParticipantChangedReason |
|||
{ |
|||
JoinedConversation, |
|||
LeftConversation, |
|||
Updated |
|||
} ParticipantChangedReason; |
|||
#endif |
|||
|
|||
@ -0,0 +1,66 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_recognizer.h: Public API declarations for Recognizer related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
|
|||
SPXAPI_(bool) recognizer_handle_is_valid(SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_handle_release(SPXRECOHANDLE hreco); |
|||
|
|||
SPXAPI_(bool) recognizer_async_handle_is_valid(SPXASYNCHANDLE hasync); |
|||
SPXAPI recognizer_async_handle_release(SPXASYNCHANDLE hasync); |
|||
|
|||
SPXAPI_(bool) recognizer_result_handle_is_valid(SPXRESULTHANDLE hresult); |
|||
SPXAPI recognizer_result_handle_release(SPXRESULTHANDLE hresult); |
|||
|
|||
SPXAPI_(bool) recognizer_event_handle_is_valid(SPXEVENTHANDLE hevent); |
|||
SPXAPI recognizer_event_handle_release(SPXEVENTHANDLE hevent); |
|||
|
|||
SPXAPI recognizer_get_property_bag(SPXRECOHANDLE hreco, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
SPXAPI recognizer_recognize_once(SPXRECOHANDLE hreco, SPXRESULTHANDLE* phresult); |
|||
SPXAPI recognizer_recognize_once_async(SPXRECOHANDLE hreco, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_recognize_text_once_async(SPXRECOHANDLE hreco, const char* text, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_recognize_once_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds, SPXRESULTHANDLE* phresult); |
|||
|
|||
SPXAPI recognizer_start_continuous_recognition(SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_start_continuous_recognition_async(SPXRECOHANDLE hreco, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_start_continuous_recognition_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
SPXAPI recognizer_stop_continuous_recognition(SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_stop_continuous_recognition_async(SPXRECOHANDLE hreco, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_stop_continuous_recognition_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
SPXAPI recognizer_start_keyword_recognition(SPXRECOHANDLE hreco, SPXKEYWORDHANDLE hkeyword); |
|||
SPXAPI recognizer_start_keyword_recognition_async(SPXRECOHANDLE hreco, SPXKEYWORDHANDLE hkeyword, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_start_keyword_recognition_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
SPXAPI recognizer_recognize_keyword_once(SPXRECOHANDLE hreco, SPXKEYWORDHANDLE hkeyword, SPXRESULTHANDLE* phresult); |
|||
SPXAPI recognizer_recognize_keyword_once_async(SPXRECOHANDLE hreco, SPXKEYWORDHANDLE hkeyword, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_recognize_keyword_once_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds, SPXRESULTHANDLE* phresult); |
|||
|
|||
SPXAPI recognizer_stop_keyword_recognition(SPXRECOHANDLE hreco); |
|||
SPXAPI recognizer_stop_keyword_recognition_async(SPXRECOHANDLE hreco, SPXASYNCHANDLE* phasync); |
|||
SPXAPI recognizer_stop_keyword_recognition_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
typedef void (*PSESSION_CALLBACK_FUNC)(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext); |
|||
SPXAPI recognizer_session_started_set_callback(SPXRECOHANDLE hreco, PSESSION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI recognizer_session_stopped_set_callback(SPXRECOHANDLE hreco, PSESSION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
|
|||
typedef void (*PRECOGNITION_CALLBACK_FUNC)(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext); |
|||
SPXAPI recognizer_recognizing_set_callback(SPXRECOHANDLE hreco, PRECOGNITION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI recognizer_recognized_set_callback(SPXRECOHANDLE hreco, PRECOGNITION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI recognizer_canceled_set_callback(SPXRECOHANDLE hreco, PRECOGNITION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI recognizer_speech_start_detected_set_callback(SPXRECOHANDLE hreco, PRECOGNITION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI recognizer_speech_end_detected_set_callback(SPXRECOHANDLE hreco, PRECOGNITION_CALLBACK_FUNC pCallback, void* pvContext); |
|||
|
|||
SPXAPI recognizer_session_event_get_session_id(SPXEVENTHANDLE hevent, char* pszSessionId, uint32_t cchSessionId); |
|||
SPXAPI recognizer_recognition_event_get_offset(SPXEVENTHANDLE hevent, uint64_t *pszOffset); |
|||
SPXAPI recognizer_recognition_event_get_result(SPXEVENTHANDLE hevent, SPXRESULTHANDLE* phresult); |
|||
|
|||
SPXAPI recognizer_connection_event_get_property_bag(SPXEVENTHANDLE hevent, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,108 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_result.h: Public API declarations for Result related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
enum Result_Reason |
|||
{ |
|||
ResultReason_NoMatch = 0, |
|||
ResultReason_Canceled = 1, |
|||
ResultReason_RecognizingSpeech = 2, |
|||
ResultReason_RecognizedSpeech = 3, |
|||
ResultReason_RecognizingIntent = 4, |
|||
ResultReason_RecognizedIntent = 5, |
|||
ResultReason_TranslatingSpeech = 6, |
|||
ResultReason_TranslatedSpeech = 7, |
|||
ResultReason_SynthesizingAudio = 8, |
|||
ResultReason_SynthesizingAudioComplete = 9, |
|||
ResultReason_RecognizingKeyword = 10, |
|||
ResultReason_RecognizedKeyword = 11, |
|||
ResultReason_SynthesizingAudioStart = 12 |
|||
}; |
|||
typedef enum Result_Reason Result_Reason; |
|||
|
|||
enum Result_CancellationReason |
|||
{ |
|||
CancellationReason_Error = 1, |
|||
CancellationReason_EndOfStream = 2, |
|||
CancellationReason_UserCancelled = 3, |
|||
}; |
|||
|
|||
typedef enum Result_CancellationReason Result_CancellationReason; |
|||
|
|||
enum Result_CancellationErrorCode |
|||
{ |
|||
CancellationErrorCode_NoError = 0, |
|||
CancellationErrorCode_AuthenticationFailure = 1, |
|||
CancellationErrorCode_BadRequest = 2, |
|||
CancellationErrorCode_TooManyRequests = 3, |
|||
CancellationErrorCode_Forbidden = 4, |
|||
CancellationErrorCode_ConnectionFailure = 5, |
|||
CancellationErrorCode_ServiceTimeout = 6, |
|||
CancellationErrorCode_ServiceError = 7, |
|||
CancellationErrorCode_ServiceUnavailable = 8, |
|||
CancellationErrorCode_RuntimeError = 9 |
|||
}; |
|||
typedef enum Result_CancellationErrorCode Result_CancellationErrorCode; |
|||
|
|||
enum Result_NoMatchReason |
|||
{ |
|||
NoMatchReason_NotRecognized = 1, |
|||
NoMatchReason_InitialSilenceTimeout = 2, |
|||
NoMatchReason_InitialBabbleTimeout = 3, |
|||
NoMatchReason_KeywordNotRecognized = 4, |
|||
NoMatchReason_EndSilenceTimeout = 5 |
|||
}; |
|||
typedef enum Result_NoMatchReason Result_NoMatchReason; |
|||
|
|||
enum Synthesis_VoiceType |
|||
{ |
|||
SynthesisVoiceType_OnlineNeural = 1, |
|||
SynthesisVoiceType_OnlineStandard = 2, |
|||
SynthesisVoiceType_OfflineNeural = 3, |
|||
SynthesisVoiceType_OfflineStandard = 4 |
|||
}; |
|||
typedef enum Synthesis_VoiceType Synthesis_VoiceType; |
|||
|
|||
SPXAPI result_get_reason(SPXRESULTHANDLE hresult, Result_Reason* reason); |
|||
SPXAPI result_get_reason_canceled(SPXRESULTHANDLE hresult, Result_CancellationReason* reason); |
|||
SPXAPI result_get_canceled_error_code(SPXRESULTHANDLE hresult, Result_CancellationErrorCode* errorCode); |
|||
SPXAPI result_get_no_match_reason(SPXRESULTHANDLE hresult, Result_NoMatchReason* reason); |
|||
|
|||
SPXAPI result_get_result_id(SPXRESULTHANDLE hresult, char* pszResultId, uint32_t cchResultId); |
|||
|
|||
SPXAPI result_get_text(SPXRESULTHANDLE hresult, char* pszText, uint32_t cchText); |
|||
SPXAPI result_get_offset(SPXRESULTHANDLE hresult, uint64_t* offset); |
|||
SPXAPI result_get_duration(SPXRESULTHANDLE hresult, uint64_t* duration); |
|||
|
|||
SPXAPI result_get_property_bag(SPXRESULTHANDLE hresult, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
SPXAPI synth_result_get_result_id(SPXRESULTHANDLE hresult, char* resultId, uint32_t resultIdLength); |
|||
SPXAPI synth_result_get_reason(SPXRESULTHANDLE hresult, Result_Reason* reason); |
|||
SPXAPI synth_result_get_reason_canceled(SPXRESULTHANDLE hresult, Result_CancellationReason* reason); |
|||
SPXAPI synth_result_get_canceled_error_code(SPXRESULTHANDLE hresult, Result_CancellationErrorCode* errorCode); |
|||
SPXAPI synth_result_get_audio_data(SPXRESULTHANDLE hresult, uint8_t* buffer, uint32_t bufferSize, uint32_t* filledSize); |
|||
SPXAPI synth_result_get_audio_length_duration(SPXRESULTHANDLE hresult, uint32_t* audioLength, uint64_t* audioDuration); |
|||
SPXAPI synth_result_get_audio_format(SPXRESULTHANDLE hresult, SPXAUDIOSTREAMFORMATHANDLE* hformat); |
|||
SPXAPI synth_result_get_property_bag(SPXRESULTHANDLE hresult, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
SPXAPI synthesis_voices_result_get_result_id(SPXRESULTHANDLE hresult, char* resultId, uint32_t resultIdLength); |
|||
SPXAPI synthesis_voices_result_get_reason(SPXRESULTHANDLE hresult, Result_Reason* reason); |
|||
SPXAPI synthesis_voices_result_get_voice_num(SPXRESULTHANDLE hresult, uint32_t* voiceNum); |
|||
SPXAPI synthesis_voices_result_get_voice_info(SPXRESULTHANDLE hresult, uint32_t index, SPXRESULTHANDLE* hVoiceInfo); |
|||
SPXAPI synthesis_voices_result_get_property_bag(SPXRESULTHANDLE hresult, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
SPXAPI voice_info_handle_release(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_name(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_locale(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_short_name(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_local_name(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_style_list(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI__(const char*) voice_info_get_voice_path(SPXRESULTHANDLE hVoiceInfo); |
|||
SPXAPI voice_info_get_voice_type(SPXRESULTHANDLE hVoiceInfo, Synthesis_VoiceType* voiceType); |
|||
SPXAPI voice_info_get_property_bag(SPXRESULTHANDLE hVoiceInfo, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,16 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_session.h: Public API declarations for Session related C methods
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI session_from_recognizer(SPXRECOHANDLE hreco, SPXSESSIONHANDLE* phsession); |
|||
|
|||
SPXAPI_(bool) session_handle_is_valid(SPXSESSIONHANDLE hsession); |
|||
SPXAPI session_handle_release(SPXSESSIONHANDLE hsession); |
|||
|
|||
SPXAPI session_get_property_bag(SPXSESSIONHANDLE hsession, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,13 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI source_lang_config_from_language(SPXSOURCELANGCONFIGHANDLE* hconfig, const char* language); |
|||
SPXAPI source_lang_config_from_language_and_endpointId(SPXSOURCELANGCONFIGHANDLE* hconfig, const char* language, const char* endpointId); |
|||
SPXAPI_(bool) source_lang_config_is_handle_valid(SPXSOURCELANGCONFIGHANDLE hconfig); |
|||
SPXAPI source_lang_config_release(SPXSOURCELANGCONFIGHANDLE hconfig); |
|||
SPXAPI source_lang_config_get_property_bag(SPXSOURCELANGCONFIGHANDLE hconfig, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
@ -0,0 +1,37 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_speaker_recogntion.h: c API declarations for speaker recognition.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI create_voice_profile_client_from_config(SPXVOICEPROFILECLIENTHANDLE* phclient, SPXSPEECHCONFIGHANDLE hSpeechConfig); |
|||
SPXAPI voice_profile_client_release_handle(SPXVOICEPROFILECLIENTHANDLE hVoiceClient); |
|||
SPXAPI create_voice_profile(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, int id, const char* locale, SPXVOICEPROFILEHANDLE* pProfileHandle); |
|||
|
|||
SPXAPI enroll_voice_profile(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, SPXVOICEPROFILEHANDLE hProfileHandle, SPXAUDIOCONFIGHANDLE hAudioInput, SPXRESULTHANDLE* phresult); |
|||
SPXAPI voice_profile_client_get_property_bag(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI create_voice_profile_from_id_and_type(SPXVOICEPROFILEHANDLE* phVoiceProfile, const char* id, int type); |
|||
SPXAPI voice_profile_get_id(SPXVOICEPROFILEHANDLE hVoiceProfile, char* psz, uint32_t* pcch); |
|||
SPXAPI voice_profile_get_type(SPXVOICEPROFILEHANDLE hVoiceProfile, int* ptype); |
|||
SPXAPI voice_profile_release_handle(SPXVOICEPROFILEHANDLE hVoiceProfile); |
|||
SPXAPI voice_profile_get_property_bag(SPXVOICEPROFILEHANDLE voiceprofilehandle, SPXPROPERTYBAGHANDLE* pProperties); |
|||
SPXAPI delete_voice_profile(SPXVOICEPROFILECLIENTHANDLE hclient, SPXVOICEPROFILEHANDLE hProfileHandle, SPXRESULTHANDLE* phresult); |
|||
SPXAPI reset_voice_profile(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, SPXVOICEPROFILEHANDLE hProfileHandle, SPXRESULTHANDLE* phresult); |
|||
SPXAPI get_profiles_json(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, int type, char** ppsz, size_t* pcch); |
|||
SPXAPI retrieve_enrollment_result(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, const char* pId, int type, SPXVOICEPROFILEHANDLE* phVoiceProfile); |
|||
SPXAPI get_activation_phrases(SPXVOICEPROFILECLIENTHANDLE hVoiceProfileClient, const char* pLocale, int type, SPXRESULTHANDLE* phresult); |
|||
SPXAPI recognizer_create_speaker_recognizer_from_config(SPXSPEAKERIDHANDLE* phspeakerid, SPXSPEECHCONFIGHANDLE hspeechconfig, SPXAUDIOCONFIGHANDLE haudioInput); |
|||
SPXAPI speaker_recognizer_release_handle(SPXSPEAKERIDHANDLE phspeakerid); |
|||
SPXAPI speaker_recognizer_get_property_bag(SPXSPEAKERIDHANDLE phspeakerid, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI speaker_identification_model_create(SPXSIMODELHANDLE* psimodel); |
|||
SPXAPI speaker_identification_model_add_profile(SPXSIMODELHANDLE hsimodel, SPXVOICEPROFILEHANDLE hprofile); |
|||
SPXAPI speaker_identification_model_release_handle(SPXSIMODELHANDLE hmodel); |
|||
SPXAPI speaker_recognizer_identify(SPXSPEAKERIDHANDLE phspeakerid, SPXSIMODELHANDLE hsimodel, SPXRESULTHANDLE* phresult); |
|||
SPXAPI speaker_recognizer_verify(SPXSPEAKERIDHANDLE phspeakerid, SPXSVMODELHANDLE hsvmodel, SPXRESULTHANDLE* phresult); |
|||
SPXAPI speaker_verification_model_create(SPXSVMODELHANDLE* psvmodel, SPXVOICEPROFILEHANDLE hprofile); |
|||
SPXAPI speaker_verification_model_release_handle(SPXSVMODELHANDLE hsvmodel); |
|||
@ -0,0 +1,171 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
typedef enum { SpeechOutputFormat_Simple = 0, SpeechOutputFormat_Detailed = 1 } SpeechOutputFormat; |
|||
|
|||
typedef enum |
|||
{ |
|||
// raw-8khz-8bit-mono-mulaw
|
|||
SpeechSynthesisOutputFormat_Raw8Khz8BitMonoMULaw = 1, |
|||
|
|||
// riff-16khz-16kbps-mono-siren
|
|||
// Unsupported by the service. Do not use this value.
|
|||
SpeechSynthesisOutputFormat_Riff16Khz16KbpsMonoSiren = 2, |
|||
|
|||
// audio-16khz-16kbps-mono-siren
|
|||
// Unsupported by the service. Do not use this value.
|
|||
SpeechSynthesisOutputFormat_Audio16Khz16KbpsMonoSiren = 3, |
|||
|
|||
// audio-16khz-32kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio16Khz32KBitRateMonoMp3 = 4, |
|||
|
|||
// audio-16khz-128kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio16Khz128KBitRateMonoMp3 = 5, |
|||
|
|||
// audio-16khz-64kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio16Khz64KBitRateMonoMp3 = 6, |
|||
|
|||
// audio-24khz-48kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio24Khz48KBitRateMonoMp3 = 7, |
|||
|
|||
// audio-24khz-96kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio24Khz96KBitRateMonoMp3 = 8, |
|||
|
|||
// audio-24khz-160kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio24Khz160KBitRateMonoMp3 = 9, |
|||
|
|||
// raw-16khz-16bit-mono-truesilk
|
|||
SpeechSynthesisOutputFormat_Raw16Khz16BitMonoTrueSilk = 10, |
|||
|
|||
// riff-16khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Riff16Khz16BitMonoPcm = 11, |
|||
|
|||
// riff-8khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Riff8Khz16BitMonoPcm = 12, |
|||
|
|||
// riff-24khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Riff24Khz16BitMonoPcm = 13, |
|||
|
|||
// riff-8khz-8bit-mono-mulaw
|
|||
SpeechSynthesisOutputFormat_Riff8Khz8BitMonoMULaw = 14, |
|||
|
|||
// raw-16khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Raw16Khz16BitMonoPcm = 15, |
|||
|
|||
// raw-24khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Raw24Khz16BitMonoPcm = 16, |
|||
|
|||
// raw-8khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Raw8Khz16BitMonoPcm = 17, |
|||
|
|||
// ogg-16khz-16bit-mono-opus
|
|||
SpeechSynthesisOutputFormat_Ogg16khz16BitMonoOpus = 18, |
|||
|
|||
// ogg-24khz-24bit-mono-opus
|
|||
SpeechSynthesisOutputFormat_Ogg24Khz16BitMonoOpus = 19, |
|||
|
|||
// raw-48khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Raw48Khz16BitMonoPcm = 20, |
|||
|
|||
// riff-48khz-16bit-mono-pcm
|
|||
SpeechSynthesisOutputFormat_Riff48Khz16BitMonoPcm = 21, |
|||
|
|||
// audio-48khz-96kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio48Khz96KBitRateMonoMp3 = 22, |
|||
|
|||
// audio-48khz-192kbitrate-mono-mp3
|
|||
SpeechSynthesisOutputFormat_Audio48Khz192KBitRateMonoMp3 = 23, |
|||
|
|||
// ogg-48khz-16bit-mono-opus
|
|||
SpeechSynthesisOutputFormat_Ogg48Khz16BitMonoOpus = 24, |
|||
|
|||
// webm-16khz-16bit-mono-opus
|
|||
SpeechSynthesisOutputFormat_Webm16Khz16BitMonoOpus = 25, |
|||
|
|||
// webm-24khz-16bit-mono-opus
|
|||
SpeechSynthesisOutputFormat_Webm24Khz16BitMonoOpus = 26, |
|||
|
|||
// raw-24khz-16bit-mono-truesilk
|
|||
SpeechSynthesisOutputFormat_Raw24Khz16BitMonoTrueSilk = 27, |
|||
|
|||
// raw-8khz-8bit-mono-alaw
|
|||
SpeechSynthesisOutputFormat_Raw8Khz8BitMonoALaw = 28, |
|||
|
|||
// riff-8khz-8bit-mono-alaw
|
|||
SpeechSynthesisOutputFormat_Riff8Khz8BitMonoALaw = 29, |
|||
|
|||
// webm-24khz-16bit-24kbps-mono-opus
|
|||
// Audio compressed by OPUS codec in a WebM container, with bitrate of 24kbps, optimized for IoT scenario.
|
|||
SpeechSynthesisOutputFormat_Webm24Khz16Bit24KbpsMonoOpus = 30, |
|||
|
|||
// audio-16khz-16bit-32kbps-mono-opus
|
|||
// Audio compressed by OPUS codec without container, with bitrate of 32kbps.
|
|||
SpeechSynthesisOutputFormat_Audio16Khz16Bit32KbpsMonoOpus = 31, |
|||
|
|||
// audio-24khz-48bit-mono-opus
|
|||
// Audio compressed by OPUS codec without container, with bitrate of 48kbps.
|
|||
SpeechSynthesisOutputFormat_Audio24Khz16Bit48KbpsMonoOpus = 32, |
|||
|
|||
// audio-24khz-24bit-mono-opus
|
|||
// Audio compressed by OPUS codec without container, with bitrate of 24kbps.
|
|||
SpeechSynthesisOutputFormat_Audio24Khz16Bit24KbpsMonoOpus = 33, |
|||
|
|||
// raw-22050hz-16bit-mono-pcm
|
|||
// Raw PCM audio at 22050Hz sampling rate and 16-bit depth.
|
|||
SpeechSynthesisOutputFormat_Raw22050Hz16BitMonoPcm = 34, |
|||
|
|||
// riff-22050hz-16bit-mono-pcm
|
|||
// PCM audio at 22050Hz sampling rate and 16-bit depth, with RIFF header.
|
|||
SpeechSynthesisOutputFormat_Riff22050Hz16BitMonoPcm = 35, |
|||
|
|||
// raw-44100hz-16bit-mono-pcm
|
|||
// Raw PCM audio at 44100Hz sampling rate and 16-bit depth.
|
|||
SpeechSynthesisOutputFormat_Raw44100Hz16BitMonoPcm = 36, |
|||
|
|||
// riff-44100hz-16bit-mono-pcm
|
|||
// PCM audio at 44100Hz sampling rate and 16-bit depth, with RIFF header.
|
|||
SpeechSynthesisOutputFormat_Riff44100Hz16BitMonoPcm = 37, |
|||
|
|||
/// amr-wb-16000hz
|
|||
/// AMR-WB audio at 16kHz sampling rate.
|
|||
/// (Added in 1.24.0)
|
|||
SpeechSynthesisOutputFormat_AmrWb16000Hz = 38, |
|||
|
|||
/// g722-16khz-64kbps
|
|||
/// G.722 audio at 16kHz sampling rate and 64kbps bitrate.
|
|||
/// (Added in 1.38.0)
|
|||
SpeechSynthesisOutputFormat_G72216Khz64Kbps = 39, |
|||
} Speech_Synthesis_Output_Format; |
|||
|
|||
typedef enum |
|||
{ |
|||
// Using URI query parameter to pass property settings to service.
|
|||
SpeechConfig_ServicePropertyChannel_UriQueryParameter = 0, |
|||
|
|||
// Using HttpHeader to set a key/value in a HTTP header.
|
|||
SpeechConfig_ServicePropertyChannel_HttpHeader = 1 |
|||
} SpeechConfig_ServicePropertyChannel; |
|||
|
|||
typedef enum |
|||
{ |
|||
SpeechConfig_ProfanityMasked = 0, |
|||
SpeechConfig_ProfanityRemoved = 1, |
|||
SpeechConfig_ProfanityRaw = 2 |
|||
} SpeechConfig_ProfanityOption; |
|||
|
|||
SPXAPI_(bool) speech_config_is_handle_valid(SPXSPEECHCONFIGHANDLE hconfig); |
|||
SPXAPI speech_config_from_subscription(SPXSPEECHCONFIGHANDLE* hconfig, const char* subscription, const char* region); |
|||
SPXAPI speech_config_from_authorization_token(SPXSPEECHCONFIGHANDLE* hconfig, const char* authToken, const char* region); |
|||
SPXAPI speech_config_from_endpoint(SPXSPEECHCONFIGHANDLE * hconfig, const char* endpoint, const char* subscription); |
|||
SPXAPI speech_config_from_host(SPXSPEECHCONFIGHANDLE* hconfig, const char* host, const char* subscription); |
|||
SPXAPI speech_config_release(SPXSPEECHCONFIGHANDLE hconfig); |
|||
SPXAPI speech_config_get_property_bag(SPXSPEECHCONFIGHANDLE hconfig, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
SPXAPI speech_config_set_audio_output_format(SPXSPEECHCONFIGHANDLE hconfig, Speech_Synthesis_Output_Format formatId); |
|||
SPXAPI speech_config_set_service_property(SPXSPEECHCONFIGHANDLE configHandle, const char* propertyName, const char* propertyValue, SpeechConfig_ServicePropertyChannel channel); |
|||
SPXAPI speech_config_set_profanity(SPXSPEECHCONFIGHANDLE configHandle, SpeechConfig_ProfanityOption profanity); |
|||
|
|||
@ -0,0 +1,13 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI speech_recognition_model_handle_release(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_recognition_model_get_name(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_recognition_model_get_locales(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_recognition_model_get_path(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_recognition_model_get_version(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
@ -0,0 +1,16 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI speech_translation_config_from_subscription(SPXSPEECHCONFIGHANDLE* configHandle, const char* subscription, const char* region); |
|||
SPXAPI speech_translation_config_from_authorization_token(SPXSPEECHCONFIGHANDLE* configHandle, const char* authToken, const char* region); |
|||
SPXAPI speech_translation_config_from_endpoint(SPXSPEECHCONFIGHANDLE* configHandle, const char* endpoint, const char* subscription); |
|||
SPXAPI speech_translation_config_from_host(SPXSPEECHCONFIGHANDLE* configHandle, const char* host, const char* subscription); |
|||
|
|||
SPXAPI speech_translation_config_add_target_language(SPXSPEECHCONFIGHANDLE configHandle, const char* language); |
|||
SPXAPI speech_translation_config_remove_target_language(SPXSPEECHCONFIGHANDLE configHandle, const char* language); |
|||
SPXAPI speech_translation_config_set_custom_model_category_id(SPXSPEECHCONFIGHANDLE configHandle, const char* categoryId); |
|||
@ -0,0 +1,14 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI speech_translation_model_handle_release(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_translation_model_get_name(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_translation_model_get_source_languages(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_translation_model_get_target_languages(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_translation_model_get_path(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
SPXAPI__(const char*) speech_translation_model_get_version(SPXSPEECHRECOMODELHANDLE hmodel); |
|||
@ -0,0 +1,17 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI speech_synthesis_request_create(bool textStreamingEnabled, bool isSSML, const char* inputText, uint32_t textLength, SPXREQUESTHANDLE* hrequest); |
|||
SPXAPI speech_synthesis_request_set_voice(SPXREQUESTHANDLE hrequest, const char* voice, const char* personalVoice, const char* modelName); |
|||
SPXAPI speech_synthesis_request_send_text_piece(SPXREQUESTHANDLE hrequest, const char* text, uint32_t textLength); |
|||
SPXAPI speech_synthesis_request_finish(SPXREQUESTHANDLE hrequest); |
|||
SPXAPI speech_synthesis_request_handle_is_valid(SPXREQUESTHANDLE hrequest); |
|||
SPXAPI speech_synthesis_request_release(SPXREQUESTHANDLE hrequest); |
|||
|
|||
SPXAPI speech_synthesis_request_get_property_bag(SPXREQUESTHANDLE hrequest, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
@ -0,0 +1,74 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_synthesizer.h: Public API declarations for Synthesizer related C methods and typedefs
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_connection.h> |
|||
#include <speechapi_c_synthesis_request.h> |
|||
|
|||
|
|||
enum SpeechSynthesis_BoundaryType |
|||
{ |
|||
SpeechSynthesis_BoundaryType_Word = 0, |
|||
SpeechSynthesis_BoundaryType_Punctuation = 1, |
|||
SpeechSynthesis_BoundaryType_Sentence = 2 |
|||
}; |
|||
typedef enum SpeechSynthesis_BoundaryType SpeechSynthesis_BoundaryType; |
|||
|
|||
SPXAPI_(bool) synthesizer_handle_is_valid(SPXSYNTHHANDLE hsynth); |
|||
SPXAPI synthesizer_handle_release(SPXSYNTHHANDLE hsynth); |
|||
|
|||
SPXAPI_(bool) synthesizer_async_handle_is_valid(SPXASYNCHANDLE hasync); |
|||
SPXAPI synthesizer_async_handle_release(SPXASYNCHANDLE hasync); |
|||
|
|||
SPXAPI_(bool) synthesizer_result_handle_is_valid(SPXRESULTHANDLE hresult); |
|||
SPXAPI synthesizer_result_handle_release(SPXRESULTHANDLE hresult); |
|||
|
|||
SPXAPI_(bool) synthesizer_event_handle_is_valid(SPXEVENTHANDLE hevent); |
|||
SPXAPI synthesizer_event_handle_release(SPXEVENTHANDLE hevent); |
|||
|
|||
SPXAPI synthesizer_get_property_bag(SPXSYNTHHANDLE hsynth, SPXPROPERTYBAGHANDLE* hpropbag); |
|||
|
|||
SPXAPI synthesizer_speak_text(SPXSYNTHHANDLE hsynth, const char* text, uint32_t textLength, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_speak_ssml(SPXSYNTHHANDLE hsynth, const char* ssml, uint32_t ssmlLength, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_speak_request(SPXSYNTHHANDLE hsynth, SPXREQUESTHANDLE hrequest, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_speak_text_async(SPXSYNTHHANDLE hsynth, const char* text, uint32_t textLength, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_speak_ssml_async(SPXSYNTHHANDLE hsynth, const char* ssml, uint32_t ssmlLength, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_speak_request_async(SPXSYNTHHANDLE hsynth, SPXREQUESTHANDLE hrequest, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_start_speaking_text(SPXSYNTHHANDLE hsynth, const char* text, uint32_t textLength, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_start_speaking_ssml(SPXSYNTHHANDLE hsynth, const char* ssml, uint32_t ssmlLength, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_start_speaking_request(SPXSYNTHHANDLE hsynth, SPXREQUESTHANDLE hrequest, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_start_speaking_text_async(SPXSYNTHHANDLE hsynth, const char* text, uint32_t textLength, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_start_speaking_ssml_async(SPXSYNTHHANDLE hsynth, const char* ssml, uint32_t ssmlLength, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_speak_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_stop_speaking(SPXSYNTHHANDLE hsynth); |
|||
SPXAPI synthesizer_stop_speaking_async(SPXSYNTHHANDLE hsynth, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_stop_speaking_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds); |
|||
|
|||
SPXAPI synthesizer_get_voices_list(SPXSYNTHHANDLE hsynth, const char* locale, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_get_voices_list_async(SPXSYNTHHANDLE hsynth, const char* locale, SPXASYNCHANDLE* phasync); |
|||
SPXAPI synthesizer_get_voices_list_async_wait_for(SPXASYNCHANDLE hasync, uint32_t milliseconds, SPXRESULTHANDLE* phresult); |
|||
|
|||
typedef void(*PSYNTHESIS_CALLBACK_FUNC)(SPXSYNTHHANDLE hsynth, SPXEVENTHANDLE hevent, void* pvContext); |
|||
SPXAPI synthesizer_started_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_synthesizing_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_completed_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_canceled_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_word_boundary_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_viseme_received_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_bookmark_reached_set_callback(SPXSYNTHHANDLE hsynth, PSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
SPXAPI synthesizer_connection_connected_set_callback(SPXCONNECTIONHANDLE hConnection, CONNECTION_CALLBACK_FUNC pCallback, void * pvContext); |
|||
SPXAPI synthesizer_connection_disconnected_set_callback(SPXCONNECTIONHANDLE hConnection, CONNECTION_CALLBACK_FUNC pCallback, void * pvContext); |
|||
|
|||
SPXAPI synthesizer_synthesis_event_get_result(SPXEVENTHANDLE hevent, SPXRESULTHANDLE* phresult); |
|||
SPXAPI synthesizer_word_boundary_event_get_values(SPXEVENTHANDLE hevent, uint64_t *pAudioOffset, uint64_t *pDuration, |
|||
uint32_t *pTextOffset, uint32_t *pWordLength, SpeechSynthesis_BoundaryType *pBoundaryType); |
|||
SPXAPI synthesizer_event_get_result_id(SPXEVENTHANDLE hEvent, char* resultId, uint32_t resultIdLength); |
|||
SPXAPI__(const char*) synthesizer_event_get_text(SPXEVENTHANDLE hEvent); |
|||
SPXAPI synthesizer_viseme_event_get_values(SPXEVENTHANDLE hevent, uint64_t* pAudioOffset, uint32_t* pVisemeId); |
|||
SPXAPI__(const char*) synthesizer_viseme_event_get_animation(SPXEVENTHANDLE hEvent); |
|||
SPXAPI synthesizer_bookmark_event_get_values(SPXEVENTHANDLE hevent, uint64_t* pAudioOffset); |
|||
@ -0,0 +1,17 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
|
|||
// Todo: Translation recognizer management API.
|
|||
|
|||
typedef void(*PTRANSLATIONSYNTHESIS_CALLBACK_FUNC)(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext); |
|||
SPXAPI translator_synthesizing_audio_set_callback(SPXRECOHANDLE hreco, PTRANSLATIONSYNTHESIS_CALLBACK_FUNC pCallback, void* pvContext); |
|||
|
|||
SPXAPI translator_add_target_language(SPXRECOHANDLE hreco, const char* language); |
|||
SPXAPI translator_remove_target_language(SPXRECOHANDLE hreco, const char* language); |
|||
@ -0,0 +1,14 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI translation_text_result_get_translation_count(SPXRESULTHANDLE handle, size_t * size); |
|||
SPXAPI translation_text_result_get_translation(SPXRESULTHANDLE handle, size_t index, char * language, char * text, size_t * language_size, size_t * text_size); |
|||
|
|||
// audioBuffer: point to the header for storing synthesis audio data. The parameter lengthPointer points to the variable saving the size of buffer. On return, *lengthPointer is set to the size of the buffer returned.
|
|||
// If textBuffer is nullptr or the length is smaller than the size required, the function returns SPXERR_BUFFER_TOO_SMALL.
|
|||
SPXAPI translation_synthesis_result_get_audio_data(SPXRESULTHANDLE handle, uint8_t* audioBuffer, size_t* lengthPointer); |
|||
@ -0,0 +1,13 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_c_user.h: Public API declarations for user related C methods and enumerations
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_c_common.h> |
|||
|
|||
SPXAPI user_create_from_id(const char* user_id, SPXUSERHANDLE* huser); |
|||
SPXAPI user_release_handle(SPXUSERHANDLE huser); |
|||
SPXAPI user_get_id(SPXUSERHANDLE huser, char* user_id, size_t user_id_size); |
|||
@ -0,0 +1,548 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// spxdebug.h: Public API definitions for global C Trace/Debug methods and related #defines
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
//-------------------------------------------------------
|
|||
// Re-enabled ability to compile out all macros...
|
|||
// However, currently still need to keep all macros until
|
|||
// final review of all macros is complete.
|
|||
//-------------------------------------------------------
|
|||
#define SPX_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL 1 |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_INCLUDE_DBG_WITH_ALL |
|||
#if defined(SPX_CONFIG_TRACE_ALL) && !defined(SPX_CONFIG_DBG_TRACE_ALL) && (!defined(DEBUG) || !defined(_DEBUG)) |
|||
#define SPX_CONFIG_DBG_TRACE_ALL 1 |
|||
#endif |
|||
#endif |
|||
|
|||
//-------------------------------------------------------
|
|||
// SPX_ and AZAC_ compatibility section
|
|||
// (must preceed #include <azac_debug.h>)
|
|||
//-------------------------------------------------------
|
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_ALL) && !defined(AZAC_CONFIG_DBG_TRACE_ALL) |
|||
#define AZAC_CONFIG_DBG_TRACE_ALL SPX_CONFIG_DBG_TRACE_ALL |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_ALL) && defined(AZAC_CONFIG_DBG_TRACE_ALL) |
|||
#define SPX_CONFIG_DBG_TRACE_ALL AZAC_CONFIG_DBG_TRACE_ALL |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_VERBOSE) && !defined(AZAC_CONFIG_DBG_TRACE_VERBOSE) |
|||
#define AZAC_CONFIG_DBG_TRACE_VERBOSE SPX_CONFIG_DBG_TRACE_VERBOSE |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_VERBOSE) && defined(AZAC_CONFIG_DBG_TRACE_VERBOSE) |
|||
#define SPX_CONFIG_DBG_TRACE_VERBOSE AZAC_CONFIG_DBG_TRACE_VERBOSE |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_INFO) && !defined(AZAC_CONFIG_DBG_TRACE_INFO) |
|||
#define AZAC_CONFIG_DBG_TRACE_INFO SPX_CONFIG_DBG_TRACE_INFO |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_INFO) && defined(AZAC_CONFIG_DBG_TRACE_INFO) |
|||
#define SPX_CONFIG_DBG_TRACE_INFO AZAC_CONFIG_DBG_TRACE_INFO |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_WARNING) && !defined(AZAC_CONFIG_DBG_TRACE_WARNING) |
|||
#define AZAC_CONFIG_DBG_TRACE_WARNING SPX_CONFIG_DBG_TRACE_WARNING |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_WARNING) && defined(AZAC_CONFIG_DBG_TRACE_WARNING) |
|||
#define SPX_CONFIG_DBG_TRACE_WARNING AZAC_CONFIG_DBG_TRACE_WARNING |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_ERROR) && !defined(AZAC_CONFIG_DBG_TRACE_ERROR) |
|||
#define AZAC_CONFIG_DBG_TRACE_ERROR SPX_CONFIG_DBG_TRACE_ERROR |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_ERROR) && defined(AZAC_CONFIG_DBG_TRACE_ERROR) |
|||
#define SPX_CONFIG_DBG_TRACE_ERROR AZAC_CONFIG_DBG_TRACE_ERROR |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_FUNCTION) && !defined(AZAC_CONFIG_DBG_TRACE_FUNCTION) |
|||
#define AZAC_CONFIG_DBG_TRACE_FUNCTION SPX_CONFIG_DBG_TRACE_FUNCTION |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_FUNCTION) && defined(AZAC_CONFIG_DBG_TRACE_FUNCTION) |
|||
#define SPX_CONFIG_DBG_TRACE_FUNCTION AZAC_CONFIG_DBG_TRACE_FUNCTION |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_SCOPE) && !defined(AZAC_CONFIG_DBG_TRACE_SCOPE) |
|||
#define AZAC_CONFIG_DBG_TRACE_SCOPE SPX_CONFIG_DBG_TRACE_SCOPE |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_SCOPE) && defined(AZAC_CONFIG_DBG_TRACE_SCOPE) |
|||
#define SPX_CONFIG_DBG_TRACE_SCOPE AZAC_CONFIG_DBG_TRACE_SCOPE |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_ASSERT) && !defined(AZAC_CONFIG_DBG_TRACE_ASSERT) |
|||
#define AZAC_CONFIG_DBG_TRACE_ASSERT SPX_CONFIG_DBG_TRACE_ASSERT |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_ASSERT) && defined(AZAC_CONFIG_DBG_TRACE_ASSERT) |
|||
#define SPX_CONFIG_DBG_TRACE_ASSERT AZAC_CONFIG_DBG_TRACE_ASSERT |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_VERIFY) && !defined(AZAC_CONFIG_DBG_TRACE_VERIFY) |
|||
#define AZAC_CONFIG_DBG_TRACE_VERIFY SPX_CONFIG_DBG_TRACE_VERIFY |
|||
#elif !defined(SPX_CONFIG_DBG_TRACE_VERIFY) && defined(AZAC_CONFIG_DBG_TRACE_VERIFY) |
|||
#define SPX_CONFIG_DBG_TRACE_VERIFY AZAC_CONFIG_DBG_TRACE_VERIFY |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_ALL) && !defined(AZAC_CONFIG_TRACE_ALL) |
|||
#define AZAC_CONFIG_TRACE_ALL SPX_CONFIG_TRACE_ALL |
|||
#elif !defined(SPX_CONFIG_TRACE_ALL) && defined(AZAC_CONFIG_TRACE_ALL) |
|||
#define SPX_CONFIG_TRACE_ALL AZAC_CONFIG_TRACE_ALL |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_VERBOSE) && !defined(AZAC_CONFIG_TRACE_VERBOSE) |
|||
#define AZAC_CONFIG_TRACE_VERBOSE SPX_CONFIG_TRACE_VERBOSE |
|||
#elif !defined(SPX_CONFIG_TRACE_VERBOSE) && defined(AZAC_CONFIG_TRACE_VERBOSE) |
|||
#define SPX_CONFIG_TRACE_VERBOSE AZAC_CONFIG_TRACE_VERBOSE |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_INFO) && !defined(AZAC_CONFIG_TRACE_INFO) |
|||
#define AZAC_CONFIG_TRACE_INFO SPX_CONFIG_TRACE_INFO |
|||
#elif !defined(SPX_CONFIG_TRACE_INFO) && defined(AZAC_CONFIG_TRACE_INFO) |
|||
#define SPX_CONFIG_TRACE_INFO AZAC_CONFIG_TRACE_INFO |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_WARNING) && !defined(AZAC_CONFIG_TRACE_WARNING) |
|||
#define AZAC_CONFIG_TRACE_WARNING SPX_CONFIG_TRACE_WARNING |
|||
#elif !defined(SPX_CONFIG_TRACE_WARNING) && defined(AZAC_CONFIG_TRACE_WARNING) |
|||
#define SPX_CONFIG_TRACE_WARNING AZAC_CONFIG_TRACE_WARNING |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_ERROR) && !defined(AZAC_CONFIG_TRACE_ERROR) |
|||
#define AZAC_CONFIG_TRACE_ERROR SPX_CONFIG_TRACE_ERROR |
|||
#elif !defined(SPX_CONFIG_TRACE_ERROR) && defined(AZAC_CONFIG_TRACE_ERROR) |
|||
#define SPX_CONFIG_TRACE_ERROR AZAC_CONFIG_TRACE_ERROR |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_FUNCTION) && !defined(AZAC_CONFIG_TRACE_FUNCTION) |
|||
#define AZAC_CONFIG_TRACE_FUNCTION SPX_CONFIG_TRACE_FUNCTION |
|||
#elif !defined(SPX_CONFIG_TRACE_FUNCTION) && defined(AZAC_CONFIG_TRACE_FUNCTION) |
|||
#define SPX_CONFIG_TRACE_FUNCTION AZAC_CONFIG_TRACE_FUNCTION |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_SCOPE) && !defined(AZAC_CONFIG_TRACE_SCOPE) |
|||
#define AZAC_CONFIG_TRACE_SCOPE SPX_CONFIG_TRACE_SCOPE |
|||
#elif !defined(SPX_CONFIG_TRACE_SCOPE) && defined(AZAC_CONFIG_TRACE_SCOPE) |
|||
#define SPX_CONFIG_TRACE_SCOPE AZAC_CONFIG_TRACE_SCOPE |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_THROW_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_THROW_ON_FAIL) |
|||
#define AZAC_CONFIG_TRACE_THROW_ON_FAIL SPX_CONFIG_TRACE_THROW_ON_FAIL |
|||
#elif !defined(SPX_CONFIG_TRACE_THROW_ON_FAIL) && defined(AZAC_CONFIG_TRACE_THROW_ON_FAIL) |
|||
#define SPX_CONFIG_TRACE_THROW_ON_FAIL AZAC_CONFIG_TRACE_THROW_ON_FAIL |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_REPORT_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_REPORT_ON_FAIL) |
|||
#define AZAC_CONFIG_TRACE_REPORT_ON_FAIL SPX_CONFIG_TRACE_REPORT_ON_FAIL |
|||
#elif !defined(SPX_CONFIG_TRACE_REPORT_ON_FAIL) && defined(AZAC_CONFIG_TRACE_REPORT_ON_FAIL) |
|||
#define SPX_CONFIG_TRACE_REPORT_ON_FAIL AZAC_CONFIG_TRACE_REPORT_ON_FAIL |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_RETURN_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_RETURN_ON_FAIL) |
|||
#define AZAC_CONFIG_TRACE_RETURN_ON_FAIL SPX_CONFIG_TRACE_RETURN_ON_FAIL |
|||
#elif !defined(SPX_CONFIG_TRACE_RETURN_ON_FAIL) && defined(AZAC_CONFIG_TRACE_RETURN_ON_FAIL) |
|||
#define SPX_CONFIG_TRACE_RETURN_ON_FAIL AZAC_CONFIG_TRACE_RETURN_ON_FAIL |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_TRACE_EXITFN_ON_FAIL) && !defined(AZAC_CONFIG_TRACE_EXITFN_ON_FAIL) |
|||
#define AZAC_CONFIG_TRACE_EXITFN_ON_FAIL SPX_CONFIG_TRACE_EXITFN_ON_FAIL |
|||
#elif !defined(SPX_CONFIG_TRACE_EXITFN_ON_FAIL) && defined(AZAC_CONFIG_TRACE_EXITFN_ON_FAIL) |
|||
#define SPX_CONFIG_TRACE_EXITFN_ON_FAIL AZAC_CONFIG_TRACE_EXITFN_ON_FAIL |
|||
#endif |
|||
|
|||
#if !defined(__AZAC_THROW_HR_IMPL) && defined(__SPX_THROW_HR_IMPL) |
|||
#define __AZAC_THROW_HR_IMPL __SPX_THROW_HR_IMPL |
|||
#elif !defined(__SPX_THROW_HR_IMPL) && defined(__AZAC_THROW_HR_IMPL) |
|||
#define __SPX_THROW_HR_IMPL __AZAC_THROW_HR_IMPL |
|||
#elif !defined(__AZAC_THROW_HR_IMPL) && !defined(__SPX_THROW_HR_IMPL) |
|||
#define __AZAC_THROW_HR_IMPL __azac_rethrow |
|||
#define __SPX_THROW_HR_IMPL __azac_rethrow |
|||
#else |
|||
#error Both __AZAC_THROW_HR_IMPL and __SPX_THROW_HR_IMPL cannot be defined at the same time |
|||
#endif |
|||
|
|||
//-------------------------------------------------------
|
|||
// SPX_ and SPX_DBG_ macro configuration
|
|||
//-------------------------------------------------------
|
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_ALL |
|||
#define SPX_CONFIG_DBG_TRACE_VERBOSE 1 |
|||
#define SPX_CONFIG_DBG_TRACE_INFO 1 |
|||
#define SPX_CONFIG_DBG_TRACE_WARNING 1 |
|||
#define SPX_CONFIG_DBG_TRACE_ERROR 1 |
|||
#define SPX_CONFIG_DBG_TRACE_FUNCTION 1 |
|||
#define SPX_CONFIG_DBG_TRACE_SCOPE 1 |
|||
#define SPX_CONFIG_DBG_TRACE_ASSERT 1 |
|||
#define SPX_CONFIG_DBG_TRACE_VERIFY 1 |
|||
#ifndef SPX_CONFIG_TRACE_ALL |
|||
#define SPX_CONFIG_TRACE_ALL 1 |
|||
#endif |
|||
#endif // SPX_CONFIG_DBG_TRACE_ALL
|
|||
|
|||
#ifdef SPX_CONFIG_TRACE_ALL |
|||
#define SPX_CONFIG_TRACE_VERBOSE 1 |
|||
#define SPX_CONFIG_TRACE_INFO 1 |
|||
#define SPX_CONFIG_TRACE_WARNING 1 |
|||
#define SPX_CONFIG_TRACE_ERROR 1 |
|||
#define SPX_CONFIG_TRACE_FUNCTION 1 |
|||
#define SPX_CONFIG_TRACE_SCOPE 1 |
|||
#define SPX_CONFIG_TRACE_THROW_ON_FAIL 1 |
|||
#define SPX_CONFIG_TRACE_REPORT_ON_FAIL 1 |
|||
#define SPX_CONFIG_TRACE_RETURN_ON_FAIL 1 |
|||
#define SPX_CONFIG_TRACE_EXITFN_ON_FAIL 1 |
|||
#endif // SPX_CONFIG_TRACE_ALL
|
|||
|
|||
//-------------------------------------------------------
|
|||
// #include section ...
|
|||
// (must come after everything above)
|
|||
//-------------------------------------------------------
|
|||
|
|||
#include <azac_debug.h> |
|||
#include <inttypes.h> |
|||
#include <spxerror.h> |
|||
|
|||
#ifndef _MSC_VER |
|||
// macros in this header generate a bunch of
|
|||
// "ISO C++11 requires at least one argument for the "..." in a variadic macro" errors.
|
|||
// system_header pragma is the only mechanism that helps to suppress them.
|
|||
// https://stackoverflow.com/questions/35587137/how-to-suppress-gcc-variadic-macro-argument-warning-for-zero-arguments-for-a-par
|
|||
// TODO: try to make macros standard-compliant.
|
|||
#pragma GCC system_header |
|||
#endif |
|||
|
|||
//-----------------------------------------------------------
|
|||
// SPX_TRACE macro common implementations
|
|||
//-----------------------------------------------------------
|
|||
|
|||
#define __SPX_TRACE_LEVEL_INFO __AZAC_TRACE_LEVEL_INFO // Trace_Info
|
|||
#define __SPX_TRACE_LEVEL_WARNING __AZAC_TRACE_LEVEL_WARNING // Trace_Warning
|
|||
#define __SPX_TRACE_LEVEL_ERROR __AZAC_TRACE_LEVEL_ERROR // Trace_Error
|
|||
#define __SPX_TRACE_LEVEL_VERBOSE __AZAC_TRACE_LEVEL_VERBOSE // Trace_Verbose
|
|||
|
|||
#ifndef __SPX_DO_TRACE_IMPL |
|||
#define __SPX_DO_TRACE_IMPL __AZAC_DO_TRACE_IMPL |
|||
#endif |
|||
|
|||
#define __SPX_DOTRACE(level, title, fileName, lineNumber, ...) \ |
|||
__AZAC_DOTRACE(level, title, fileName, lineNumber, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_INFO(title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_INFO(title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_INFO_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_INFO_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_WARNING(title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_WARNING(title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_WARNING_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_WARNING_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_ERROR(title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_ERROR(title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_ERROR_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_ERROR_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_VERBOSE(title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_VERBOSE(title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_TRACE_VERBOSE_IF(cond, title, fileName, lineNumber, msg, ...) \ |
|||
__AZAC_TRACE_VERBOSE_IF(cond, title, fileName, lineNumber, msg, ##__VA_ARGS__) |
|||
|
|||
#define ___SPX_EXPR_AS_STRING(_String) \ |
|||
___AZAC_EXPR_AS_STRING(_String) |
|||
|
|||
#define __SPX_EXPR_AS_STRING(_String) \ |
|||
__AZAC_EXPR_AS_STRING(_String) |
|||
|
|||
#define __SPX_TRACE_HR(title, fileName, lineNumber, hr, x) \ |
|||
__AZAC_TRACE_HR(title, fileName, lineNumber, hr, x) |
|||
|
|||
#define __SPX_REPORT_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
__AZAC_REPORT_ON_FAIL(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_REPORT_ON_FAIL_IFNOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
__AZAC_REPORT_ON_FAIL_IFNOT(title, fileName, lineNumber, hr, hrNot) |
|||
|
|||
#define __SPX_T_RETURN_HR(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_RETURN_HR(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_T_RETURN_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
__AZAC_T_RETURN_HR_IF(title, fileName, lineNumber, hr, cond) |
|||
|
|||
#define __SPX_T_RETURN_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_RETURN_ON_FAIL(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_T_RETURN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
__AZAC_T_RETURN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) |
|||
|
|||
#define __SPX_RETURN_HR(hr) \ |
|||
__AZAC_RETURN_HR(hr) |
|||
|
|||
#define __SPX_RETURN_HR_IF(hr, cond) \ |
|||
__AZAC_RETURN_HR_IF(hr, cond) |
|||
|
|||
#define __SPX_RETURN_ON_FAIL(hr) \ |
|||
__AZAC_RETURN_ON_FAIL(hr) |
|||
|
|||
#define __SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
__AZAC_RETURN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#define SPX_EXITFN_CLEANUP AZAC_EXITFN_CLEANUP |
|||
|
|||
#define __SPX_T_EXITFN_HR(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_EXITFN_HR(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_T_EXITFN_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
__AZAC_T_EXITFN_HR_IF(title, fileName, lineNumber, hr, cond) |
|||
|
|||
#define __SPX_T_EXITFN_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_EXITFN_ON_FAIL(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_T_EXITFN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
__AZAC_T_EXITFN_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) |
|||
|
|||
#define __SPX_EXITFN_HR(hr) \ |
|||
__AZAC_EXITFN_HR(hr) |
|||
|
|||
#define __SPX_EXITFN_HR_IF(hr, cond) \ |
|||
__AZAC_EXITFN_HR_IF(hr, cond) |
|||
|
|||
#define __SPX_EXITFN_ON_FAIL(hr) \ |
|||
__AZAC_EXITFN_ON_FAIL(hr) |
|||
|
|||
#define __SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
__AZAC_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#define __SPX_TRACE_ASSERT(title, fileName, lineNumber, expr) \ |
|||
__AZAC_TRACE_ASSERT(title, fileName, lineNumber, expr) |
|||
|
|||
#define __SPX_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ...) \ |
|||
__AZAC_TRACE_ASSERT_MSG(title, fileName, lineNumber, expr, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_DBG_ASSERT(title, fileName, lineNumber, expr) \ |
|||
__AZAC_DBG_ASSERT(title, fileName, lineNumber, expr) |
|||
|
|||
#define __SPX_DBG_ASSERT_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \ |
|||
__AZAC_DBG_ASSERT_WITH_MESSAGE(title, fileName, lineNumber, expr, ##__VA_ARGS__) |
|||
|
|||
#define __SPX_DBG_VERIFY(title, fileName, lineNumber, expr) \ |
|||
__AZAC_DBG_VERIFY(title, fileName, lineNumber, expr) |
|||
|
|||
#define __SPX_DBG_VERIFY_WITH_MESSAGE(title, fileName, lineNumber, expr, ...) \ |
|||
__AZAC_DBG_VERIFY_WITH_MESSAGE(title, fileName, lineNumber, expr, ##__VA_ARGS__) |
|||
|
|||
#ifdef __cplusplus |
|||
|
|||
#define __SPX_TRACE_SCOPE(t1, fileName, lineNumber, t2, x, y) \ |
|||
__AZAC_TRACE_SCOPE(t1, fileName, lineNumber, t2, x, y) |
|||
|
|||
#ifndef __SPX_THROW_HR |
|||
#define __SPX_THROW_HR(hr) __SPX_THROW_HR_IMPL(hr) |
|||
#endif |
|||
|
|||
#define __SPX_T_THROW_ON_FAIL(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_THROW_ON_FAIL(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_T_THROW_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) \ |
|||
__AZAC_T_THROW_ON_FAIL_IF_NOT(title, fileName, lineNumber, hr, hrNot) |
|||
|
|||
#define __SPX_T_THROW_HR_IF(title, fileName, lineNumber, hr, cond) \ |
|||
__AZAC_T_THROW_HR_IF(title, fileName, lineNumber, hr, cond) |
|||
|
|||
#define __SPX_T_THROW_HR(title, fileName, lineNumber, hr) \ |
|||
__AZAC_T_THROW_HR(title, fileName, lineNumber, hr) |
|||
|
|||
#define __SPX_THROW_ON_FAIL(hr) \ |
|||
__AZAC_THROW_ON_FAIL(hr) |
|||
|
|||
#define __SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) \ |
|||
__AZAC_THROW_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#define __SPX_THROW_HR_IF(hr, cond) \ |
|||
__AZAC_THROW_HR_IF(hr, cond) |
|||
|
|||
#endif // __cplusplus
|
|||
|
|||
|
|||
//-------------------------------------------------------
|
|||
// SPX_ macro definitions
|
|||
//-------------------------------------------------------
|
|||
|
|||
#ifdef SPX_CONFIG_TRACE_VERBOSE |
|||
#define SPX_TRACE_VERBOSE(msg, ...) __SPX_TRACE_VERBOSE("SPX_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_TRACE_VERBOSE_IF(cond, msg, ...) __SPX_TRACE_VERBOSE_IF(cond, "SPX_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_TRACE_VERBOSE(...) |
|||
#define SPX_TRACE_VERBOSE_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_VERBOSE |
|||
#define SPX_DBG_TRACE_VERBOSE(msg, ...) __SPX_TRACE_VERBOSE("SPX_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_DBG_TRACE_VERBOSE_IF(cond, msg, ...) __SPX_TRACE_VERBOSE_IF(cond, "SPX_DBG_TRACE_VERBOSE: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_TRACE_VERBOSE(...) |
|||
#define SPX_DBG_TRACE_VERBOSE_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_INFO |
|||
#define SPX_TRACE_INFO(msg, ...) __SPX_TRACE_INFO("SPX_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_TRACE_INFO_IF(cond, msg, ...) __SPX_TRACE_INFO_IF(cond, "SPX_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_TRACE_INFO(...) |
|||
#define SPX_TRACE_INFO_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_INFO |
|||
#define SPX_DBG_TRACE_INFO(msg, ...) __SPX_TRACE_INFO("SPX_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_DBG_TRACE_INFO_IF(cond, msg, ...) __SPX_TRACE_INFO_IF(cond, "SPX_DBG_TRACE_INFO: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_TRACE_INFO(...) |
|||
#define SPX_DBG_TRACE_INFO_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_WARNING |
|||
#define SPX_TRACE_WARNING(msg, ...) __SPX_TRACE_WARNING("SPX_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_TRACE_WARNING_IF(cond, msg, ...) __SPX_TRACE_WARNING_IF(cond, "SPX_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_TRACE_WARNING(...) |
|||
#define SPX_TRACE_WARNING_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_WARNING |
|||
#define SPX_DBG_TRACE_WARNING(msg, ...) __SPX_TRACE_WARNING("SPX_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_DBG_TRACE_WARNING_IF(cond, msg, ...) __SPX_TRACE_WARNING_IF(cond, "SPX_DBG_TRACE_WARNING:", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_TRACE_WARNING(...) |
|||
#define SPX_DBG_TRACE_WARNING_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_ERROR |
|||
#define SPX_TRACE_ERROR(msg, ...) __SPX_TRACE_ERROR("SPX_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_TRACE_ERROR_IF(cond, msg, ...) __SPX_TRACE_ERROR_IF(cond, "SPX_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_TRACE_ERROR(...) |
|||
#define SPX_TRACE_ERROR_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_ERROR |
|||
#define SPX_DBG_TRACE_ERROR(msg, ...) __SPX_TRACE_ERROR("SPX_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#define SPX_DBG_TRACE_ERROR_IF(cond, msg, ...) __SPX_TRACE_ERROR_IF(cond, "SPX_DBG_TRACE_ERROR: ", __FILE__, __LINE__, msg, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_TRACE_ERROR(...) |
|||
#define SPX_DBG_TRACE_ERROR_IF(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_FUNCTION |
|||
#define SPX_TRACE_FUNCTION(...) __SPX_TRACE_VERBOSE("SPX_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__) |
|||
#else |
|||
#define SPX_TRACE_FUNCTION(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_FUNCTION |
|||
#define SPX_DBG_TRACE_FUNCTION(...) __SPX_TRACE_VERBOSE("SPX_DBG_TRACE_FUNCTION: ", __FILE__, __LINE__, __FUNCTION__) |
|||
#else |
|||
#define SPX_DBG_TRACE_FUNCTION(...) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_REPORT_ON_FAIL |
|||
#define SPX_REPORT_ON_FAIL(hr) __SPX_REPORT_ON_FAIL("SPX_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_REPORT_ON_FAIL_IFNOT(hr, hrNot) __SPX_REPORT_ON_FAIL_IFNOT("SPX_REPORT_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define SPX_REPORT_ON_FAIL(hr) UNUSED(hr) |
|||
#define SPX_REPORT_ON_FAIL_IFNOT(hr, hrNot) UNUSED(hr); UNUSED(hrNot) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_RETURN_ON_FAIL |
|||
#define SPX_RETURN_HR(hr) __SPX_T_RETURN_HR("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_RETURN_HR_IF(hr, cond) __SPX_T_RETURN_HR_IF("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, cond) |
|||
#define SPX_RETURN_ON_FAIL(hr) __SPX_T_RETURN_ON_FAIL("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_RETURN_ON_FAIL_IF_NOT("SPX_RETURN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define SPX_RETURN_HR(hr) __SPX_RETURN_HR(hr) |
|||
#define SPX_RETURN_HR_IF(hr, cond) __SPX_RETURN_HR_IF(hr, cond) |
|||
#define SPX_RETURN_ON_FAIL(hr) __SPX_RETURN_ON_FAIL(hr) |
|||
#define SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#endif |
|||
|
|||
#define SPX_IFTRUE_RETURN_HR(cond, hr) SPX_RETURN_HR_IF(hr, cond) |
|||
#define SPX_IFFALSE_RETURN_HR(cond, hr) SPX_RETURN_HR_IF(hr, !(cond)) |
|||
#define SPX_IFFAILED_RETURN_HR(hr) SPX_RETURN_ON_FAIL(hr) |
|||
#define SPX_IFFAILED_RETURN_HR_IFNOT(hr, hrNot) SPX_RETURN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_EXITFN_ON_FAIL |
|||
#define SPX_EXITFN_HR(hr) __SPX_T_EXITFN_HR("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_EXITFN_HR_IF(hr, cond) __SPX_T_EXITFN_HR_IF("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, cond) |
|||
#define SPX_EXITFN_ON_FAIL(hr) __SPX_T_EXITFN_ON_FAIL("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_EXITFN_ON_FAIL_IF_NOT("SPX_EXITFN_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#else |
|||
#define SPX_EXITFN_HR(hr) __SPX_EXITFN_HR(hr) |
|||
#define SPX_EXITFN_HR_IF(hr, cond) __SPX_EXITFN_HR_IF(hr, cond) |
|||
#define SPX_EXITFN_ON_FAIL(hr) __SPX_EXITFN_ON_FAIL(hr) |
|||
#define SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) __SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#endif |
|||
|
|||
#define SPX_IFTRUE_EXITFN_WHR(cond, hr) SPX_EXITFN_HR_IF(hr, cond) |
|||
#define SPX_IFFALSE_EXITFN_WHR(cond, hr) SPX_EXITFN_HR_IF(hr, !(cond)) |
|||
#define SPX_IFFAILED_EXITFN_WHR(hr) SPX_EXITFN_ON_FAIL(hr) |
|||
#define SPX_IFFAILED_EXITFN_WHR_IFNOT(hr, hrNot) SPX_EXITFN_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#define SPX_IFTRUE_EXITFN_CLEANUP(cond, expr) AZAC_IFTRUE_EXITFN_CLEANUP(cond, expr) |
|||
#define SPX_IFFALSE_EXITFN_CLEANUP(cond, expr) AZAC_IFFALSE_EXITFN_CLEANUP(cond, expr) |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_ASSERT) && (defined(DEBUG) || defined(_DEBUG)) |
|||
#define SPX_DBG_ASSERT(expr) __SPX_DBG_ASSERT("SPX_ASSERT: ", __FILE__, __LINE__, expr) |
|||
#define SPX_DBG_ASSERT_WITH_MESSAGE(expr, ...) __SPX_DBG_ASSERT_WITH_MESSAGE("SPX_ASSERT: ", __FILE__, __LINE__, expr, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_ASSERT(expr) |
|||
#define SPX_DBG_ASSERT_WITH_MESSAGE(expr, ...) |
|||
#endif |
|||
|
|||
#if defined(SPX_CONFIG_DBG_TRACE_VERIFY) && (defined(DEBUG) || defined(_DEBUG)) |
|||
#define SPX_DBG_VERIFY(expr) __SPX_DBG_VERIFY("SPX_VERIFY: ", __FILE__, __LINE__, expr) |
|||
#define SPX_DBG_VERIFY_WITH_MESSAGE(expr, ...) __SPX_DBG_VERIFY_WITH_MESSAGE("SPX_VERIFY: ", __FILE__, __LINE__, expr, ##__VA_ARGS__) |
|||
#else |
|||
#define SPX_DBG_VERIFY(expr) (expr) |
|||
#define SPX_DBG_VERIFY_WITH_MESSAGE(expr, ...) (expr) |
|||
#endif |
|||
|
|||
#define SPX_IFTRUE(cond, expr) AZAC_IFTRUE(cond, expr) |
|||
#define SPX_IFFALSE(cond, expr) AZAC_IFFALSE(cond, expr) |
|||
|
|||
#ifdef __cplusplus |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_SCOPE |
|||
#define SPX_TRACE_SCOPE(x, y) __SPX_TRACE_SCOPE("SPX_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "SPX_TRACE_SCOPE_EXIT: ", x, y) |
|||
#else |
|||
#define SPX_TRACE_SCOPE(x, y) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_DBG_TRACE_SCOPE |
|||
#define SPX_DBG_TRACE_SCOPE(x, y) __SPX_TRACE_SCOPE("SPX_DBG_TRACE_SCOPE_ENTER: ", __FILE__, __LINE__, "SPX_DBG_TRACE_SCOPE_EXIT: ", x, y) |
|||
#else |
|||
#define SPX_DBG_TRACE_SCOPE(x, y) |
|||
#endif |
|||
|
|||
#ifdef SPX_CONFIG_TRACE_THROW_ON_FAIL |
|||
#define SPX_THROW_ON_FAIL(hr) __SPX_T_THROW_ON_FAIL("SPX_THROW_ON_FAIL: ", __FILE__, __LINE__, hr) |
|||
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) __SPX_T_THROW_ON_FAIL_IF_NOT("SPX_THROW_ON_FAIL: ", __FILE__, __LINE__, hr, hrNot) |
|||
#define SPX_THROW_HR_IF(hr, cond) __SPX_T_THROW_HR_IF("SPX_THROW_HR_IF: ", __FILE__, __LINE__, hr, cond) |
|||
#define SPX_THROW_HR(hr) __SPX_T_THROW_HR("SPX_THROW_HR: ", __FILE__, __LINE__, hr) |
|||
#else |
|||
#define SPX_THROW_ON_FAIL(hr) __SPX_THROW_ON_FAIL(hr) |
|||
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) __SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) |
|||
#define SPX_THROW_HR_IF(hr, cond) __SPX_THROW_HR_IF(hr, cond) |
|||
#define SPX_THROW_HR(hr) __SPX_THROW_HR(hr) |
|||
#endif |
|||
|
|||
#define SPX_IFFAILED_THROW_HR(hr) SPX_THROW_ON_FAIL(hr) |
|||
#define SPX_IFFAILED_THROW_HR_IFNOT(hr, hrNot) SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) |
|||
|
|||
#else // __cplusplus
|
|||
|
|||
#define SPX_TRACE_SCOPE(x, y) static_assert(false) |
|||
#define SPX_DBG_TRACE_SCOPE(x, y) static_assert(false) |
|||
#define SPX_THROW_ON_FAIL(hr) static_assert(false) |
|||
#define SPX_THROW_ON_FAIL_IF_NOT(hr, hrNot) static_assert(false) |
|||
#define SPX_THROW_HR_IF(hr, cond) static_assert(false) |
|||
#define SPX_THROW_HR(hr) static_assert(false) |
|||
#define SPX_IFFAILED_THROW_HR(hr) static_assert(false) |
|||
#define SPX_IFFAILED_THROW_HR_IFNOT(hr, hrNot) static_assert(false) |
|||
|
|||
#endif // __cplusplus
|
|||
@ -0,0 +1,449 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <azac_error.h> // must include after spxdebug.h or speechapi*.h (can NOT be included before) |
|||
|
|||
#define SPXHR AZACHR |
|||
#define SPX_NOERROR AZAC_ERR_NONE |
|||
#define SPX_INIT_HR(hr) AZAC_INIT_HR(hr) |
|||
#define SPX_SUCCEEDED(x) AZAC_SUCCEEDED(x) |
|||
#define SPX_FAILED(x) AZAC_FAILED(x) |
|||
#define __SPX_ERRCODE_FAILED(x) __AZAC_ERRCODE_FAILED(x) |
|||
|
|||
/// <summary>
|
|||
/// The function is not implemented.
|
|||
/// </summary>
|
|||
#define SPXERR_NOT_IMPL \ |
|||
AZAC_ERR_NOT_IMPL |
|||
|
|||
/// <summary>
|
|||
/// The object has not been properly initialized.
|
|||
/// </summary>
|
|||
#define SPXERR_UNINITIALIZED \ |
|||
AZAC_ERR_UNINITIALIZED |
|||
|
|||
/// <summary>
|
|||
/// The object has already been initialized.
|
|||
/// </summary>
|
|||
#define SPXERR_ALREADY_INITIALIZED \ |
|||
AZAC_ERR_ALREADY_INITIALIZED |
|||
|
|||
/// <summary>
|
|||
/// An unhandled exception was detected.
|
|||
/// </summary>
|
|||
#define SPXERR_UNHANDLED_EXCEPTION \ |
|||
AZAC_ERR_UNHANDLED_EXCEPTION |
|||
|
|||
/// <summary>
|
|||
/// The object or property was not found.
|
|||
/// </summary>
|
|||
#define SPXERR_NOT_FOUND \ |
|||
AZAC_ERR_NOT_FOUND |
|||
|
|||
/// <summary>
|
|||
/// One or more arguments are not valid.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_ARG \ |
|||
AZAC_ERR_INVALID_ARG |
|||
|
|||
/// <summary>
|
|||
/// The specified timeout value has elapsed.
|
|||
/// </summary>
|
|||
#define SPXERR_TIMEOUT \ |
|||
AZAC_ERR_TIMEOUT |
|||
|
|||
/// <summary>
|
|||
/// The asynchronous operation is already in progress.
|
|||
/// </summary>
|
|||
#define SPXERR_ALREADY_IN_PROGRESS \ |
|||
AZAC_ERR_ALREADY_IN_PROGRESS |
|||
|
|||
/// <summary>
|
|||
/// The attempt to open the file failed.
|
|||
/// </summary>
|
|||
#define SPXERR_FILE_OPEN_FAILED \ |
|||
AZAC_ERR_FILE_OPEN_FAILED |
|||
|
|||
/// <summary>
|
|||
/// The end of the file was reached unexpectedly.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_EOF \ |
|||
AZAC_ERR_UNEXPECTED_EOF |
|||
|
|||
/// <summary>
|
|||
/// Invalid audio header encountered.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_HEADER \ |
|||
AZAC_ERR_INVALID_HEADER |
|||
|
|||
/// <summary>
|
|||
/// The requested operation cannot be performed while audio is pumping
|
|||
/// </summary>
|
|||
#define SPXERR_AUDIO_IS_PUMPING \ |
|||
AZAC_ERR_AUDIO_IS_PUMPING |
|||
|
|||
/// <summary>
|
|||
/// Unsupported audio format.
|
|||
/// </summary>
|
|||
#define SPXERR_UNSUPPORTED_FORMAT \ |
|||
AZAC_ERR_UNSUPPORTED_FORMAT |
|||
|
|||
/// <summary>
|
|||
/// Operation aborted.
|
|||
/// </summary>
|
|||
#define SPXERR_ABORT \ |
|||
AZAC_ERR_ABORT |
|||
|
|||
/// <summary>
|
|||
/// Microphone is not available.
|
|||
/// </summary>
|
|||
#define SPXERR_MIC_NOT_AVAILABLE \ |
|||
AZAC_ERR_MIC_NOT_AVAILABLE |
|||
|
|||
/// <summary>
|
|||
/// An invalid state was encountered.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_STATE \ |
|||
AZAC_ERR_INVALID_STATE |
|||
|
|||
/// <summary>
|
|||
/// Attempting to create a UUID failed.
|
|||
/// </summary>
|
|||
#define SPXERR_UUID_CREATE_FAILED \ |
|||
AZAC_ERR_UUID_CREATE_FAILED |
|||
|
|||
/// <summary>
|
|||
/// An unexpected session state transition was encountered when setting the session audio format.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Valid transitions are:
|
|||
/// * WaitForPumpSetFormatStart --> ProcessingAudio (at the beginning of stream)
|
|||
/// * StoppingPump --> WaitForAdapterCompletedSetFormatStop (at the end of stream)
|
|||
/// * ProcessingAudio --> WaitForAdapterCompletedSetFormatStop (when the stream runs out of data)
|
|||
/// All other state transitions are invalid.
|
|||
/// </remarks>
|
|||
#define SPXERR_SETFORMAT_UNEXPECTED_STATE_TRANSITION \ |
|||
AZAC_ERR_SETFORMAT_UNEXPECTED_STATE_TRANSITION |
|||
|
|||
/// <summary>
|
|||
/// An unexpected session state was encountered in while processing audio.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Valid states to encounter are:
|
|||
/// * ProcessingAudio: We're allowed to process audio while in this state.
|
|||
/// * StoppingPump: We're allowed to be called to process audio, but we'll ignore the data passed in while we're attempting to stop the pump.
|
|||
/// All other states are invalid while processing audio.
|
|||
/// </remarks>
|
|||
#define SPXERR_PROCESS_AUDIO_INVALID_STATE \ |
|||
AZAC_ERR_PROCESS_AUDIO_INVALID_STATE |
|||
|
|||
/// <summary>
|
|||
/// An unexpected state transition was encountered while attempting to start recognizing.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// A valid transition is:
|
|||
/// * Idle --> WaitForPumpSetFormatStart
|
|||
/// All other state transitions are invalid when attempting to start recognizing
|
|||
/// </remarks>
|
|||
#define SPXERR_START_RECOGNIZING_INVALID_STATE_TRANSITION \ |
|||
AZAC_ERR_START_RECOGNIZING_INVALID_STATE_TRANSITION |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to create an internal object.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_CREATE_OBJECT_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_CREATE_OBJECT_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// An error in the audio-capturing system.
|
|||
/// </summary>
|
|||
#define SPXERR_MIC_ERROR \ |
|||
AZAC_ERR_MIC_ERROR |
|||
|
|||
/// <summary>
|
|||
/// The requested operation cannot be performed; there is no audio input.
|
|||
/// </summary>
|
|||
#define SPXERR_NO_AUDIO_INPUT \ |
|||
AZAC_ERR_NO_AUDIO_INPUT |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the USP site.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_USP_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_USP_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the LuAdapterSite site.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_LU_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_LU_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// The buffer is too small.
|
|||
/// </summary>
|
|||
#define SPXERR_BUFFER_TOO_SMALL \ |
|||
AZAC_ERR_BUFFER_TOO_SMALL |
|||
|
|||
/// <summary>
|
|||
/// A method failed to allocate memory.
|
|||
/// </summary>
|
|||
#define SPXERR_OUT_OF_MEMORY \ |
|||
AZAC_ERR_OUT_OF_MEMORY |
|||
|
|||
/// <summary>
|
|||
/// An unexpected runtime error occurred.
|
|||
/// </summary>
|
|||
#define SPXERR_RUNTIME_ERROR \ |
|||
AZAC_ERR_RUNTIME_ERROR |
|||
|
|||
/// <summary>
|
|||
/// The url specified is invalid.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_URL \ |
|||
AZAC_ERR_INVALID_URL |
|||
|
|||
/// <summary>
|
|||
/// The region specified is invalid or missing.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_REGION \ |
|||
AZAC_ERR_INVALID_REGION |
|||
|
|||
/// <summary>
|
|||
/// Switch between single shot and continuous recognition is not supported.
|
|||
/// </summary>
|
|||
#define SPXERR_SWITCH_MODE_NOT_ALLOWED \ |
|||
AZAC_ERR_SWITCH_MODE_NOT_ALLOWED |
|||
|
|||
/// <summary>
|
|||
/// Changing connection status is not supported in the current recognition state.
|
|||
/// </summary>
|
|||
#define SPXERR_CHANGE_CONNECTION_STATUS_NOT_ALLOWED \ |
|||
AZAC_ERR_CHANGE_CONNECTION_STATUS_NOT_ALLOWED |
|||
|
|||
/// <summary>
|
|||
/// Explicit connection management is not supported by the specified recognizer.
|
|||
/// </summary>
|
|||
#define SPXERR_EXPLICIT_CONNECTION_NOT_SUPPORTED_BY_RECOGNIZER \ |
|||
AZAC_ERR_EXPLICIT_CONNECTION_NOT_SUPPORTED_BY_RECOGNIZER |
|||
|
|||
/// <summary>
|
|||
/// The handle is invalid.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_HANDLE \ |
|||
AZAC_ERR_INVALID_HANDLE |
|||
|
|||
/// <summary>
|
|||
/// The recognizer is invalid.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_RECOGNIZER \ |
|||
AZAC_ERR_INVALID_RECOGNIZER |
|||
|
|||
/// <summary>
|
|||
/// The value is out of range.
|
|||
/// Added in version 1.3.0.
|
|||
/// </summary>
|
|||
#define SPXERR_OUT_OF_RANGE \ |
|||
AZAC_ERR_OUT_OF_RANGE |
|||
|
|||
/// <summary>
|
|||
/// Extension library not found.
|
|||
/// Added in version 1.3.0.
|
|||
/// </summary>
|
|||
#define SPXERR_EXTENSION_LIBRARY_NOT_FOUND \ |
|||
AZAC_ERR_EXTENSION_LIBRARY_NOT_FOUND |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the TTS engine site.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_TTS_ENGINE_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_TTS_ENGINE_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the audio output stream.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_AUDIO_OUTPUT_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_AUDIO_OUTPUT_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// Gstreamer internal error.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define SPXERR_GSTREAMER_INTERNAL_ERROR \ |
|||
AZAC_ERR_GSTREAMER_INTERNAL_ERROR |
|||
|
|||
/// <summary>
|
|||
/// Compressed container format not supported.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define SPXERR_CONTAINER_FORMAT_NOT_SUPPORTED_ERROR \ |
|||
AZAC_ERR_CONTAINER_FORMAT_NOT_SUPPORTED_ERROR |
|||
|
|||
/// <summary>
|
|||
/// Codec extension or gstreamer not found.
|
|||
/// Added in version 1.4.0.
|
|||
/// </summary>
|
|||
#define SPXERR_GSTREAMER_NOT_FOUND_ERROR \ |
|||
AZAC_ERR_GSTREAMER_NOT_FOUND_ERROR |
|||
|
|||
/// <summary>
|
|||
/// The language specified is missing.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_LANGUAGE \ |
|||
AZAC_ERR_INVALID_LANGUAGE |
|||
|
|||
/// <summary>
|
|||
/// The API is not applicable.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define SPXERR_UNSUPPORTED_API_ERROR \ |
|||
AZAC_ERR_UNSUPPORTED_API_ERROR |
|||
|
|||
/// <summary>
|
|||
/// The ring buffer is unavailable.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define SPXERR_RINGBUFFER_DATA_UNAVAILABLE \ |
|||
AZAC_ERR_RINGBUFFER_DATA_UNAVAILABLE |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Conversation site.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_CONVERSATION_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_CONVERSATION_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Conversation site.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_CONVERSATION_TRANSLATOR_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_CONVERSATION_TRANSLATOR_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// An asynchronous operation was canceled before it was executed.
|
|||
/// Added in version 1.8.0.
|
|||
/// </summary>
|
|||
#define SPXERR_CANCELED \ |
|||
AZAC_ERR_CANCELED |
|||
|
|||
/// <summary>
|
|||
/// Codec for compression could not be initialized.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
#define SPXERR_COMPRESS_AUDIO_CODEC_INITIFAILED \ |
|||
AZAC_ERR_COMPRESS_AUDIO_CODEC_INITIFAILED |
|||
|
|||
/// <summary>
|
|||
/// Data not available.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
#define SPXERR_DATA_NOT_AVAILABLE \ |
|||
AZAC_ERR_DATA_NOT_AVAILABLE |
|||
|
|||
/// <summary>
|
|||
/// Invalid result reason.
|
|||
/// Added in version 1.12.0
|
|||
/// </summary>
|
|||
#define SPXERR_INVALID_RESULT_REASON \ |
|||
AZAC_ERR_INVALID_RESULT_REASON |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the RNN-T site.
|
|||
/// </summary>
|
|||
#define SPXERR_UNEXPECTED_RNNT_SITE_FAILURE \ |
|||
AZAC_ERR_UNEXPECTED_RNNT_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// Sending of a network message failed.
|
|||
/// </summary>
|
|||
#define SPXERR_NETWORK_SEND_FAILED \ |
|||
AZAC_ERR_NETWORK_SEND_FAILED |
|||
|
|||
/// <summary>
|
|||
/// Audio extension library not found.
|
|||
/// Added in version 1.16.0.
|
|||
/// </summary>
|
|||
#define SPXERR_AUDIO_SYS_LIBRARY_NOT_FOUND \ |
|||
AZAC_ERR_AUDIO_SYS_LIBRARY_NOT_FOUND |
|||
|
|||
/// <summary>
|
|||
/// An error in the audio-rendering system.
|
|||
/// Added in version 1.20.0
|
|||
/// </summary>
|
|||
#define SPXERR_LOUDSPEAKER_ERROR \ |
|||
AZAC_ERR_LOUDSPEAKER_ERROR |
|||
|
|||
/// <summary>
|
|||
/// An unexpected error was encountered when trying to access the Vision site.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_VISION_SITE_FAILURE \ |
|||
AZAC_ERR_VISION_SITE_FAILURE |
|||
|
|||
/// <summary>
|
|||
/// Stream number provided was invalid in the current context.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_INVALID_STREAM \ |
|||
AZAC_ERR_MEDIA_INVALID_STREAM |
|||
|
|||
/// <summary>
|
|||
/// Offset required is invalid in the current context.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_INVALID_OFFSET \ |
|||
AZAC_ERR_MEDIA_INVALID_OFFSET |
|||
|
|||
/// <summary>
|
|||
/// No more data is available in source.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_NO_MORE_DATA \ |
|||
AZAC_ERR_MEDIA_NO_MORE_DATA |
|||
|
|||
/// <summary>
|
|||
/// Source has not been started.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_NOT_STARTED \ |
|||
AZAC_ERR_MEDIA_NOT_STARTED |
|||
|
|||
/// <summary>
|
|||
/// Source has already been started.
|
|||
/// Added in version 1.15.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_ALREADY_STARTED \ |
|||
AZAC_ERR_MEDIA_ALREADY_STARTED |
|||
|
|||
/// <summary>
|
|||
/// Media device creation failed.
|
|||
/// Added in version 1.18.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_DEVICE_CREATION_FAILED \ |
|||
AZAC_ERR_MEDIA_DEVICE_CREATION_FAILED |
|||
|
|||
/// <summary>
|
|||
/// No devices of the selected category are available.
|
|||
/// Added in version 1.18.0.
|
|||
/// </summary>
|
|||
#define SPXERR_MEDIA_NO_DEVICE_AVAILABLE \ |
|||
AZAC_ERR_MEDIA_NO_DEVICE_AVAILABLE |
|||
|
|||
/// <summary>
|
|||
/// Enabled Voice Activity Detection while using keyword recognition is not allowed.
|
|||
/// </summary>
|
|||
#define SPXERR_VAD_COULD_NOT_USE_WITH_KEYWORD_RECOGNIZER \ |
|||
AZAC_ERR_VAD_COULD_NOT_USE_WITH_KEYWORD_RECOGNIZER |
|||
|
|||
/// <summary>
|
|||
/// The specified RecoEngineAdapter could not be created.
|
|||
/// </summary>
|
|||
#define SPXERR_COULD_NOT_CREATE_ENGINE_ADAPTER \ |
|||
AZAC_ERR_COULD_NOT_CREATE_ENGINE_ADAPTER |
|||
@ -0,0 +1,9 @@ |
|||
cmake_minimum_required(VERSION 3.19) |
|||
|
|||
project(cxx_headers) |
|||
|
|||
set(SRC_DIR "${PROJECT_SOURCE_DIR}") |
|||
add_library(${PROJECT_NAME} INTERFACE ${SPEECH_CXX_API_HEADERS}) |
|||
target_include_directories(${PROJECT_NAME} INTERFACE ${PROJECT_SOURCE_DIR}) |
|||
target_link_libraries(${PROJECT_NAME} INTERFACE c_headers) |
|||
set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER api) |
|||
@ -0,0 +1,82 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/azai/license202106 for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
// TODO: TFS#3671215 - Vision: C/C++ azac_api* files are in shared include directory, speech and vision share
|
|||
|
|||
#include <azac_api_c_common.h> |
|||
#include <azac_api_c_error.h> |
|||
#include <azac_debug.h> |
|||
#include <azac_error.h> |
|||
#include <functional> |
|||
#include <stdexcept> |
|||
#include <string> |
|||
|
|||
#define AZAC_DISABLE_COPY_AND_MOVE(T) \ |
|||
/** \brief Disable copy constructor */ \ |
|||
T(const T&) = delete; \ |
|||
/** \brief Disable copy assignment */ \ |
|||
T& operator=(const T&) = delete; \ |
|||
/** \brief Disable move constructor */ \ |
|||
T(T&&) = delete; \ |
|||
/** \brief Disable move assignment */ \ |
|||
T& operator=(T&&) = delete |
|||
|
|||
#define AZAC_DISABLE_DEFAULT_CTORS(T) \ |
|||
/** \brief Disable default constructor */ \ |
|||
T() = delete; \ |
|||
AZAC_DISABLE_COPY_AND_MOVE(T) |
|||
|
|||
#if defined(__GNUG__) && defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID__) |
|||
#include <cxxabi.h> |
|||
#define SHOULD_HANDLE_FORCED_UNWIND 1 |
|||
#endif |
|||
|
|||
/*! \cond INTERNAL */ |
|||
|
|||
namespace Azure { |
|||
namespace AI { |
|||
namespace Core { |
|||
namespace _detail { |
|||
|
|||
template <class T> |
|||
class ProtectedAccess : public T |
|||
{ |
|||
public: |
|||
|
|||
static AZAC_HANDLE HandleFromPtr(T* ptr) { |
|||
if (ptr == nullptr) |
|||
{ |
|||
return nullptr; |
|||
} |
|||
auto access = static_cast<ProtectedAccess*>(ptr); |
|||
return (AZAC_HANDLE)(*access); |
|||
} |
|||
|
|||
static AZAC_HANDLE HandleFromConstPtr(const T* ptr) { |
|||
if (ptr == nullptr) |
|||
{ |
|||
return nullptr; |
|||
} |
|||
auto access = static_cast<const ProtectedAccess*>(ptr); |
|||
return (AZAC_HANDLE)(*access); |
|||
} |
|||
|
|||
template<typename... Args> |
|||
static std::shared_ptr<T> FromHandle(AZAC_HANDLE handle, Args... extras) { |
|||
return T::FromHandle(handle, extras...); |
|||
} |
|||
|
|||
template<typename... Args> |
|||
static std::shared_ptr<T> Create(Args&&... args) { |
|||
return T::Create(std::forward<Args&&>(args)...); |
|||
} |
|||
|
|||
}; |
|||
|
|||
} } } } // Azure::AI::Core::Details
|
|||
|
|||
/*! \endcond */ |
|||
@ -0,0 +1,117 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx.h: Master include header for public C++ API declarations
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
|
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_audio_stream_format.h> |
|||
#include <speechapi_cxx_audio_stream.h> |
|||
#include <speechapi_cxx_speech_config.h> |
|||
#include <speechapi_cxx_embedded_speech_config.h> |
|||
#include <speechapi_cxx_hybrid_speech_config.h> |
|||
#include <speechapi_cxx_audio_config.h> |
|||
#include <speechapi_cxx_audio_processing_options.h> |
|||
|
|||
#include <speechapi_cxx_eventargs.h> |
|||
#include <speechapi_cxx_eventsignal.h> |
|||
|
|||
#include <speechapi_cxx_session_eventargs.h> |
|||
|
|||
#include <speechapi_cxx_recognition_result.h> |
|||
#include <speechapi_cxx_recognition_eventargs.h> |
|||
#include <speechapi_cxx_recognition_async_recognizer.h> |
|||
#include <speechapi_cxx_recognition_base_async_recognizer.h> |
|||
|
|||
#include <speechapi_cxx_recognizer.h> |
|||
|
|||
#include <speechapi_cxx_speech_recognition_result.h> |
|||
#include <speechapi_cxx_speech_recognition_eventargs.h> |
|||
#include <speechapi_cxx_speech_recognizer.h> |
|||
#include <speechapi_cxx_speech_recognition_model.h> |
|||
|
|||
#include <speechapi_cxx_conversational_language_understanding_model.h> |
|||
#include <speechapi_cxx_intent_recognition_result.h> |
|||
#include <speechapi_cxx_intent_recognition_eventargs.h> |
|||
#include <speechapi_cxx_intent_recognizer.h> |
|||
#include <speechapi_cxx_intent_trigger.h> |
|||
#include <speechapi_cxx_language_understanding_model.h> |
|||
#include <speechapi_cxx_pattern_matching_model.h> |
|||
#include <speechapi_cxx_pattern_matching_intent.h> |
|||
|
|||
#include <speechapi_cxx_translation_result.h> |
|||
#include <speechapi_cxx_translation_eventargs.h> |
|||
#include <speechapi_cxx_speech_translation_config.h> |
|||
#include <speechapi_cxx_translation_recognizer.h> |
|||
#include <speechapi_cxx_auto_detect_source_lang_config.h> |
|||
#include <speechapi_cxx_source_lang_config.h> |
|||
#include <speechapi_cxx_speech_translation_model.h> |
|||
|
|||
#include <speechapi_cxx_pronunciation_assessment_config.h> |
|||
#include <speechapi_cxx_pronunciation_assessment_result.h> |
|||
|
|||
#include <speechapi_cxx_grammar.h> |
|||
#include <speechapi_cxx_grammar_phrase.h> |
|||
#include <speechapi_cxx_phrase_list_grammar.h> |
|||
#include <speechapi_cxx_grammar_list.h> |
|||
#include <speechapi_cxx_class_language_model.h> |
|||
|
|||
#include <speechapi_cxx_session.h> |
|||
|
|||
#include <speechapi_cxx_dialog_service_connector.h> |
|||
|
|||
#include <speechapi_cxx_connection.h> |
|||
#include <speechapi_cxx_connection_eventargs.h> |
|||
|
|||
#include <speechapi_cxx_audio_data_stream.h> |
|||
|
|||
#include <speechapi_cxx_speech_synthesis_request.h> |
|||
#include <speechapi_cxx_speech_synthesis_result.h> |
|||
#include <speechapi_cxx_speech_synthesis_eventargs.h> |
|||
#include <speechapi_cxx_speech_synthesis_word_boundary_eventargs.h> |
|||
#include <speechapi_cxx_speech_synthesis_viseme_eventargs.h> |
|||
#include <speechapi_cxx_speech_synthesis_bookmark_eventargs.h> |
|||
#include <speechapi_cxx_speech_synthesizer.h> |
|||
#include <speechapi_cxx_synthesis_voices_result.h> |
|||
#include <speechapi_cxx_voice_info.h> |
|||
|
|||
#include <speechapi_cxx_keyword_recognition_result.h> |
|||
#include <speechapi_cxx_keyword_recognition_eventargs.h> |
|||
#include <speechapi_cxx_keyword_recognizer.h> |
|||
|
|||
#include <speechapi_cxx_conversation.h> |
|||
#include <speechapi_cxx_conversation_transcriber.h> |
|||
#include <speechapi_cxx_conversation_transcription_eventargs.h> |
|||
#include <speechapi_cxx_conversation_transcription_result.h> |
|||
#include <speechapi_cxx_meeting.h> |
|||
#include <speechapi_cxx_meeting_transcriber.h> |
|||
#include <speechapi_cxx_meeting_transcription_eventargs.h> |
|||
#include <speechapi_cxx_meeting_transcription_result.h> |
|||
#include <speechapi_cxx_user.h> |
|||
#include <speechapi_cxx_participant.h> |
|||
#include <speechapi_cxx_conversation_translator.h> |
|||
#include <speechapi_cxx_conversation_translator_events.h> |
|||
|
|||
#include <speechapi_cxx_auto_detect_source_lang_result.h> |
|||
|
|||
#include <speechapi_cxx_source_language_recognizer.h> |
|||
#include <speechapi_cxx_speaker_recognizer.h> |
|||
#include <speechapi_cxx_speaker_verification_model.h> |
|||
#include <speechapi_cxx_speaker_identification_model.h> |
|||
#include <speechapi_cxx_voice_profile_client.h> |
|||
#include <speechapi_cxx_voice_profile.h> |
|||
#include <speechapi_cxx_voice_profile_result.h> |
|||
#include <speechapi_cxx_voice_profile_enrollment_result.h> |
|||
#include <speechapi_cxx_voice_profile_phrase_result.h> |
|||
#include <speechapi_cxx_speaker_recognition_result.h> |
|||
|
|||
#include <speechapi_cxx_file_logger.h> |
|||
#include <speechapi_cxx_event_logger.h> |
|||
#include <speechapi_cxx_memory_logger.h> |
|||
@ -0,0 +1,338 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_audio_config.h: Public API declarations for AudioConfig C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <functional> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_cxx_audio_stream.h> |
|||
#include <speechapi_cxx_audio_processing_options.h> |
|||
#include <speechapi_c_audio_config.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Audio { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents audio input or output configuration. Audio input can be from a microphone, file,
|
|||
/// or input stream. Audio output can be to a speaker, audio file output in WAV format, or output
|
|||
/// stream.
|
|||
/// </summary>
|
|||
class AudioConfig |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOCONFIGHANDLE() const { return m_haudioConfig.get(); } |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the default microphone on the system.
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromDefaultMicrophoneInput() |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_default_microphone(&haudioConfig)); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the default microphone on the system.
|
|||
/// </summary>
|
|||
/// <param name="audioProcessingOptions">Audio processing options.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromDefaultMicrophoneInput(std::shared_ptr<AudioProcessingOptions> audioProcessingOptions) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, audioProcessingOptions == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_default_microphone(&haudioConfig)); |
|||
SPX_THROW_ON_FAIL(audio_config_set_audio_processing_options(haudioConfig, static_cast<SPXAUDIOPROCESSINGOPTIONSHANDLE>(*audioProcessingOptions.get()))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing a specific microphone on the system.
|
|||
/// Added in version 1.3.0.
|
|||
/// </summary>
|
|||
/// <param name="deviceName">Specifies the device name. Please refer to <a href="https://aka.ms/csspeech/microphone-selection">this page</a> on how to retrieve platform-specific microphone names.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromMicrophoneInput(const SPXSTRING& deviceName) |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_a_microphone(&haudioConfig, Utils::ToUTF8(deviceName).c_str())); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing a specific microphone on the system.
|
|||
/// </summary>
|
|||
/// <param name="deviceName">Specifies the device name. Please refer to <a href="https://aka.ms/csspeech/microphone-selection">this page</a> on how to retrieve platform-specific microphone names.</param>
|
|||
/// <param name="audioProcessingOptions">Audio processing options.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromMicrophoneInput(const SPXSTRING& deviceName, std::shared_ptr<AudioProcessingOptions> audioProcessingOptions) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, audioProcessingOptions == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_a_microphone(&haudioConfig, Utils::ToUTF8(deviceName).c_str())); |
|||
SPX_THROW_ON_FAIL(audio_config_set_audio_processing_options(haudioConfig, static_cast<SPXAUDIOPROCESSINGOPTIONSHANDLE>(*audioProcessingOptions.get()))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified file.
|
|||
/// </summary>
|
|||
/// <param name="fileName">Specifies the audio input file.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromWavFileInput(const SPXSTRING& fileName) |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_wav_file_name(&haudioConfig, Utils::ToUTF8(fileName).c_str())); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified file.
|
|||
/// </summary>
|
|||
/// <param name="fileName">Specifies the audio input file.</param>
|
|||
/// <param name="audioProcessingOptions">Audio processing options.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromWavFileInput(const SPXSTRING& fileName, std::shared_ptr<AudioProcessingOptions> audioProcessingOptions) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, audioProcessingOptions == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_wav_file_name(&haudioConfig, Utils::ToUTF8(fileName).c_str())); |
|||
SPX_THROW_ON_FAIL(audio_config_set_audio_processing_options(haudioConfig, static_cast<SPXAUDIOPROCESSINGOPTIONSHANDLE>(*audioProcessingOptions.get()))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified stream.
|
|||
/// </summary>
|
|||
/// <param name="stream">Specifies the custom audio input stream.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromStreamInput(std::shared_ptr<AudioInputStream> stream) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, stream == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_stream(&haudioConfig, GetStreamHandle(stream))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified stream.
|
|||
/// </summary>
|
|||
/// <param name="stream">Specifies the custom audio input stream.</param>
|
|||
/// <param name="audioProcessingOptions">Audio processing options.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromStreamInput(std::shared_ptr<AudioInputStream> stream, std::shared_ptr<AudioProcessingOptions> audioProcessingOptions) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, stream == nullptr); |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, audioProcessingOptions == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_input_from_stream(&haudioConfig, GetStreamHandle(stream))); |
|||
SPX_THROW_ON_FAIL(audio_config_set_audio_processing_options(haudioConfig, static_cast<SPXAUDIOPROCESSINGOPTIONSHANDLE>(*audioProcessingOptions.get()))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the default audio output device (speaker) on the system.
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromDefaultSpeakerOutput() |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_output_from_default_speaker(&haudioConfig)); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing a specific speaker on the system.
|
|||
/// Added in version 1.14.0.
|
|||
/// </summary>
|
|||
/// <param name="deviceName">Specifies the device name. Please refer to <a href="https://aka.ms/csspeech/microphone-selection">this page</a> on how to retrieve platform-specific audio device names.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromSpeakerOutput(const SPXSTRING& deviceName) |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_output_from_a_speaker(&haudioConfig, Utils::ToUTF8(deviceName).c_str())); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified file for audio output.
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
/// <param name="fileName">Specifies the audio output file. The parent directory must already exist.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromWavFileOutput(const SPXSTRING& fileName) |
|||
{ |
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_output_from_wav_file_name(&haudioConfig, Utils::ToUTF8(fileName).c_str())); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an AudioConfig object representing the specified output stream.
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
/// <param name="stream">Specifies the custom audio output stream.</param>
|
|||
/// <returns>A shared pointer to the AudioConfig object</returns>
|
|||
static std::shared_ptr<AudioConfig> FromStreamOutput(std::shared_ptr<AudioOutputStream> stream) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, stream == nullptr); |
|||
|
|||
SPXAUDIOCONFIGHANDLE haudioConfig = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_create_audio_output_from_stream(&haudioConfig, GetOutputStreamHandle(stream))); |
|||
|
|||
auto config = new AudioConfig(haudioConfig); |
|||
config->m_outputStream = stream; |
|||
return std::shared_ptr<AudioConfig>(config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The property name.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(const SPXSTRING& name, const SPXSTRING& value) |
|||
{ |
|||
property_bag_set_string(m_propertybag, -1, Utils::ToUTF8(name).c_str(), Utils::ToUTF8(value).c_str()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The property id.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(PropertyId id, const SPXSTRING& value) |
|||
{ |
|||
property_bag_set_string(m_propertybag, static_cast<int>(id), nullptr, Utils::ToUTF8(value).c_str()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The parameter name.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(const SPXSTRING& name) const |
|||
{ |
|||
const char* value = property_bag_get_string(m_propertybag, -1, Utils::ToUTF8(name).c_str(), ""); |
|||
return Utils::ToSPXString(Utils::CopyAndFreePropertyString(value)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The parameter id.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(PropertyId id) const |
|||
{ |
|||
const char* value = property_bag_get_string(m_propertybag, static_cast<int>(id), nullptr, ""); |
|||
return Utils::ToSPXString(Utils::CopyAndFreePropertyString(value)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets an instance of AudioProcessingOptions class which contains the parameters for audio processing used by Speech SDK.
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to the AudioProcessingOptions object.</returns>
|
|||
std::shared_ptr<AudioProcessingOptions> GetAudioProcessingOptions() const |
|||
{ |
|||
SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_config_get_audio_processing_options(m_haudioConfig, &hoptions)); |
|||
|
|||
return std::make_shared<AudioProcessingOptions>(hoptions); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructs the object.
|
|||
/// </summary>
|
|||
virtual ~AudioConfig() |
|||
{ |
|||
property_bag_release(m_propertybag); |
|||
} |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AudioConfig(SPXAUDIOCONFIGHANDLE haudioConfig) |
|||
: m_haudioConfig(haudioConfig) |
|||
{ |
|||
SPX_THROW_ON_FAIL(audio_config_get_property_bag(m_haudioConfig, &m_propertybag)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal helper method to get the audio stream format handle.
|
|||
/// </summary>
|
|||
static SPXAUDIOSTREAMHANDLE GetStreamHandle(std::shared_ptr<AudioInputStream> stream) { return (SPXAUDIOSTREAMHANDLE)(*stream.get()); } |
|||
|
|||
/// <summary>
|
|||
/// Internal helper method to get the audio output stream format handle.
|
|||
/// </summary>
|
|||
static SPXAUDIOSTREAMHANDLE GetOutputStreamHandle(std::shared_ptr<AudioOutputStream> stream) { return (SPXAUDIOSTREAMHANDLE)(*stream.get()); } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(AudioConfig); |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOCONFIGHANDLE, &audio_config_release> m_haudioConfig; |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the properties of the audio config
|
|||
/// </summary>
|
|||
SPXPROPERTYBAGHANDLE m_propertybag; |
|||
|
|||
std::shared_ptr<AudioInputStream> m_stream; |
|||
std::shared_ptr<AudioOutputStream> m_outputStream; |
|||
}; |
|||
|
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Audio
|
|||
@ -0,0 +1,239 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_audio_data_stream.h: Public API declarations for AudioDataStream C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
|
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_utils.h> |
|||
#include <speechapi_c_audio_stream.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
class SpeechSynthesisResult; |
|||
class KeywordRecognitionResult; |
|||
|
|||
/// <summary>
|
|||
/// Represents audio data stream used for operating audio data as a stream.
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
class AudioDataStream : public std::enable_shared_from_this<AudioDataStream> |
|||
{ |
|||
private: |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOSTREAMHANDLE, &audio_data_stream_release> m_haudioStream; |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXAUDIOSTREAMHANDLE hstream) : |
|||
PropertyCollection( |
|||
[=]() { |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
audio_data_stream_get_property_bag(hstream, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the properties associating to the audio data stream.
|
|||
/// </summary>
|
|||
PrivatePropertyCollection m_properties; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destroy the instance.
|
|||
/// </summary>
|
|||
~AudioDataStream() |
|||
{ |
|||
DetachInput(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed AudioDataStream for the specified audio input file.
|
|||
/// Added in version 1.14.0
|
|||
/// </summary>
|
|||
/// <param name="fileName">Specifies the audio input file.</param>
|
|||
/// <returns>A shared pointer to AudioDataStream</returns>
|
|||
static std::shared_ptr<AudioDataStream> FromWavFileInput(const SPXSTRING& fileName) |
|||
{ |
|||
SPXAUDIOSTREAMHANDLE hstream = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_data_stream_create_from_file(&hstream, Utils::ToUTF8(fileName).c_str())); |
|||
|
|||
auto stream = new AudioDataStream(hstream); |
|||
return std::shared_ptr<AudioDataStream>(stream); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed AudioDataStream from given speech synthesis result.
|
|||
/// </summary>
|
|||
/// <param name="result">The speech synthesis result.</param>
|
|||
/// <returns>A shared pointer to AudioDataStream</returns>
|
|||
static std::shared_ptr<AudioDataStream> FromResult(std::shared_ptr<SpeechSynthesisResult> result); |
|||
|
|||
/// <summary>
|
|||
/// Obtains the memory backed AudioDataStream associated with a given KeywordRecognition result.
|
|||
/// </summary>
|
|||
/// <param name="result">The keyword recognition result.</param>
|
|||
/// <returns>An audio stream with the input to the KeywordRecognizer starting from right before the Keyword.</returns>
|
|||
static std::shared_ptr<AudioDataStream> FromResult(std::shared_ptr<KeywordRecognitionResult> result); |
|||
|
|||
/// <summary>
|
|||
/// Get current status of the audio data stream.
|
|||
/// </summary>
|
|||
/// <returns>Current status</returns>
|
|||
StreamStatus GetStatus() |
|||
{ |
|||
Stream_Status status = StreamStatus_Unknown; |
|||
SPX_THROW_ON_FAIL(audio_data_stream_get_status(m_haudioStream, &status)); |
|||
return (StreamStatus)status; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Check whether the stream has enough data to be read.
|
|||
/// </summary>
|
|||
/// <param name="bytesRequested">The requested data size in bytes.</param>
|
|||
/// <returns>A bool indicating whether the stream has enough data to be read.</returns>
|
|||
bool CanReadData(uint32_t bytesRequested) |
|||
{ |
|||
return audio_data_stream_can_read_data(m_haudioStream, bytesRequested); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Check whether the stream has enough data to be read, starting from the specified position.
|
|||
/// </summary>
|
|||
/// <param name="pos">The position counting from start of the stream.</param>
|
|||
/// <param name="bytesRequested">The requested data size in bytes.</param>
|
|||
/// <returns>A bool indicating whether the stream has enough data to be read.</returns>
|
|||
bool CanReadData(uint32_t pos, uint32_t bytesRequested) |
|||
{ |
|||
return audio_data_stream_can_read_data_from_position(m_haudioStream, bytesRequested, pos); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Reads a chunk of the audio data and fill it to given buffer
|
|||
/// </summary>
|
|||
/// <param name="buffer">A buffer to receive read data.</param>
|
|||
/// <param name="bufferSize">Size of the buffer.</param>
|
|||
/// <returns>Size of data filled to the buffer, 0 means end of stream</returns>
|
|||
uint32_t ReadData(uint8_t* buffer, uint32_t bufferSize) |
|||
{ |
|||
uint32_t filledSize = 0; |
|||
SPX_THROW_ON_FAIL(audio_data_stream_read(m_haudioStream, buffer, bufferSize, &filledSize)); |
|||
|
|||
return filledSize; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Reads a chunk of the audio data and fill it to given buffer, starting from the specified position.
|
|||
/// </summary>
|
|||
/// <param name="pos">The position counting from start of the stream.</param>
|
|||
/// <param name="buffer">A buffer to receive read data.</param>
|
|||
/// <param name="bufferSize">Size of the buffer.</param>
|
|||
/// <returns>Size of data filled to the buffer, 0 means end of stream</returns>
|
|||
uint32_t ReadData(uint32_t pos, uint8_t* buffer, uint32_t bufferSize) |
|||
{ |
|||
uint32_t filledSize = 0; |
|||
SPX_THROW_ON_FAIL(audio_data_stream_read_from_position(m_haudioStream, buffer, bufferSize, pos, &filledSize)); |
|||
|
|||
return filledSize; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Save the audio data to a file, synchronously.
|
|||
/// </summary>
|
|||
/// <param name="fileName">The file name with full path.</param>
|
|||
void SaveToWavFile(const SPXSTRING& fileName) |
|||
{ |
|||
SPX_THROW_ON_FAIL(audio_data_stream_save_to_wave_file(m_haudioStream, Utils::ToUTF8(fileName).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Save the audio data to a file, asynchronously.
|
|||
/// </summary>
|
|||
/// <param name="fileName">The file name with full path.</param>
|
|||
/// <returns>An asynchronous operation representing the saving.</returns>
|
|||
std::future<void> SaveToWavFileAsync(const SPXSTRING& fileName) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
|
|||
auto future = std::async(std::launch::async, [keepAlive, this, fileName]() -> void { |
|||
SPX_THROW_ON_FAIL(audio_data_stream_save_to_wave_file(m_haudioStream, Utils::ToUTF8(fileName).c_str())); |
|||
}); |
|||
|
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Get current position of the audio data stream.
|
|||
/// </summary>
|
|||
/// <returns>Current position</returns>
|
|||
uint32_t GetPosition() |
|||
{ |
|||
uint32_t position = 0; |
|||
SPX_THROW_ON_FAIL(audio_data_stream_get_position(m_haudioStream, &position)); |
|||
return position; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Set current position of the audio data stream.
|
|||
/// </summary>
|
|||
/// <param name="pos">Position to be set.</param>
|
|||
void SetPosition(uint32_t pos) |
|||
{ |
|||
SPX_THROW_ON_FAIL(audio_data_stream_set_position(m_haudioStream, pos)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Stops any more data from getting to the stream.
|
|||
/// </summary>
|
|||
void DetachInput() |
|||
{ |
|||
SPX_THROW_ON_FAIL(audio_data_stream_detach_input(m_haudioStream)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Explicit conversion operator.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOSTREAMHANDLE() { return m_haudioStream; } |
|||
|
|||
/// <summary>
|
|||
/// Collection of additional SpeechSynthesisResult properties.
|
|||
/// </summary>
|
|||
const PropertyCollection& Properties; |
|||
|
|||
private: |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AudioDataStream(SPXAUDIOSTREAMHANDLE haudioStream) : |
|||
m_haudioStream(haudioStream), |
|||
m_properties(haudioStream), |
|||
Properties(m_properties) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
} |
|||
}; |
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,358 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_audio_processing_options.h: Public API declarations for AudioProcessingOptions and related C++ classes
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <vector> |
|||
#include <memory> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_c_audio_processing_options.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Audio { |
|||
|
|||
/// <summary>
|
|||
/// Types of preset microphone array geometries.
|
|||
/// See [Microphone Array Recommendations](/azure/cognitive-services/speech-service/speech-devices-sdk-microphone) for more details.
|
|||
/// </summary>
|
|||
enum class PresetMicrophoneArrayGeometry |
|||
{ |
|||
/// <summary>
|
|||
/// Indicates that no geometry specified. Speech SDK will determine the microphone array geometry.
|
|||
/// </summary>
|
|||
Uninitialized, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with one microphone in the center and six microphones evenly spaced
|
|||
/// in a circle with radius approximately equal to 42.5 mm.
|
|||
/// </summary>
|
|||
Circular7, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with one microphone in the center and three microphones evenly spaced
|
|||
/// in a circle with radius approximately equal to 42.5 mm.
|
|||
/// </summary>
|
|||
Circular4, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with four linearly placed microphones with 40 mm spacing between them.
|
|||
/// </summary>
|
|||
Linear4, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with two linearly placed microphones with 40 mm spacing between them.
|
|||
/// </summary>
|
|||
Linear2, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with a single microphone.
|
|||
/// </summary>
|
|||
Mono, |
|||
/// <summary>
|
|||
/// Indicates a microphone array with custom geometry.
|
|||
/// </summary>
|
|||
Custom |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Types of microphone arrays.
|
|||
/// </summary>
|
|||
enum class MicrophoneArrayType |
|||
{ |
|||
/// <summary>
|
|||
/// Indicates that the microphone array has microphones in a straight line.
|
|||
/// </summary>
|
|||
Linear, |
|||
/// <summary>
|
|||
/// Indicates that the microphone array has microphones in a plane.
|
|||
/// </summary>
|
|||
Planar |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Defines speaker reference channel position in input audio.
|
|||
/// </summary>
|
|||
enum class SpeakerReferenceChannel |
|||
{ |
|||
/// <summary>
|
|||
/// Indicates that the input audio does not have a speaker reference channel.
|
|||
/// </summary>
|
|||
None, |
|||
/// <summary>
|
|||
/// Indicates that the last channel in the input audio corresponds to the speaker
|
|||
/// reference for echo cancellation.
|
|||
/// </summary>
|
|||
LastChannel |
|||
}; |
|||
|
|||
typedef AudioProcessingOptions_MicrophoneCoordinates MicrophoneCoordinates; |
|||
|
|||
/// <summary>
|
|||
/// Represents the geometry of a microphone array.
|
|||
/// </summary>
|
|||
struct MicrophoneArrayGeometry |
|||
{ |
|||
/// <summary>
|
|||
/// Type of microphone array.
|
|||
/// </summary>
|
|||
MicrophoneArrayType microphoneArrayType; |
|||
/// <summary>
|
|||
/// Start angle for beamforming in degrees.
|
|||
/// </summary>
|
|||
uint16_t beamformingStartAngle; |
|||
/// <summary>
|
|||
/// End angle for beamforming in degrees.
|
|||
/// </summary>
|
|||
uint16_t beamformingEndAngle; |
|||
/// <summary>
|
|||
/// Coordinates of microphones in the microphone array.
|
|||
/// </summary>
|
|||
std::vector<MicrophoneCoordinates> microphoneCoordinates; |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance of MicrophoneArrayGeometry.
|
|||
/// Beamforming start angle is set to zero.
|
|||
/// Beamforming end angle is set to 180 degrees if microphoneArrayType is Linear, otherwise it is set to 360 degrees.
|
|||
/// </summary>
|
|||
/// <param name="microphoneArrayType">Type of microphone array.</param>
|
|||
/// <param name="microphoneCoordinates">Coordinates of microphones in the microphone array.</param>
|
|||
MicrophoneArrayGeometry(MicrophoneArrayType microphoneArrayType, const std::vector<MicrophoneCoordinates>& microphoneCoordinates) |
|||
{ |
|||
this->microphoneArrayType = microphoneArrayType; |
|||
this->beamformingStartAngle = 0; |
|||
this->beamformingEndAngle = (microphoneArrayType == MicrophoneArrayType::Linear) ? 180 : 360; |
|||
this->microphoneCoordinates.resize(microphoneCoordinates.size()); |
|||
for (size_t i = 0; i < microphoneCoordinates.size(); i++) |
|||
{ |
|||
this->microphoneCoordinates[i] = microphoneCoordinates[i]; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance of MicrophoneArrayGeometry.
|
|||
/// </summary>
|
|||
/// <param name="microphoneArrayType">Type of microphone array.</param>
|
|||
/// <param name="beamformingStartAngle">Start angle for beamforming in degrees.</param>
|
|||
/// <param name="beamformingEndAngle">End angle for beamforming in degrees.</param>
|
|||
/// <param name="microphoneCoordinates">Coordinates of microphones in the microphone array.</param>
|
|||
MicrophoneArrayGeometry(MicrophoneArrayType microphoneArrayType, uint16_t beamformingStartAngle, uint16_t beamformingEndAngle, const std::vector<MicrophoneCoordinates>& microphoneCoordinates) |
|||
{ |
|||
this->microphoneArrayType = microphoneArrayType; |
|||
this->beamformingStartAngle = beamformingStartAngle; |
|||
this->beamformingEndAngle = beamformingEndAngle; |
|||
this->microphoneCoordinates.resize(microphoneCoordinates.size()); |
|||
for (size_t i = 0; i < microphoneCoordinates.size(); i++) |
|||
{ |
|||
this->microphoneCoordinates[i] = microphoneCoordinates[i]; |
|||
} |
|||
} |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Represents audio processing options used with audio config class.
|
|||
/// </summary>
|
|||
class AudioProcessingOptions |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hoptions">A handle to audio processing options.</param>
|
|||
explicit AudioProcessingOptions(SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions) |
|||
: m_hoptions(hoptions) |
|||
{ |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_property_bag(m_hoptions, &m_propertybag)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructs an instance of the AudioProcessingOptions class.
|
|||
/// </summary>
|
|||
~AudioProcessingOptions() = default; |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOPROCESSINGOPTIONSHANDLE() const { return m_hoptions.get(); } |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance of the AudioProcessingOptions class.
|
|||
/// </summary>
|
|||
/// <param name="audioProcessingFlags">Specifies flags to control the audio processing performed by Speech SDK. It is bitwise OR of AUDIO_INPUT_PROCESSING_XXX constants.</param>
|
|||
/// <returns>The newly created AudioProcessingOptions wrapped inside a std::shared_ptr.</returns>
|
|||
/// <remarks>
|
|||
/// This function should only be used when the audio input is from a microphone array.
|
|||
/// On Windows, this function will try to query the microphone array geometry from the audio driver. Audio data is also read from speaker reference channel.
|
|||
/// On Linux, it assumes that the microphone is a single channel microphone.
|
|||
/// </remarks>
|
|||
static std::shared_ptr<AudioProcessingOptions> Create(int audioProcessingFlags) |
|||
{ |
|||
SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_create(&hoptions, audioProcessingFlags)); |
|||
|
|||
auto options = new AudioProcessingOptions(hoptions); |
|||
return std::shared_ptr<AudioProcessingOptions>(options); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance of the AudioProcessingOptions class with preset microphone array geometry.
|
|||
/// </summary>
|
|||
/// <param name="audioProcessingFlags">Specifies flags to control the audio processing performed by Speech SDK. It is bitwise OR of AUDIO_INPUT_PROCESSING_XXX constants.</param>
|
|||
/// <param name="microphoneArrayGeometry">Specifies the type of microphone array geometry.</param>
|
|||
/// <param name="speakerReferenceChannel">Specifies the speaker reference channel position in the input audio.</param>
|
|||
/// <returns>The newly created AudioProcessingOptions wrapped inside a std::shared_ptr.</returns>
|
|||
static std::shared_ptr<AudioProcessingOptions> Create(int audioProcessingFlags, PresetMicrophoneArrayGeometry microphoneArrayGeometry, SpeakerReferenceChannel speakerReferenceChannel = SpeakerReferenceChannel::None) |
|||
{ |
|||
SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_create_from_preset_microphone_array_geometry(&hoptions, audioProcessingFlags, (AudioProcessingOptions_PresetMicrophoneArrayGeometry)microphoneArrayGeometry, (AudioProcessingOptions_SpeakerReferenceChannel)speakerReferenceChannel)); |
|||
|
|||
auto options = new AudioProcessingOptions(hoptions); |
|||
return std::shared_ptr<AudioProcessingOptions>(options); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a new instance of the AudioProcessingOptions class with microphone array geometry.
|
|||
/// </summary>
|
|||
/// <param name="audioProcessingFlags">Specifies flags to control the audio processing performed by Speech SDK. It is bitwise OR of AUDIO_INPUT_PROCESSING_XXX constants.</param>
|
|||
/// <param name="microphoneArrayGeometry">Specifies the microphone array geometry.</param>
|
|||
/// <param name="speakerReferenceChannel">Specifies the speaker reference channel position in the input audio.</param>
|
|||
/// <returns>The newly created AudioProcessingOptions wrapped inside a std::shared_ptr.</returns>
|
|||
static std::shared_ptr<AudioProcessingOptions> Create(int audioProcessingFlags, MicrophoneArrayGeometry microphoneArrayGeometry, SpeakerReferenceChannel speakerReferenceChannel = SpeakerReferenceChannel::None) |
|||
{ |
|||
AudioProcessingOptions_MicrophoneArrayGeometry geometry |
|||
{ |
|||
(AudioProcessingOptions_MicrophoneArrayType)microphoneArrayGeometry.microphoneArrayType, |
|||
microphoneArrayGeometry.beamformingStartAngle, |
|||
microphoneArrayGeometry.beamformingEndAngle, |
|||
(uint16_t)microphoneArrayGeometry.microphoneCoordinates.size(), |
|||
microphoneArrayGeometry.microphoneCoordinates.data() |
|||
}; |
|||
|
|||
SPXAUDIOPROCESSINGOPTIONSHANDLE hoptions = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_create_from_microphone_array_geometry(&hoptions, audioProcessingFlags, &geometry, (AudioProcessingOptions_SpeakerReferenceChannel)speakerReferenceChannel)); |
|||
|
|||
auto options = new AudioProcessingOptions(hoptions); |
|||
return std::shared_ptr<AudioProcessingOptions>(options); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the type of audio processing performed by Speech SDK.
|
|||
/// </summary>
|
|||
/// <returns>Bitwise OR of AUDIO_INPUT_PROCESSING_XXX constant flags indicating the input audio processing performed by Speech SDK.</returns>
|
|||
int GetAudioProcessingFlags() const |
|||
{ |
|||
int audioProcessingFlags; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_audio_processing_flags(m_hoptions, &audioProcessingFlags)); |
|||
return audioProcessingFlags; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the microphone array geometry of the microphone used for audio input.
|
|||
/// </summary>
|
|||
/// <returns>A value of type PresetMicrophoneArrayGeometry enum.</returns>
|
|||
PresetMicrophoneArrayGeometry GetPresetMicrophoneArrayGeometry() const |
|||
{ |
|||
PresetMicrophoneArrayGeometry microphoneArrayGeometry = PresetMicrophoneArrayGeometry::Uninitialized; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_preset_microphone_array_geometry(m_hoptions, (AudioProcessingOptions_PresetMicrophoneArrayGeometry*)µphoneArrayGeometry)); |
|||
return microphoneArrayGeometry; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the microphone array type of the microphone used for audio input.
|
|||
/// </summary>
|
|||
/// <returns>A value of type MicrophoneArrayType enum.</returns>
|
|||
MicrophoneArrayType GetMicrophoneArrayType() const |
|||
{ |
|||
MicrophoneArrayType microphoneArrayType = MicrophoneArrayType::Linear; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_microphone_array_type(m_hoptions, (AudioProcessingOptions_MicrophoneArrayType*)µphoneArrayType)); |
|||
return microphoneArrayType; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the start angle used for beamforming.
|
|||
/// </summary>
|
|||
/// <returns>Beamforming start angle.</returns>
|
|||
uint16_t GetBeamformingStartAngle() const |
|||
{ |
|||
uint16_t startAngle; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_beamforming_start_angle(m_hoptions, &startAngle)); |
|||
return startAngle; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the end angle used for beamforming.
|
|||
/// </summary>
|
|||
/// <returns>Beamforming end angle.</returns>
|
|||
uint16_t GetBeamformingEndAngle() const |
|||
{ |
|||
uint16_t endAngle; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_beamforming_end_angle(m_hoptions, &endAngle)); |
|||
return endAngle; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the coordinates of microphones in the microphone array used for audio input.
|
|||
/// </summary>
|
|||
/// <returns>A std::vector of MicrophoneCoordinates elements.</returns>
|
|||
std::vector<MicrophoneCoordinates> GetMicrophoneCoordinates() const |
|||
{ |
|||
uint16_t microphoneCount; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_microphone_count(m_hoptions, µphoneCount)); |
|||
|
|||
std::vector<MicrophoneCoordinates> microphoneCoordinates(microphoneCount); |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_microphone_coordinates(m_hoptions, microphoneCoordinates.data(), microphoneCount)); |
|||
return microphoneCoordinates; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns the speaker reference channel position in the audio input.
|
|||
/// </summary>
|
|||
/// <returns>A value of type SpeakerReferenceChannel enum.</returns>
|
|||
SpeakerReferenceChannel GetSpeakerReferenceChannel() const |
|||
{ |
|||
SpeakerReferenceChannel speakerReferenceChannel = SpeakerReferenceChannel::None; |
|||
SPX_THROW_ON_FAIL(audio_processing_options_get_speaker_reference_channel(m_hoptions, (AudioProcessingOptions_SpeakerReferenceChannel*)&speakerReferenceChannel)); |
|||
return speakerReferenceChannel; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The property name.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(const SPXSTRING& name, const SPXSTRING& value) |
|||
{ |
|||
property_bag_set_string(m_propertybag, -1, Utils::ToUTF8(name).c_str(), Utils::ToUTF8(value).c_str()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The parameter name.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(const SPXSTRING& name) const |
|||
{ |
|||
const char* value = property_bag_get_string(m_propertybag, -1, Utils::ToUTF8(name).c_str(), ""); |
|||
return Utils::ToSPXString(Utils::CopyAndFreePropertyString(value)); |
|||
} |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(AudioProcessingOptions); |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOPROCESSINGOPTIONSHANDLE, &audio_processing_options_release> m_hoptions; |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the properties of the audio processing options.
|
|||
/// </summary>
|
|||
SmartHandle<SPXPROPERTYBAGHANDLE, &property_bag_release> m_propertybag; |
|||
}; |
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Audio
|
|||
@ -0,0 +1,995 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_audio_stream.h: Public API declarations for AudioInputStream / AudioOutputStream and related C++ classes
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <functional> |
|||
#include <future> |
|||
#include <memory> |
|||
#include <vector> |
|||
#include <string> |
|||
#include <cstring> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_cxx_audio_stream_format.h> |
|||
#include <speechapi_cxx_enums.h> |
|||
#include <speechapi_c_audio_stream.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
namespace Dialog { |
|||
class ActivityReceivedEventArgs; |
|||
} |
|||
|
|||
namespace Audio { |
|||
|
|||
|
|||
|
|||
class PullAudioInputStreamCallback; |
|||
class PushAudioInputStream; |
|||
class PullAudioInputStream; |
|||
class PushAudioOutputStreamCallback; |
|||
class PushAudioOutputStream; |
|||
class PullAudioOutputStream; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents audio input stream used for custom audio input configurations.
|
|||
/// </summary>
|
|||
class AudioInputStream |
|||
{ |
|||
public: |
|||
|
|||
using ReadCallbackFunction_Type = ::std::function<int(uint8_t*, uint32_t)>; |
|||
using CloseCallbackFunction_Type = ::std::function<void()>; |
|||
/// Added in version 1.5.0.
|
|||
using GetPropertyCallbackFunction_Type = std::function<SPXSTRING(PropertyId)>; |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOSTREAMHANDLE() const { return m_haudioStream.get(); } |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PushAudioInputStream using the default format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to PushAudioInputStream</returns>
|
|||
static std::shared_ptr<PushAudioInputStream> CreatePushStream(); |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PushAudioInputStream with the specified audio format.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <returns>A shared pointer to PushAudioInputStream</returns>
|
|||
static std::shared_ptr<PushAudioInputStream> CreatePushStream(std::shared_ptr<AudioStreamFormat> format); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read() and Close() methods, using the default format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read(), Close() and GetProperty() methods
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">GetProperty callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback); |
|||
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read() and Close() methods, using the default format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read(), Close() and GetProperty() methods.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback); |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback interface for the Read() and Close() methods, using the default format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <param name="callback">Shared pointer to PullAudioInputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<PullAudioInputStreamCallback> callback); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read() and Close() methods.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read(), Close() and GetProperty() methods.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback); |
|||
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read() and Close() methods.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback functions for Read() and Close() methods.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback); |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream that delegates to the specified callback interface for the Read() and Close() methods, using the specified format.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="callback">Shared pointer to PullAudioInputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> CreatePullStream(std::shared_ptr<AudioStreamFormat> format, std::shared_ptr<PullAudioInputStreamCallback> callback); |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AudioInputStream(SPXAUDIOSTREAMHANDLE haudioStream) : m_haudioStream(haudioStream) { } |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~AudioInputStream() {} |
|||
|
|||
/// <summary>
|
|||
/// Internal helper method to get the default format if the specified format is nullptr.
|
|||
/// </summary>
|
|||
static std::shared_ptr<AudioStreamFormat> UseDefaultFormatIfNull(std::shared_ptr<AudioStreamFormat> format) { return format != nullptr ? format : AudioStreamFormat::GetDefaultInputFormat(); } |
|||
|
|||
/// <summary>
|
|||
/// Internal helper method to get the audio stream format handle.
|
|||
/// </summary>
|
|||
static SPXAUDIOSTREAMFORMATHANDLE GetFormatHandle(std::shared_ptr<AudioStreamFormat> format) { return (SPXAUDIOSTREAMFORMATHANDLE)(*format.get()); } |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOSTREAMHANDLE, &audio_stream_release> m_haudioStream; |
|||
|
|||
protected: |
|||
static constexpr size_t m_maxPropertyLen = 1024; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(AudioInputStream); |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents memory backed push audio input stream used for custom audio input configurations.
|
|||
/// </summary>
|
|||
class PushAudioInputStream : public AudioInputStream |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destructor; closes the underlying stream if not already closed.
|
|||
/// </summary>
|
|||
virtual ~PushAudioInputStream() |
|||
{ |
|||
if (audio_stream_is_handle_valid(m_haudioStream)) |
|||
{ |
|||
CloseStream(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PushAudioInputStream using the default format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to PushAudioInputStream</returns>
|
|||
static std::shared_ptr<PushAudioInputStream> Create() |
|||
{ |
|||
return Create(nullptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PushAudioInputStream with the specified audio format.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <returns>A shared pointer to PushAudioInputStream</returns>
|
|||
static std::shared_ptr<PushAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format) |
|||
{ |
|||
format = UseDefaultFormatIfNull(format); |
|||
|
|||
SPXAUDIOSTREAMHANDLE haudioStream = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_create_push_audio_input_stream(&haudioStream, GetFormatHandle(format))); |
|||
|
|||
auto stream = new PushAudioInputStream(haudioStream); |
|||
return std::shared_ptr<PushAudioInputStream>(stream); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Writes the audio data specified by making an internal copy of the data.
|
|||
/// Note: The dataBuffer should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="dataBuffer">The pointer to the audio buffer of which this function will make a copy.</param>
|
|||
/// <param name="size">The size of the buffer.</param>
|
|||
void Write(uint8_t* dataBuffer, uint32_t size) |
|||
{ |
|||
SPX_THROW_ON_FAIL(push_audio_input_stream_write(m_haudioStream, dataBuffer, size)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Set value of a property. The properties of the audio data should be set before writing the audio data.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="id">The id of property. See <see cref="PropertyId"/></param>
|
|||
/// <param name="value">value to set</param>
|
|||
void SetProperty(PropertyId id, const SPXSTRING& value) |
|||
{ |
|||
SPX_THROW_ON_FAIL(push_audio_input_stream_set_property_by_id(m_haudioStream, static_cast<int>(id), Utils::ToUTF8(value).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Set value of a property. The properties of the audio data should be set before writing the audio data.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="propertyName">The name of property.</param>
|
|||
/// <param name="value">value to set</param>
|
|||
void SetProperty(const SPXSTRING& propertyName, const SPXSTRING& value) |
|||
{ |
|||
SPX_THROW_ON_FAIL(push_audio_input_stream_set_property_by_name(m_haudioStream, Utils::ToUTF8(propertyName.c_str()), Utils::ToUTF8(value.c_str()))); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Closes the stream.
|
|||
/// </summary>
|
|||
void Close() { SPX_THROW_ON_FAIL(CloseStream()); } |
|||
|
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit PushAudioInputStream(SPXAUDIOSTREAMHANDLE haudioStream) : AudioInputStream(haudioStream) { } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PushAudioInputStream); |
|||
|
|||
SPXHR CloseStream() { return push_audio_input_stream_close(m_haudioStream); } |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// An interface that defines callback methods for an audio input stream.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Derive from this class and implement its function to provide your own
|
|||
/// data as an audio input stream.
|
|||
/// <remarks>
|
|||
class PullAudioInputStreamCallback |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~PullAudioInputStreamCallback() {} |
|||
|
|||
/// <summary>
|
|||
/// This function is called to synchronously get data from the audio stream.
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="dataBuffer">The pointer to the buffer to which to copy the audio data.</param>
|
|||
/// <param name="size">The size of the buffer.</param>
|
|||
/// <returns>The number of bytes copied into the buffer, or zero to indicate end of stream</returns>
|
|||
virtual int Read(uint8_t* dataBuffer, uint32_t size) = 0; |
|||
|
|||
/// <summary>
|
|||
/// This function is called to synchronously to get meta information associated to stream data, such as TimeStamp or UserId .
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="id">The id of the property.</param>
|
|||
/// <returns>The value of the property.</returns>
|
|||
virtual SPXSTRING GetProperty(PropertyId id) |
|||
{ |
|||
if (PropertyId::DataBuffer_TimeStamp == id) |
|||
{ |
|||
return ""; |
|||
} |
|||
else if (PropertyId::DataBuffer_UserId == id) |
|||
{ |
|||
return ""; |
|||
} |
|||
else |
|||
{ |
|||
return ""; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// This function is called to close the audio stream.
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
virtual void Close() = 0; |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Constructor, does nothing.
|
|||
/// </summary>
|
|||
PullAudioInputStreamCallback() {}; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PullAudioInputStreamCallback); |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Pull audio input stream class.
|
|||
/// </summary>
|
|||
class PullAudioInputStream : public AudioInputStream |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read() and Close() "C" callback functions pointers
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback = nullptr) |
|||
{ |
|||
return Create(nullptr, pvContext, readCallback, closeCallback); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read(), Close() and GetProperty() "C" callback functions pointers
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback) |
|||
{ |
|||
return Create(nullptr, pvContext, readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read() and Close() callback functions.
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback = nullptr) |
|||
{ |
|||
return Create(nullptr, readCallback, closeCallback); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read(), Close() and GetProperty() callback functions.
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback) |
|||
{ |
|||
return Create(nullptr, readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Close() callback function.
|
|||
/// </summary>
|
|||
/// <param name="callback">Shared pointer to PullAudioInputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<PullAudioInputStreamCallback> callback) |
|||
{ |
|||
return Create(nullptr, callback); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read() and Close() "C" callback functions pointers
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback = nullptr) |
|||
{ |
|||
return Create(format, |
|||
[=](uint8_t* buffer, uint32_t size) -> int { return readCallback(pvContext, buffer, size); }, |
|||
[=]() { if (closeCallback != nullptr) { closeCallback(pvContext); } }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read(), Close() and GetProperty() "C" callback functions pointers
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback) |
|||
{ |
|||
return Create(format, |
|||
[=](uint8_t* buffer, uint32_t size) -> int { return readCallback(pvContext, buffer, size); }, |
|||
[=]() { if (closeCallback != nullptr) { closeCallback(pvContext); } }, |
|||
[=](PropertyId id) -> SPXSTRING |
|||
{ |
|||
uint8_t result[m_maxPropertyLen]; |
|||
getPropertyCallback(pvContext, static_cast<int>(id), result, m_maxPropertyLen); |
|||
return reinterpret_cast<char*>(result); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read() and Close() callback functions.
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback = nullptr) |
|||
{ |
|||
auto wrapper = std::make_shared<FunctionCallbackWrapper>(readCallback, closeCallback); |
|||
return Create(format, wrapper); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read(), Close() and GetProperty() callback functions.
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="readCallback">Read callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <param name="getPropertyCallback">Get property callback.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback) |
|||
{ |
|||
auto wrapper = std::make_shared<FunctionCallbackWrapper>(readCallback, closeCallback, getPropertyCallback); |
|||
return Create(format, wrapper); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PullAudioInputStream utilizing the specified Read() and Close() callback functions.
|
|||
/// </summary>
|
|||
/// <param name="format">Audio stream format.</param>
|
|||
/// <param name="callback">Shared pointer to PullAudioInputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PullAudioInputStream</returns>
|
|||
static std::shared_ptr<PullAudioInputStream> Create(std::shared_ptr<AudioStreamFormat> format, std::shared_ptr<PullAudioInputStreamCallback> callback) |
|||
{ |
|||
format = UseDefaultFormatIfNull(format); |
|||
|
|||
SPXAUDIOSTREAMHANDLE haudioStream = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_create_pull_audio_input_stream(&haudioStream, GetFormatHandle(format))); |
|||
|
|||
auto stream = new PullAudioInputStream(haudioStream); |
|||
SPX_THROW_ON_FAIL(pull_audio_input_stream_set_callbacks(haudioStream, stream, ReadCallbackWrapper, CloseCallbackWrapper)); |
|||
SPX_THROW_ON_FAIL(pull_audio_input_stream_set_getproperty_callback(haudioStream, stream, GetPropertyCallbackWrapper)); |
|||
|
|||
stream->m_callback = callback; |
|||
|
|||
return std::shared_ptr<PullAudioInputStream>(stream); |
|||
} |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit PullAudioInputStream(SPXAUDIOSTREAMHANDLE haudioStream) : AudioInputStream(haudioStream) { } |
|||
|
|||
class FunctionCallbackWrapper : public PullAudioInputStreamCallback |
|||
{ |
|||
public: |
|||
|
|||
FunctionCallbackWrapper(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback = nullptr) : |
|||
m_readCallback(readCallback), |
|||
m_closeCallback(closeCallback), |
|||
m_getPropertyCallback(getPropertyCallback) |
|||
{ |
|||
}; |
|||
|
|||
/// Note: The dataBuffer returned by Read() should not contain any audio header.
|
|||
int Read(uint8_t* dataBuffer, uint32_t size) override { return m_readCallback(dataBuffer, size); } |
|||
void Close() override { if (m_closeCallback != nullptr) m_closeCallback(); }; |
|||
SPXSTRING GetProperty(PropertyId id) override |
|||
{ |
|||
if (m_getPropertyCallback != nullptr) |
|||
{ |
|||
return m_getPropertyCallback(id); |
|||
} |
|||
else |
|||
{ |
|||
return ""; |
|||
} |
|||
} |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(FunctionCallbackWrapper); |
|||
|
|||
ReadCallbackFunction_Type m_readCallback; |
|||
CloseCallbackFunction_Type m_closeCallback; |
|||
GetPropertyCallbackFunction_Type m_getPropertyCallback; |
|||
|
|||
}; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PullAudioInputStream); |
|||
|
|||
static int ReadCallbackWrapper(void* pvContext, uint8_t* dataBuffer, uint32_t size) |
|||
{ |
|||
PullAudioInputStream* ptr = (PullAudioInputStream*)pvContext; |
|||
return ptr->m_callback->Read(dataBuffer, size); |
|||
} |
|||
|
|||
static void CloseCallbackWrapper(void* pvContext) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
PullAudioInputStream* ptr = (PullAudioInputStream*)pvContext; |
|||
ptr->m_callback->Close(); |
|||
} |
|||
|
|||
static void GetPropertyCallbackWrapper(void *pvContext, int id, uint8_t* result, uint32_t size) |
|||
{ |
|||
PullAudioInputStream* ptr = (PullAudioInputStream*)pvContext; |
|||
auto value = ptr->m_callback->GetProperty(static_cast<PropertyId>(id)); |
|||
auto valueSize = value.size() + 1; |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, valueSize > size); |
|||
std::memcpy(result, value.c_str(), valueSize); |
|||
} |
|||
|
|||
std::shared_ptr<PullAudioInputStreamCallback> m_callback; |
|||
}; |
|||
|
|||
|
|||
inline std::shared_ptr<PushAudioInputStream> AudioInputStream::CreatePushStream() |
|||
{ |
|||
return PushAudioInputStream::Create(); |
|||
} |
|||
|
|||
inline std::shared_ptr<PushAudioInputStream> AudioInputStream::CreatePushStream(std::shared_ptr<AudioStreamFormat> format) |
|||
{ |
|||
return PushAudioInputStream::Create(format); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(pvContext, readCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(pvContext, readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(readCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<PullAudioInputStreamCallback> callback) |
|||
{ |
|||
return PullAudioInputStream::Create(callback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(format, pvContext, readCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<AudioStreamFormat> format, void* pvContext, CUSTOM_AUDIO_PULL_STREAM_READ_CALLBACK readCallback, CUSTOM_AUDIO_PULL_STREAM_CLOSE_CALLBACK closeCallback, CUSTOM_AUDIO_PULL_STREAM_GET_PROPERTY_CALLBACK getPropertyCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(format, pvContext, readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(format, readCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<AudioStreamFormat> format, ReadCallbackFunction_Type readCallback, CloseCallbackFunction_Type closeCallback, GetPropertyCallbackFunction_Type getPropertyCallback) |
|||
{ |
|||
return PullAudioInputStream::Create(format, readCallback, closeCallback, getPropertyCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PullAudioInputStream> AudioInputStream::CreatePullStream(std::shared_ptr<AudioStreamFormat> format, std::shared_ptr<PullAudioInputStreamCallback> callback) |
|||
{ |
|||
return PullAudioInputStream::Create(format, callback); |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents audio output stream used for custom audio output configurations.
|
|||
/// Updated in version 1.7.0
|
|||
/// </summary>
|
|||
class AudioOutputStream |
|||
{ |
|||
public: |
|||
|
|||
using WriteCallbackFunction_Type = ::std::function<int(uint8_t*, uint32_t)>; |
|||
using CloseCallbackFunction_Type = ::std::function<void()>; |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOSTREAMHANDLE() const { return m_haudioStream.get(); } |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PullAudioOutputStream.
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to PullAudioOutputStream</returns>
|
|||
static std::shared_ptr<PullAudioOutputStream> CreatePullStream(); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream that delegates to the specified callback functions for Write() and Close() methods.
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="writeCallback">Write callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> CreatePushStream(void* pvContext, CUSTOM_AUDIO_PUSH_STREAM_WRITE_CALLBACK writeCallback, CUSTOM_AUDIO_PUSH_STREAM_CLOSE_CALLBACK closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream that delegates to the specified callback functions for Write() and Close() methods.
|
|||
/// </summary>
|
|||
/// <param name="writeCallback">Write callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> CreatePushStream(WriteCallbackFunction_Type writeCallback, CloseCallbackFunction_Type closeCallback = nullptr); |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream that delegates to the specified callback interface for Write() and Close() methods.
|
|||
/// </summary>
|
|||
/// <param name="callback">Shared pointer to PushAudioOutputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> CreatePushStream(std::shared_ptr<PushAudioOutputStreamCallback> callback); |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AudioOutputStream(SPXAUDIOSTREAMHANDLE haudioStream) : m_haudioStream(haudioStream) { } |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~AudioOutputStream() {} |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOSTREAMHANDLE, &audio_stream_release> m_haudioStream; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(AudioOutputStream); |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents memory backed pull audio output stream used for custom audio output.
|
|||
/// Updated in version 1.7.0
|
|||
/// </summary>
|
|||
class PullAudioOutputStream : public AudioOutputStream |
|||
{ |
|||
public: |
|||
friend class Dialog::ActivityReceivedEventArgs; |
|||
|
|||
/// <summary>
|
|||
/// Creates a memory backed PullAudioOutputStream.
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to PullAudioOutputStream</returns>
|
|||
static std::shared_ptr<PullAudioOutputStream> Create() |
|||
{ |
|||
SPXAUDIOSTREAMHANDLE haudioStream = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_create_pull_audio_output_stream(&haudioStream)); |
|||
|
|||
auto stream = new PullAudioOutputStream(haudioStream); |
|||
return std::shared_ptr<PullAudioOutputStream>(stream); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Reads a chunk of the audio data and fill it to given buffer
|
|||
/// </summary>
|
|||
/// <param name="buffer">A buffer to receive read data.</param>
|
|||
/// <param name="bufferSize">Size of the buffer.</param>
|
|||
/// <returns>Size of data filled to the buffer, 0 means end of stream</returns>
|
|||
inline uint32_t Read(uint8_t* buffer, uint32_t bufferSize) |
|||
{ |
|||
uint32_t filledSize = 0; |
|||
SPX_THROW_ON_FAIL(pull_audio_output_stream_read(m_haudioStream, buffer, bufferSize, &filledSize)); |
|||
|
|||
return filledSize; |
|||
} |
|||
|
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit PullAudioOutputStream(SPXAUDIOSTREAMHANDLE haudioStream) : AudioOutputStream(haudioStream) { } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
|
|||
private: |
|||
|
|||
template <class T> |
|||
static std::shared_ptr<T> SpxAllocSharedBuffer(size_t sizeInBytes) |
|||
{ |
|||
auto ptr = reinterpret_cast<T*>(new uint8_t[sizeInBytes]); |
|||
auto deleter = [](T* p) { delete[] reinterpret_cast<uint8_t*>(p); }; |
|||
|
|||
std::shared_ptr<T> buffer(ptr, deleter); |
|||
return buffer; |
|||
} |
|||
|
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PullAudioOutputStream); |
|||
|
|||
std::vector<uint8_t> m_audioData; |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// An interface that defines callback methods for an audio output stream.
|
|||
/// Updated in version 1.7.0
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Derive from this class and implement its function to provide your own
|
|||
/// data as an audio output stream.
|
|||
/// <remarks>
|
|||
class PushAudioOutputStreamCallback |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~PushAudioOutputStreamCallback() {} |
|||
|
|||
/// <summary>
|
|||
/// This function is called to synchronously put data to the audio stream.
|
|||
/// </summary>
|
|||
/// <param name="dataBuffer">The pointer to the buffer from which to consume the audio data.</param>
|
|||
/// <param name="size">The size of the buffer.</param>
|
|||
/// <returns>The number of bytes consumed from the buffer</returns>
|
|||
virtual int Write(uint8_t* dataBuffer, uint32_t size) = 0; |
|||
|
|||
/// <summary>
|
|||
/// This function is called to close the audio stream.
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
virtual void Close() = 0; |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Constructor, does nothing.
|
|||
/// </summary>
|
|||
PushAudioOutputStreamCallback() {}; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PushAudioOutputStreamCallback); |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Push audio output stream class.
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
class PushAudioOutputStream : public AudioOutputStream |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream utilizing the specified Write() and Close() "C" callback functions pointers
|
|||
/// </summary>
|
|||
/// <param name="pvContext">Context pointer to use when invoking the callbacks.</param>
|
|||
/// <param name="writeCallback">Write callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> Create(void* pvContext, CUSTOM_AUDIO_PUSH_STREAM_WRITE_CALLBACK writeCallback, CUSTOM_AUDIO_PUSH_STREAM_CLOSE_CALLBACK closeCallback = nullptr) |
|||
{ |
|||
return Create( |
|||
[=](uint8_t* buffer, uint32_t size) -> int { return writeCallback(pvContext, buffer, size); }, |
|||
[=]() { if (closeCallback != nullptr) { closeCallback(pvContext); } }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream utilizing the specified Write() and Close() callback functions.
|
|||
/// </summary>
|
|||
/// <param name="writeCallback">Write callback.</param>
|
|||
/// <param name="closeCallback">Close callback.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> Create(WriteCallbackFunction_Type writeCallback, CloseCallbackFunction_Type closeCallback = nullptr) |
|||
{ |
|||
auto wrapper = std::make_shared<FunctionCallbackWrapper>(writeCallback, closeCallback); |
|||
return Create(wrapper); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a PushAudioOutputStream utilizing the specified callback interface with Write() and Close() callback function.
|
|||
/// </summary>
|
|||
/// <param name="callback">Shared pointer to PushAudioOutputStreamCallback instance.</param>
|
|||
/// <returns>A shared pointer to PushAudioOutputStream</returns>
|
|||
static std::shared_ptr<PushAudioOutputStream> Create(std::shared_ptr<PushAudioOutputStreamCallback> callback) |
|||
{ |
|||
SPXAUDIOSTREAMHANDLE haudioStream = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_create_push_audio_output_stream(&haudioStream)); |
|||
|
|||
auto stream = new PushAudioOutputStream(haudioStream); |
|||
SPX_THROW_ON_FAIL(push_audio_output_stream_set_callbacks(haudioStream, stream, WriteCallbackWrapper, CloseCallbackWrapper)); |
|||
stream->m_callback = callback; |
|||
|
|||
return std::shared_ptr<PushAudioOutputStream>(stream); |
|||
} |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit PushAudioOutputStream(SPXAUDIOSTREAMHANDLE haudioStream) : AudioOutputStream(haudioStream) { } |
|||
|
|||
class FunctionCallbackWrapper : public PushAudioOutputStreamCallback |
|||
{ |
|||
public: |
|||
|
|||
FunctionCallbackWrapper(WriteCallbackFunction_Type writeCallback, CloseCallbackFunction_Type closeCallback) : |
|||
m_writeCallback(writeCallback), |
|||
m_closeCallback(closeCallback) |
|||
{ |
|||
}; |
|||
|
|||
int Write(uint8_t* dataBuffer, uint32_t size) override { return m_writeCallback(dataBuffer, size); } |
|||
void Close() override { if (m_closeCallback != nullptr) m_closeCallback(); }; |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(FunctionCallbackWrapper); |
|||
|
|||
WriteCallbackFunction_Type m_writeCallback; |
|||
CloseCallbackFunction_Type m_closeCallback; |
|||
}; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(PushAudioOutputStream); |
|||
|
|||
static int WriteCallbackWrapper(void* pvContext, uint8_t* dataBuffer, uint32_t size) |
|||
{ |
|||
PushAudioOutputStream* ptr = (PushAudioOutputStream*)pvContext; |
|||
return ptr->m_callback->Write(dataBuffer, size); |
|||
} |
|||
|
|||
static void CloseCallbackWrapper(void* pvContext) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
PushAudioOutputStream* ptr = (PushAudioOutputStream*)pvContext; |
|||
ptr->m_callback->Close(); |
|||
} |
|||
|
|||
std::shared_ptr<PushAudioOutputStreamCallback> m_callback; |
|||
}; |
|||
|
|||
|
|||
inline std::shared_ptr<PullAudioOutputStream> AudioOutputStream::CreatePullStream() |
|||
{ |
|||
return PullAudioOutputStream::Create(); |
|||
} |
|||
|
|||
inline std::shared_ptr<PushAudioOutputStream> AudioOutputStream::CreatePushStream(void* pvContext, CUSTOM_AUDIO_PUSH_STREAM_WRITE_CALLBACK writeCallback, CUSTOM_AUDIO_PUSH_STREAM_CLOSE_CALLBACK closeCallback) |
|||
{ |
|||
return PushAudioOutputStream::Create(pvContext, writeCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PushAudioOutputStream> AudioOutputStream::CreatePushStream(WriteCallbackFunction_Type writeCallback, CloseCallbackFunction_Type closeCallback) |
|||
{ |
|||
return PushAudioOutputStream::Create(writeCallback, closeCallback); |
|||
} |
|||
|
|||
inline std::shared_ptr<PushAudioOutputStream> AudioOutputStream::CreatePushStream(std::shared_ptr<PushAudioOutputStreamCallback> callback) |
|||
{ |
|||
return PushAudioOutputStream::Create(callback); |
|||
} |
|||
|
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Audio
|
|||
@ -0,0 +1,215 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_audio_stream_format.h: Public API declarations for AudioStreamFormat and related C++ classes
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <functional> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_c_audio_stream_format.h> |
|||
#include <speechapi_cxx_enums.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Audio { |
|||
|
|||
/// <summary>
|
|||
/// Defines supported audio stream container format.
|
|||
/// Changed in version 1.4.0.
|
|||
/// </summary>
|
|||
enum class AudioStreamContainerFormat |
|||
{ |
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for OGG OPUS.
|
|||
/// </summary>
|
|||
OGG_OPUS = 0x101, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for MP3.
|
|||
/// </summary>
|
|||
MP3 = 0x102, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for FLAC. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
FLAC = 0x103, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for ALAW. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
ALAW = 0x104, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for MULAW. Added in version 1.7.0.
|
|||
/// </summary>
|
|||
MULAW = 0x105, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for AMRNB. Currently not supported.
|
|||
/// </summary>
|
|||
AMRNB = 0x106, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for AMRWB. Currently not supported.
|
|||
/// </summary>
|
|||
AMRWB = 0x107, |
|||
|
|||
/// <summary>
|
|||
/// Stream ContainerFormat definition for any other or unknown format.
|
|||
/// </summary>
|
|||
ANY = 0x108 |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Represents the format specified inside WAV container.
|
|||
/// </summary>
|
|||
enum class AudioStreamWaveFormat |
|||
{ |
|||
/// <summary>
|
|||
/// AudioStreamWaveFormat definition for PCM (pulse-code modulated) data in integer format.
|
|||
/// </summary>
|
|||
PCM = 0x0001, |
|||
|
|||
/// <summary>
|
|||
/// AudioStreamWaveFormat definition A-law-encoded format.
|
|||
/// </summary>
|
|||
ALAW = 0x0006, |
|||
|
|||
/// <summary>
|
|||
/// AudioStreamWaveFormat definition for Mu-law-encoded format.
|
|||
/// </summary>
|
|||
MULAW = 0x0007, |
|||
|
|||
/// <summary>
|
|||
/// AudioStreamWaveFormat definition for G.722-encoded format.
|
|||
/// </summary>
|
|||
G722 = 0x028F |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Class to represent the audio stream format used for custom audio input configurations.
|
|||
/// Updated in version 1.5.0.
|
|||
/// </summary>
|
|||
class AudioStreamFormat |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~AudioStreamFormat() {} |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUDIOSTREAMFORMATHANDLE() const { return m_hformat.get(); } |
|||
|
|||
/// <summary>
|
|||
/// Creates an audio stream format object representing the default audio stream format (16 kHz, 16 bit, mono PCM).
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to AudioStreamFormat</returns>
|
|||
static std::shared_ptr<AudioStreamFormat> GetDefaultInputFormat() |
|||
{ |
|||
SPXAUDIOSTREAMFORMATHANDLE hformat = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_format_create_from_default_input(&hformat)); |
|||
|
|||
auto format = new AudioStreamFormat(hformat); |
|||
return std::shared_ptr<AudioStreamFormat>(format); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an audio stream format object with the specified PCM waveformat characteristics.
|
|||
/// </summary>
|
|||
/// <param name="samplesPerSecond">Samples per second.</param>
|
|||
/// <param name="bitsPerSample">Bits per sample.</param>
|
|||
/// <param name="channels">Number of channels in the waveform-audio data.</param>
|
|||
/// <param name="waveFormat">The format specified inside the WAV container.</param>
|
|||
/// <returns>A shared pointer to AudioStreamFormat</returns>
|
|||
static std::shared_ptr<AudioStreamFormat> GetWaveFormat(uint32_t samplesPerSecond, uint8_t bitsPerSample, uint8_t channels, AudioStreamWaveFormat waveFormat) |
|||
{ |
|||
SPXAUDIOSTREAMFORMATHANDLE hformat = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_format_create_from_waveformat(&hformat, samplesPerSecond, bitsPerSample, channels, (Audio_Stream_Wave_Format)waveFormat)); |
|||
|
|||
auto format = new AudioStreamFormat(hformat); |
|||
return std::shared_ptr<AudioStreamFormat>(format); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an audio stream format object with the specified PCM waveformat characteristics.
|
|||
/// </summary>
|
|||
/// <param name="samplesPerSecond">Samples per second.</param>
|
|||
/// <param name="bitsPerSample">Bits per sample.</param>
|
|||
/// <param name="channels">Number of channels in the waveform-audio data.</param>
|
|||
/// <returns>A shared pointer to AudioStreamFormat</returns>
|
|||
static std::shared_ptr<AudioStreamFormat> GetWaveFormatPCM(uint32_t samplesPerSecond, uint8_t bitsPerSample = 16, uint8_t channels = 1) |
|||
{ |
|||
SPXAUDIOSTREAMFORMATHANDLE hformat = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_format_create_from_waveformat(&hformat, samplesPerSecond, bitsPerSample, channels, Audio_Stream_Wave_Format::StreamWaveFormat_PCM)); |
|||
|
|||
auto format = new AudioStreamFormat(hformat); |
|||
return std::shared_ptr<AudioStreamFormat>(format); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an audio stream format object representing the default audio stream format (16 kHz, 16 bit, mono PCM).
|
|||
/// Added in version 1.4.0
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to AudioStreamFormat</returns>
|
|||
static std::shared_ptr<AudioStreamFormat> GetDefaultOutputFormat() |
|||
{ |
|||
SPXAUDIOSTREAMFORMATHANDLE hformat = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_format_create_from_default_output(&hformat)); |
|||
|
|||
auto format = new AudioStreamFormat(hformat); |
|||
return std::shared_ptr<AudioStreamFormat>(format); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an audio stream format object with the specified compressed audio container format, to be used as input format.
|
|||
/// Support added in 1.4.0.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Formats are defined in AudioStreamContainerFormat enum.
|
|||
/// </remarks>
|
|||
/// <param name="compressedFormat">Compressed format type.</param>
|
|||
/// <returns>A shared pointer to AudioStreamFormat.</returns>
|
|||
static std::shared_ptr<AudioStreamFormat> GetCompressedFormat(AudioStreamContainerFormat compressedFormat) |
|||
{ |
|||
SPXAUDIOSTREAMFORMATHANDLE hformat = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(audio_stream_format_create_from_compressed_format(&hformat, (Audio_Stream_Container_Format)compressedFormat)); |
|||
|
|||
auto format = new AudioStreamFormat(hformat); |
|||
return std::shared_ptr<AudioStreamFormat>(format); |
|||
} |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AudioStreamFormat(SPXAUDIOSTREAMFORMATHANDLE hformat) : m_hformat(hformat) { } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(AudioStreamFormat); |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the smart handle.
|
|||
/// </summary>
|
|||
SmartHandle<SPXAUDIOSTREAMFORMATHANDLE, &audio_stream_format_release> m_hformat; |
|||
}; |
|||
|
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Audio
|
|||
@ -0,0 +1,141 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
#include <sstream> |
|||
|
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_utils.h> |
|||
#include <speechapi_c_auto_detect_source_lang_config.h> |
|||
#include <speechapi_cxx_source_lang_config.h> |
|||
#include <stdarg.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Class that defines auto detection source configuration
|
|||
/// Updated in 1.13.0
|
|||
/// </summary>
|
|||
class AutoDetectSourceLanguageConfig |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXAUTODETECTSOURCELANGCONFIGHANDLE() const { return m_hconfig; } |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of the AutoDetectSourceLanguageConfig with open range as source languages
|
|||
/// Note: only <see cref="SpeechSynthesizer"/>, embedded speech translation and multilingual <see cref="TranslationRecognizer"/> support source language auto detection from open range,
|
|||
/// for <see cref="Recognizer"/>, please use AutoDetectSourceLanguageConfig with specific source languages.
|
|||
/// Added in 1.13.0
|
|||
/// </summary>
|
|||
/// <returns>A shared pointer to the new AutoDetectSourceLanguageConfig instance.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageConfig> FromOpenRange() |
|||
{ |
|||
SPXAUTODETECTSOURCELANGCONFIGHANDLE hconfig = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(create_auto_detect_source_lang_config_from_open_range(&hconfig)); |
|||
auto ptr = new AutoDetectSourceLanguageConfig(hconfig); |
|||
return std::shared_ptr<AutoDetectSourceLanguageConfig>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of the AutoDetectSourceLanguageConfig with source languages
|
|||
/// </summary>
|
|||
/// <param name="languages">The list of source languages.</param>
|
|||
/// <returns>A shared pointer to the new AutoDetectSourceLanguageConfig instance.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageConfig> FromLanguages(const std::vector<SPXSTRING>& languages) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, languages.empty()); |
|||
SPXAUTODETECTSOURCELANGCONFIGHANDLE hconfig = SPXHANDLE_INVALID; |
|||
|
|||
std::string languagesStr; |
|||
bool isFirst = true; |
|||
for (const SPXSTRING& language : languages) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, language.empty()); |
|||
if (!isFirst) |
|||
{ |
|||
languagesStr += ","; |
|||
} |
|||
isFirst = false; |
|||
languagesStr += Utils::ToUTF8(language); |
|||
} |
|||
SPX_THROW_ON_FAIL(create_auto_detect_source_lang_config_from_languages(&hconfig, languagesStr.c_str())); |
|||
auto ptr = new AutoDetectSourceLanguageConfig(hconfig); |
|||
return std::shared_ptr<AutoDetectSourceLanguageConfig>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of the AutoDetectSourceLanguageConfig with a list of source language config
|
|||
/// </summary>
|
|||
/// <param name="configList">The list of source languages config</param>
|
|||
/// <returns>A shared pointer to the new AutoDetectSourceLanguageConfig instance.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageConfig> FromSourceLanguageConfigs(std::vector<std::shared_ptr<Microsoft::CognitiveServices::Speech::SourceLanguageConfig>> configList) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, configList.empty()); |
|||
SPXAUTODETECTSOURCELANGCONFIGHANDLE hconfig = SPXHANDLE_INVALID; |
|||
|
|||
bool isFirst = true; |
|||
for (const auto& config : configList) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, config == nullptr); |
|||
if (isFirst) |
|||
{ |
|||
SPX_THROW_ON_FAIL(create_auto_detect_source_lang_config_from_source_lang_config(&hconfig, Utils::HandleOrInvalid<SPXSOURCELANGCONFIGHANDLE, SourceLanguageConfig>(config))); |
|||
isFirst = false; |
|||
} |
|||
else |
|||
{ |
|||
SPX_THROW_ON_FAIL(add_source_lang_config_to_auto_detect_source_lang_config(hconfig, Utils::HandleOrInvalid<SPXSOURCELANGCONFIGHANDLE, SourceLanguageConfig>(config))); |
|||
} |
|||
} |
|||
auto ptr = new AutoDetectSourceLanguageConfig(hconfig); |
|||
return std::shared_ptr<AutoDetectSourceLanguageConfig>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructs the object.
|
|||
/// </summary>
|
|||
virtual ~AutoDetectSourceLanguageConfig() |
|||
{ |
|||
auto_detect_source_lang_config_release(m_hconfig); |
|||
property_bag_release(m_propertybag); |
|||
} |
|||
|
|||
private: |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
explicit AutoDetectSourceLanguageConfig(SPXAUTODETECTSOURCELANGCONFIGHANDLE hconfig) |
|||
:m_hconfig(hconfig) |
|||
{ |
|||
SPX_THROW_ON_FAIL(auto_detect_source_lang_config_get_property_bag(hconfig, &m_propertybag)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the config
|
|||
/// </summary>
|
|||
SPXAUTODETECTSOURCELANGCONFIGHANDLE m_hconfig; |
|||
|
|||
/// <summary>
|
|||
/// Internal member variable that holds the properties of the speech config
|
|||
/// </summary>
|
|||
SPXPROPERTYBAGHANDLE m_propertybag; |
|||
|
|||
DISABLE_COPY_AND_MOVE(AutoDetectSourceLanguageConfig); |
|||
}; |
|||
|
|||
}}} |
|||
|
|||
@ -0,0 +1,85 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_c.h> |
|||
#include <speechapi_cxx_speech_recognition_result.h> |
|||
#include <speechapi_cxx_conversation_transcription_result.h> |
|||
#include <speechapi_cxx_translation_result.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Contains auto detected source language result
|
|||
/// Added in 1.8.0
|
|||
/// </summary>
|
|||
class AutoDetectSourceLanguageResult |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of AutoDetectSourceLanguageResult object for the speech recognition result.
|
|||
/// </summary>
|
|||
/// <param name="result">The speech recognition result.</param>
|
|||
/// <returns>A shared pointer to AutoDetectSourceLanguageResult.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageResult> FromResult(std::shared_ptr<SpeechRecognitionResult> result) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, result == nullptr); |
|||
auto ptr = new AutoDetectSourceLanguageResult(result); |
|||
return std::shared_ptr<AutoDetectSourceLanguageResult>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of AutoDetectSourceLanguageResult object for the speech translation result.
|
|||
/// </summary>
|
|||
/// <param name="result">The speech translation result.</param>
|
|||
/// <returns>A shared pointer to AutoDetectSourceLanguageResult.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageResult> FromResult(std::shared_ptr<Translation::TranslationRecognitionResult> result) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, result == nullptr); |
|||
auto ptr = new AutoDetectSourceLanguageResult(result); |
|||
return std::shared_ptr<AutoDetectSourceLanguageResult>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of AutoDetectSourceLanguageResult object for the convesation transcription result.
|
|||
/// </summary>
|
|||
/// <param name="result">The conversation transcription result.</param>
|
|||
/// <returns>A shared pointer to AutoDetectSourceLanguageResult.</returns>
|
|||
static std::shared_ptr<AutoDetectSourceLanguageResult> FromResult(std::shared_ptr<Microsoft::CognitiveServices::Speech::Transcription::ConversationTranscriptionResult> result) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, result == nullptr); |
|||
auto ptr = new AutoDetectSourceLanguageResult(result); |
|||
return std::shared_ptr<AutoDetectSourceLanguageResult>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The language value
|
|||
/// If this is empty, it means the system fails to detect the source language automatically
|
|||
/// </summary>
|
|||
const SPXSTRING Language; |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
// Using RecognitionResult pointer, so this can cover all classes that inherit from RecognitionResult
|
|||
AutoDetectSourceLanguageResult(std::shared_ptr<RecognitionResult> result) : |
|||
Language(result->Properties.GetProperty(PropertyId::SpeechServiceConnection_AutoDetectSourceLanguageResult)) |
|||
{ |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_DEFAULT_CTORS(AutoDetectSourceLanguageResult); |
|||
}; |
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,70 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_class_language_model.h: Public API declarations for ClassLanguageModel C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_grammar.h> |
|||
#include <speechapi_c.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents a list of grammars for dynamic grammar scenarios.
|
|||
/// Added in version 1.7.0.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// ClassLanguageModels are only usable in specific scenarios and are not generally available.
|
|||
/// </remarks>
|
|||
class ClassLanguageModel : public Grammar |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a class language model from a storage ID.
|
|||
/// </summary>
|
|||
/// <param name="storageId)">The persisted storage ID of the language model.</param>
|
|||
/// <returns>The grammar list associated with the recognizer.</returns>
|
|||
/// <remarks>
|
|||
/// Creating a ClassLanguageModel from a storage ID is only usable in specific scenarios and is not generally available.
|
|||
/// </remarks>
|
|||
static std::shared_ptr<ClassLanguageModel> FromStorageId(const SPXSTRING& storageId) |
|||
{ |
|||
SPXGRAMMARHANDLE hgrammar = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(class_language_model_from_storage_id(&hgrammar, Utils::ToUTF8(storageId.c_str()))); |
|||
|
|||
return std::make_shared<ClassLanguageModel>(hgrammar); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hgrammar">Class Language Model handle.</param>
|
|||
explicit ClassLanguageModel(SPXGRAMMARHANDLE hgrammar = SPXHANDLE_INVALID) : Grammar(hgrammar) { } |
|||
|
|||
/// <summary>
|
|||
/// Assigns a grammar to a class in the language mode.
|
|||
/// </summary>
|
|||
/// <param name="className">Name of the class to assign the grammar to.</param>
|
|||
/// <param name="grammar">Grammar to assign.</param>
|
|||
template <class T> |
|||
void AssignClass(const SPXSTRING& className, std::shared_ptr<T> grammar) |
|||
{ |
|||
SPX_THROW_ON_FAIL(class_language_model_assign_class(m_hgrammar.get(), Utils::ToUTF8(className.c_str()), (SPXPHRASEHANDLE)(*grammar.get()))); |
|||
} |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(ClassLanguageModel); |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,16 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_common.h: Public API declarations for global C++ APIs/namespaces
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_error.h> |
|||
#include <spxerror.h> |
|||
#include <azac_api_cxx_common.h> // must include after spxdebug.h or speechapi*.h (can NOT be included before) |
|||
|
|||
#define DISABLE_COPY_AND_MOVE(T) AZAC_DISABLE_COPY_AND_MOVE(T) |
|||
#define DISABLE_DEFAULT_CTORS(T) AZAC_DISABLE_DEFAULT_CTORS(T) |
|||
@ -0,0 +1,346 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_recognizer.h> |
|||
#include <speechapi_cxx_eventsignal.h> |
|||
#include <speechapi_cxx_connection_eventargs.h> |
|||
#include <speechapi_cxx_connection_message_eventargs.h> |
|||
#include <speechapi_c.h> |
|||
#include <speechapi_cxx_conversation_translator.h> |
|||
#include <speechapi_cxx_speech_synthesizer.h> |
|||
#include <speechapi_cxx_dialog_service_connector.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Connection is a proxy class for managing connection to the speech service of the specified Recognizer.
|
|||
/// By default, a Recognizer autonomously manages connection to service when needed.
|
|||
/// The Connection class provides additional methods for users to explicitly open or close a connection and
|
|||
/// to subscribe to connection status changes.
|
|||
/// The use of Connection is optional. It is intended for scenarios where fine tuning of application
|
|||
/// behavior based on connection status is needed. Users can optionally call Open() to manually
|
|||
/// initiate a service connection before starting recognition on the Recognizer associated with this Connection.
|
|||
/// After starting a recognition, calling Open() or Close() might fail. This will not impact
|
|||
/// the Recognizer or the ongoing recognition. Connection might drop for various reasons, the Recognizer will
|
|||
/// always try to reinstitute the connection as required to guarantee ongoing operations. In all these cases
|
|||
/// Connected/Disconnected events will indicate the change of the connection status.
|
|||
/// Updated in version 1.17.0.
|
|||
/// </summary>
|
|||
class Connection : public std::enable_shared_from_this<Connection> |
|||
{ |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Gets the Connection instance from the specified recognizer.
|
|||
/// </summary>
|
|||
/// <param name="recognizer">The recognizer associated with the connection.</param>
|
|||
/// <returns>The Connection instance of the recognizer.</returns>
|
|||
static std::shared_ptr<Connection> FromRecognizer(std::shared_ptr<Recognizer> recognizer) |
|||
{ |
|||
SPX_INIT_HR(hr); |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, recognizer == nullptr); |
|||
|
|||
SPXCONNECTIONHANDLE handle = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(hr = ::connection_from_recognizer(recognizer->m_hreco, &handle)); |
|||
|
|||
return std::make_shared<Connection>(handle); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the Connection instance from the specified conversation translator.
|
|||
/// </summary>
|
|||
/// <param name="convTrans">The conversation translator associated with the connection.</param>
|
|||
/// <returns>The Connection instance of the conversation translator.</returns>
|
|||
static std::shared_ptr<Connection> FromConversationTranslator(std::shared_ptr<Transcription::ConversationTranslator> convTrans) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, convTrans == nullptr); |
|||
|
|||
SPXCONNECTIONHANDLE handle = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(::connection_from_conversation_translator(convTrans->m_handle, &handle)); |
|||
|
|||
return std::make_shared<Connection>(handle); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the Connection instance from the specified dialog service connector, used for observing and managing
|
|||
/// connection and disconnection from the speech service.
|
|||
/// </summary>
|
|||
/// <param name="dialogServiceConnector">The dialog service connector associated with the connection.</param>
|
|||
/// <returns>The Connection instance of the dialog service connector.</returns>
|
|||
static std::shared_ptr<Connection> FromDialogServiceConnector(std::shared_ptr<Dialog::DialogServiceConnector> dialogServiceConnector) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, dialogServiceConnector == nullptr); |
|||
|
|||
SPXCONNECTIONHANDLE handle = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(::connection_from_dialog_service_connector(dialogServiceConnector->m_handle, &handle)); |
|||
|
|||
return std::make_shared<Connection>(handle); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the Connection instance from the specified speech synthesizer.
|
|||
/// Added in version 1.17.0
|
|||
/// </summary>
|
|||
/// <param name="synthesizer">The speech synthesizer associated with the connection.</param>
|
|||
/// <returns>The Connection instance of the speech synthesizer.</returns>
|
|||
static std::shared_ptr<Connection> FromSpeechSynthesizer(std::shared_ptr<SpeechSynthesizer> synthesizer) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, synthesizer == nullptr); |
|||
|
|||
SPXCONNECTIONHANDLE handle = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(::connection_from_speech_synthesizer(synthesizer->m_hsynth, &handle)); |
|||
|
|||
return std::make_shared<Connection>(handle); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Starts to set up connection to the service.
|
|||
/// Users can optionally call Open() to manually set up a connection in advance before starting recognition/synthesis on the
|
|||
/// Recognizer/Synthesizer associated with this Connection. After starting recognition, calling Open() might fail, depending on
|
|||
/// the process state of the Recognizer/Synthesizer. But the failure does not affect the state of the associated Recognizer/Synthesizer.
|
|||
/// Note: On return, the connection might not be ready yet. Please subscribe to the Connected event to
|
|||
/// be notified when the connection is established.
|
|||
/// </summary>
|
|||
/// <param name="forContinuousRecognition">Indicates whether the connection is used for continuous recognition or single-shot recognition. It takes no effect if the connection is from SpeechSynthsizer.</param>
|
|||
void Open(bool forContinuousRecognition) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_connectionHandle == SPXHANDLE_INVALID); |
|||
SPX_THROW_ON_FAIL(::connection_open(m_connectionHandle, forContinuousRecognition)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Closes the connection the service.
|
|||
/// Users can optionally call Close() to manually shutdown the connection of the associated Recognizer/Synthesizer. The call
|
|||
/// might fail, depending on the process state of the Recognizer/Synthesizer. But the failure does not affect the state of the
|
|||
/// associated Recognizer/Synthesizer.
|
|||
/// </summary>
|
|||
void Close() |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_connectionHandle == SPXHANDLE_INVALID); |
|||
SPX_THROW_ON_FAIL(::connection_close(m_connectionHandle)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Appends a parameter in a message to service.
|
|||
/// Added in version 1.7.0.
|
|||
/// </summary>
|
|||
/// <param name="path">the message path.</param>
|
|||
/// <param name="propertyName">Name of the property.</param>
|
|||
/// <param name="propertyValue">Value of the property. This is a json string.</param>
|
|||
/// <returns>void.</returns>
|
|||
void SetMessageProperty(const SPXSTRING& path, const SPXSTRING& propertyName, const SPXSTRING& propertyValue) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_connectionHandle == SPXHANDLE_INVALID); |
|||
SPX_THROW_ON_FAIL(::connection_set_message_property(m_connectionHandle, Utils::ToUTF8(path).c_str(), Utils::ToUTF8(propertyName).c_str(), Utils::ToUTF8(propertyValue).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Send a message to the speech service.
|
|||
/// Added in version 1.7.0.
|
|||
/// </summary>
|
|||
/// <param name="path">The path of the message.</param>
|
|||
/// <param name="payload">The payload of the message. This is a json string.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> SendMessageAsync(const SPXSTRING& path, const SPXSTRING& payload) |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keep_alive, this, path, payload]() -> void { |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_connectionHandle == SPXHANDLE_INVALID); |
|||
SPX_THROW_ON_FAIL(::connection_send_message(m_connectionHandle, Utils::ToUTF8(path.c_str()), Utils::ToUTF8(payload.c_str()))); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Send a binary message to the speech service.
|
|||
/// This method doesn't work for the connection of SpeechSynthesizer.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
/// <param name="path">The path of the message.</param>
|
|||
/// <param name="payload">The binary payload of the message.</param>
|
|||
/// <param name="size">The size of the binary payload.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> SendMessageAsync(const SPXSTRING& path, uint8_t* payload, uint32_t size) |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keep_alive, this, path, payload, size]() -> void { |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_connectionHandle == SPXHANDLE_INVALID); |
|||
SPX_THROW_ON_FAIL(::connection_send_message_data(m_connectionHandle, Utils::ToUTF8(path.c_str()), payload, size)); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The Connected event to indicate that the recognizer is connected to service.
|
|||
/// </summary>
|
|||
EventSignal<const ConnectionEventArgs&> Connected; |
|||
|
|||
/// <summary>
|
|||
/// The Disconnected event to indicate that the recognizer is disconnected from service.
|
|||
/// </summary>
|
|||
EventSignal<const ConnectionEventArgs&> Disconnected; |
|||
|
|||
/// <summary>
|
|||
/// The MessageReceived event to indicate that the underlying protocol received a message from the service.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
EventSignal<const ConnectionMessageEventArgs&> MessageReceived; |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="handle">The connection handle.</param>
|
|||
explicit Connection(SPXCONNECTIONHANDLE handle) : |
|||
Connected(GetConnectionEventConnectionsChangedCallback(), GetConnectionEventConnectionsChangedCallback()), |
|||
Disconnected(GetConnectionEventConnectionsChangedCallback(), GetConnectionEventConnectionsChangedCallback()), |
|||
MessageReceived(GetConnectionMessageEventConnectionsChangedCallback(), GetConnectionMessageEventConnectionsChangedCallback()), |
|||
m_connectionHandle(handle) |
|||
{ |
|||
SPX_DBG_TRACE_FUNCTION(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
~Connection() |
|||
{ |
|||
SPX_DBG_TRACE_FUNCTION(); |
|||
|
|||
try |
|||
{ |
|||
Disconnected.DisconnectAll(); |
|||
Connected.DisconnectAll(); |
|||
} |
|||
catch (const std::exception& ex) |
|||
{ |
|||
SPX_TRACE_ERROR("Exception caught in ~Connection(): %s", ex.what()); |
|||
(void)ex; |
|||
} |
|||
catch (...) |
|||
{ |
|||
SPX_TRACE_ERROR("Unknown exception happened during ~Connection()."); |
|||
} |
|||
|
|||
if (m_connectionHandle != SPXHANDLE_INVALID) |
|||
{ |
|||
::connection_handle_release(m_connectionHandle); |
|||
m_connectionHandle = SPXHANDLE_INVALID; |
|||
} |
|||
} |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(Connection); |
|||
|
|||
SPXCONNECTIONHANDLE m_connectionHandle; |
|||
|
|||
static void FireConnectionEvent(bool firingConnectedEvent, SPXEVENTHANDLE event, void* context) |
|||
{ |
|||
std::exception_ptr p; |
|||
try |
|||
{ |
|||
std::unique_ptr<ConnectionEventArgs> connectionEvent{ new ConnectionEventArgs(event) }; |
|||
|
|||
auto connection = static_cast<Connection*>(context); |
|||
auto keepAlive = connection->shared_from_this(); |
|||
if (firingConnectedEvent) |
|||
{ |
|||
connection->Connected.Signal(*connectionEvent.get()); |
|||
} |
|||
else |
|||
{ |
|||
connection->Disconnected.Signal(*connectionEvent.get()); |
|||
} |
|||
} |
|||
|
|||
#ifdef SHOULD_HANDLE_FORCED_UNWIND |
|||
// Currently Python forcibly kills the thread by throwing __forced_unwind,
|
|||
// taking care we propagate this exception further.
|
|||
catch (abi::__forced_unwind&) |
|||
{ |
|||
SPX_TRACE_ERROR("__forced_unwind exception caught in FireConnectionEvent."); |
|||
throw; |
|||
} |
|||
#endif |
|||
catch (...) |
|||
{ |
|||
if (recognizer_event_handle_is_valid(event)) { |
|||
recognizer_event_handle_release(event); |
|||
} |
|||
SPX_TRACE_ERROR("Caught exception in FireConnectionEvent(%s). Will rethrow later.", firingConnectedEvent ? "Connected" : "Disconnected"); |
|||
throw; |
|||
} |
|||
|
|||
// ConnectionEventArgs doesn't hold hevent, and thus can't release it properly ... release it here
|
|||
SPX_DBG_ASSERT(recognizer_event_handle_is_valid(event)); |
|||
recognizer_event_handle_release(event); |
|||
} |
|||
|
|||
static void FireEvent_Connected(SPXEVENTHANDLE event, void* context) |
|||
{ |
|||
FireConnectionEvent(true, event, context); |
|||
} |
|||
|
|||
static void FireEvent_Disconnected(SPXEVENTHANDLE event, void* context) |
|||
{ |
|||
FireConnectionEvent(false, event, context); |
|||
} |
|||
|
|||
static void FireEvent_MessageReceived(SPXEVENTHANDLE event, void* context) |
|||
{ |
|||
std::unique_ptr<ConnectionMessageEventArgs> connectionEvent { new ConnectionMessageEventArgs(event) }; |
|||
|
|||
auto connection = static_cast<Connection*>(context); |
|||
auto keepAlive = connection->shared_from_this(); |
|||
connection->MessageReceived.Signal(*connectionEvent.get()); |
|||
} |
|||
|
|||
void ConnectionEventConnectionsChanged(const EventSignal<const ConnectionEventArgs&>& connectionEvent) |
|||
{ |
|||
if (m_connectionHandle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_connectionHandle=0x%8p", __FUNCTION__, (void*)m_connectionHandle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::connection_handle_is_valid(m_connectionHandle), "%s: m_connectionHandle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&connectionEvent == &Connected) |
|||
{ |
|||
SPX_THROW_ON_FAIL(connection_connected_set_callback(m_connectionHandle, Connected.IsConnected() ? FireEvent_Connected : nullptr, this)); |
|||
} |
|||
else if (&connectionEvent == &Disconnected) |
|||
{ |
|||
SPX_THROW_ON_FAIL(connection_disconnected_set_callback(m_connectionHandle, Disconnected.IsConnected() ? FireEvent_Disconnected : nullptr, this)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void ConnectionMessageEventConnectionsChanged(const EventSignal<const ConnectionMessageEventArgs&>& connectionEvent) |
|||
{ |
|||
if (m_connectionHandle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_connectionHandle=0x%8p", __FUNCTION__, (void*)m_connectionHandle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::connection_handle_is_valid(m_connectionHandle), "%s: m_connectionHandle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&connectionEvent == &MessageReceived) |
|||
{ |
|||
SPX_THROW_ON_FAIL(connection_message_received_set_callback(m_connectionHandle, MessageReceived.IsConnected() ? FireEvent_MessageReceived : nullptr, this)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
inline std::function<void(const EventSignal<const ConnectionEventArgs&>&)> GetConnectionEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const ConnectionEventArgs&>& connectionEvent) { this->ConnectionEventConnectionsChanged(connectionEvent); }; |
|||
} |
|||
|
|||
inline std::function<void(const EventSignal<const ConnectionMessageEventArgs&>&)> GetConnectionMessageEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const ConnectionMessageEventArgs&>& connectionEvent) { this->ConnectionMessageEventConnectionsChanged(connectionEvent); }; |
|||
} |
|||
}; |
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,68 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_session_eventargs.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Provides data for the ConnectionEvent.
|
|||
/// Added in version 1.2.0.
|
|||
/// </summary>
|
|||
class ConnectionEventArgs : public SessionEventArgs |
|||
{ |
|||
protected: |
|||
/*! \cond PRIVATE */ |
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXEVENTHANDLE hevent) : |
|||
PropertyCollection([=]() |
|||
{ |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
recognizer_connection_event_get_property_bag(hevent, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{} |
|||
}; |
|||
|
|||
PrivatePropertyCollection m_properties; |
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// </summary>
|
|||
/// <param name="hevent">Event handle.</param>
|
|||
explicit ConnectionEventArgs(SPXEVENTHANDLE hevent) : |
|||
SessionEventArgs(hevent), |
|||
m_properties(hevent), |
|||
Properties(m_properties) |
|||
{ |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
virtual ~ConnectionEventArgs() {} |
|||
|
|||
/// <summary>
|
|||
/// Collection of additional properties.
|
|||
/// </summary>
|
|||
const PropertyCollection& Properties; |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(ConnectionEventArgs); |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,152 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_connection_message.h: Public API declarations for ConnectionMessage C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <vector> |
|||
#include <speechapi_c_connection.h> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_session_eventargs.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// ConnectionMessage represents implementation specific messages sent to and received from
|
|||
/// the speech service. These messages are provided for debugging purposes and should not
|
|||
/// be used for production use cases with the Azure Cognitive Services Speech Service.
|
|||
/// Messages sent to and received from the Speech Service are subject to change without
|
|||
/// notice. This includes message contents, headers, payloads, ordering, etc.
|
|||
/// Added in version 1.10.0.
|
|||
/// </summary>
|
|||
class ConnectionMessage |
|||
{ |
|||
private: |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXCONNECTIONMESSAGEHANDLE hcm) : |
|||
PropertyCollection( |
|||
[=]() { |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
::connection_message_get_property_bag(hcm, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
SPXCONNECTIONMESSAGEHANDLE m_hcm; |
|||
PrivatePropertyCollection m_properties; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// </summary>
|
|||
/// <param name="hcm">Event handle.</param>
|
|||
explicit ConnectionMessage(SPXCONNECTIONMESSAGEHANDLE hcm) : |
|||
m_hcm(hcm), |
|||
m_properties(hcm), |
|||
Properties(m_properties) |
|||
{ |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
virtual ~ConnectionMessage() |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p, handle=0x%p)", __FUNCTION__, (void*)this, (void*)m_hcm); |
|||
SPX_THROW_ON_FAIL(::connection_message_handle_release(m_hcm)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the message path.
|
|||
/// </summary>
|
|||
/// <returns>An std::string containing the message path.</returns>
|
|||
std::string GetPath() const |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_hcm == SPXHANDLE_INVALID); |
|||
return m_properties.GetProperty("connection.message.path"); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Checks to see if the ConnectionMessage is a text message.
|
|||
/// See also IsBinaryMessage().
|
|||
/// </summary>
|
|||
/// <returns>A bool indicated if the message payload is text.</returns>
|
|||
bool IsTextMessage() const |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_hcm == SPXHANDLE_INVALID); |
|||
return m_properties.GetProperty("connection.message.type") == "text"; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Checks to see if the ConnectionMessage is a binary message.
|
|||
/// See also GetBinaryMessage().
|
|||
/// </summary>
|
|||
/// <returns>A bool indicated if the message payload is binary.</returns>
|
|||
bool IsBinaryMessage() const |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_hcm == SPXHANDLE_INVALID); |
|||
return m_properties.GetProperty("connection.message.type") == "binary"; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the text message payload. Typically the text message content-type is
|
|||
/// application/json. To determine other content-types use
|
|||
/// Properties.GetProperty("Content-Type").
|
|||
/// </summary>
|
|||
/// <returns>An std::string containing the text message.</returns>
|
|||
std::string GetTextMessage() const |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_hcm == SPXHANDLE_INVALID); |
|||
return m_properties.GetProperty("connection.message.text.message"); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the binary message payload.
|
|||
/// </summary>
|
|||
/// <returns>An std::vector<uint8_t> containing the binary message.</returns>
|
|||
std::vector<uint8_t> GetBinaryMessage() const |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_HANDLE, m_hcm == SPXHANDLE_INVALID); |
|||
auto size = ::connection_message_get_data_size(m_hcm); |
|||
|
|||
std::vector<uint8_t> message(size); |
|||
SPX_THROW_ON_FAIL(::connection_message_get_data(m_hcm, message.data(), size)); |
|||
|
|||
return message; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// A collection of properties and their values defined for this <see cref="ConnectionMessage"/>.
|
|||
/// Message headers can be accessed via this collection (e.g. "Content-Type").
|
|||
/// </summary>
|
|||
PropertyCollection& Properties; |
|||
|
|||
private: |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
DISABLE_COPY_AND_MOVE(ConnectionMessage); |
|||
|
|||
/*! \endcond */ |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,79 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_connection_message_eventargs.h: Public API declarations for ConnectionMessageEventArgs C++ base class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_eventargs.h> |
|||
#include <speechapi_cxx_connection_message.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Provides data for the ConnectionMessageEvent
|
|||
/// </summary>
|
|||
class ConnectionMessageEventArgs : public EventArgs |
|||
{ |
|||
private: |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
SPXEVENTHANDLE m_hevent; |
|||
std::shared_ptr<ConnectionMessage> m_message; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hevent">Event handle.</param>
|
|||
explicit ConnectionMessageEventArgs(SPXEVENTHANDLE hevent) : |
|||
m_hevent(hevent), |
|||
m_message(std::make_shared<ConnectionMessage>(MessageHandleFromEventHandle(hevent))) |
|||
{ |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
virtual ~ConnectionMessageEventArgs() |
|||
{ |
|||
SPX_THROW_ON_FAIL(::connection_message_received_event_handle_release(m_hevent)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the <see cref="ConnectionMessage"/> associated with this <see cref="ConnectionMessageEventArgs"/>.
|
|||
/// </summary>
|
|||
/// <returns>An `std::shared<ConnectionMessage>` containing the message.</returns>
|
|||
std::shared_ptr<ConnectionMessage> GetMessage() const { return m_message; } |
|||
|
|||
private: |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
DISABLE_COPY_AND_MOVE(ConnectionMessageEventArgs); |
|||
|
|||
SPXCONNECTIONMESSAGEHANDLE MessageHandleFromEventHandle(SPXEVENTHANDLE hevent) |
|||
{ |
|||
SPXCONNECTIONMESSAGEHANDLE hcm = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(::connection_message_received_event_get_message(hevent, &hcm)); |
|||
return hcm; |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,340 @@ |
|||
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation.h: Public API declarations for Conversation C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <exception> |
|||
#include <future> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <cstring> |
|||
|
|||
#include <speechapi_c.h> |
|||
|
|||
#include <speechapi_cxx_speech_config.h> |
|||
#include <speechapi_cxx_utils.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_user.h> |
|||
#include <speechapi_cxx_participant.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Transcription { |
|||
|
|||
/// <summary>
|
|||
/// Class for conversation.
|
|||
/// Added in version 1.8.0
|
|||
/// </summary>
|
|||
class Conversation : public std::enable_shared_from_this<Conversation> |
|||
{ |
|||
public: |
|||
|
|||
static constexpr size_t MAX_CONVERSATION_ID_LEN = 1024; |
|||
|
|||
/// <summary>
|
|||
/// Create a conversation using a speech config and an optional conversation id.
|
|||
/// </summary>
|
|||
/// <param name="speechConfig">A shared smart pointer of a speech config object.</param>
|
|||
/// <param name="conversationId">Conversation Id.</param>
|
|||
/// <returns>A shared smart pointer of the created conversation object.</returns>
|
|||
static std::future<std::shared_ptr<Conversation>> CreateConversationAsync(std::shared_ptr<SpeechConfig> speechConfig, const SPXSTRING& conversationId = SPXSTRING()) |
|||
{ |
|||
auto future = std::async(std::launch::async, [conversationId, speechConfig]() -> std::shared_ptr<Conversation> { |
|||
SPXCONVERSATIONHANDLE hconversation; |
|||
SPX_THROW_ON_FAIL(conversation_create_from_config(&hconversation, (SPXSPEECHCONFIGHANDLE)(*speechConfig), Utils::ToUTF8(conversationId).c_str())); |
|||
return std::make_shared<Conversation>(hconversation); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hconversation">Recognizer handle.</param>
|
|||
explicit Conversation(SPXCONVERSATIONHANDLE hconversation) : |
|||
m_hconversation(hconversation), |
|||
m_properties(hconversation), |
|||
Properties(m_properties) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
~Conversation() |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
|
|||
::conversation_release_handle(m_hconversation); |
|||
m_hconversation = SPXHANDLE_INVALID; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXCONVERSATIONHANDLE () const { return m_hconversation; } |
|||
|
|||
/// <summary>
|
|||
/// Get the conversation id.
|
|||
/// </summary>
|
|||
/// <returns>Conversation id.</returns>
|
|||
SPXSTRING GetConversationId() |
|||
{ |
|||
char id[MAX_CONVERSATION_ID_LEN + 1]; |
|||
std::memset(id, 0, MAX_CONVERSATION_ID_LEN); |
|||
SPX_THROW_ON_FAIL(conversation_get_conversation_id(m_hconversation, id, MAX_CONVERSATION_ID_LEN)); |
|||
return id; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Add a participant to a conversation using the user's id.
|
|||
///
|
|||
/// Note: The returned participant can be used to remove. If the client changes the participant's attributes,
|
|||
/// the changed attributes are passed on to the service only when the participant is added again.
|
|||
/// </summary>
|
|||
/// <param name="userId">A user id.</param>
|
|||
/// <returns>a shared smart pointer of the participant.</returns>
|
|||
std::future<std::shared_ptr<Participant>> AddParticipantAsync(const SPXSTRING& userId) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, userId]() -> std::shared_ptr<Participant> { |
|||
const auto participant = Participant::From(userId); |
|||
SPX_THROW_ON_FAIL(conversation_update_participant(m_hconversation, true, (SPXPARTICIPANTHANDLE)(*participant))); |
|||
return participant; |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Add a participant to a conversation using the User object.
|
|||
/// </summary>
|
|||
/// <param name="user">A shared smart pointer to a User object.</param>
|
|||
/// <returns>The passed in User object.</returns>
|
|||
std::future<std::shared_ptr<User>> AddParticipantAsync(const std::shared_ptr<User>& user) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, user]() -> std::shared_ptr<User> { |
|||
SPX_THROW_ON_FAIL(conversation_update_participant_by_user(m_hconversation, true, (SPXUSERHANDLE)(*user))); |
|||
return user; |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Add a participant to a conversation using the participant object
|
|||
/// </summary>
|
|||
/// <param name="participant">A shared smart pointer to a participant object.</param>
|
|||
/// <returns>The passed in participant object.</returns>
|
|||
std::future<std::shared_ptr<Participant>> AddParticipantAsync(const std::shared_ptr<Participant>& participant) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, participant]() -> std::shared_ptr<Participant> { |
|||
SPX_THROW_ON_FAIL(conversation_update_participant(m_hconversation, true, (SPXPARTICIPANTHANDLE)(*participant))); |
|||
return participant; |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Remove a participant from a conversation using the participant object
|
|||
/// </summary>
|
|||
/// <param name="participant">A shared smart pointer of a participant object.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> RemoveParticipantAsync(const std::shared_ptr<Participant>& participant) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, participant]() -> void { |
|||
SPX_THROW_ON_FAIL(conversation_update_participant(m_hconversation, false, (SPXPARTICIPANTHANDLE)(*participant))); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Remove a participant from a conversation using the User object
|
|||
/// </summary>
|
|||
/// <param name="user">A smart pointer of a User.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> RemoveParticipantAsync(const std::shared_ptr<User>& user) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, user]() -> void { |
|||
SPX_THROW_ON_FAIL(conversation_update_participant_by_user(m_hconversation, false, SPXUSERHANDLE(*user))); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Remove a participant from a conversation using a user id string.
|
|||
/// </summary>
|
|||
/// <param name="userId">A user id.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> RemoveParticipantAsync(const SPXSTRING& userId) |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this, userId]() -> void { |
|||
SPX_THROW_ON_FAIL(conversation_update_participant_by_user_id(m_hconversation, false, Utils::ToUTF8(userId.c_str()))); |
|||
}); |
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Ends the current conversation.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> EndConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_end_conversation); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the authorization token that will be used for connecting the server.
|
|||
/// </summary>
|
|||
/// <param name="token">The authorization token.</param>
|
|||
void SetAuthorizationToken(const SPXSTRING& token) |
|||
{ |
|||
Properties.SetProperty(PropertyId::SpeechServiceAuthorization_Token, token); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the authorization token.
|
|||
/// </summary>
|
|||
/// <returns>Authorization token</returns>
|
|||
SPXSTRING GetAuthorizationToken() |
|||
{ |
|||
return Properties.GetProperty(PropertyId::SpeechServiceAuthorization_Token, SPXSTRING()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Start the conversation.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> StartConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_start_conversation); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Deletes the conversation. Any participants that are still part of the converation
|
|||
/// will be ejected after this call.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> DeleteConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_delete_conversation); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Locks the conversation. After this no new participants will be able to join.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> LockConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_lock_conversation); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Unlocks the conversation.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> UnlockConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_unlock_conversation); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Mutes all participants except for the host. This prevents others from generating
|
|||
/// transcriptions, or sending text messages.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> MuteAllParticipantsAsync() |
|||
{ |
|||
return RunAsync(::conversation_mute_all_participants); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Allows other participants to generate transcriptions, or send text messages.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> UnmuteAllParticipantsAsync() |
|||
{ |
|||
return RunAsync(::conversation_unmute_all_participants); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Mutes a particular participant. This will prevent them generating new transcriptions,
|
|||
/// or sending text messages.
|
|||
/// </summary>
|
|||
/// <param name="participantId">The identifier for the participant.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> MuteParticipantAsync(const SPXSTRING& participantId) |
|||
{ |
|||
return RunAsync([participantId = Utils::ToUTF8(participantId)](auto handle) |
|||
{ |
|||
return ::conversation_mute_participant(handle, participantId.c_str()); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Unmutes a particular participant.
|
|||
/// </summary>
|
|||
/// <param name="participantId">The identifier for the participant.</param>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> UnmuteParticipantAsync(const SPXSTRING& participantId) |
|||
{ |
|||
return RunAsync([participantId = Utils::ToUTF8(participantId)](auto handle) |
|||
{ |
|||
return ::conversation_unmute_participant(handle, participantId.c_str()); |
|||
}); |
|||
} |
|||
|
|||
private: |
|||
|
|||
/*! \cond PRIVATE */ |
|||
|
|||
SPXCONVERSATIONHANDLE m_hconversation; |
|||
|
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXCONVERSATIONHANDLE hconv) : |
|||
PropertyCollection( |
|||
[=]() { |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
conversation_get_property_bag(hconv, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
PrivatePropertyCollection m_properties; |
|||
|
|||
inline std::future<void> RunAsync(std::function<SPXHR(SPXCONVERSATIONHANDLE)> func) |
|||
{ |
|||
auto keepalive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keepalive, this, func]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(func(m_hconversation)); |
|||
}); |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// A collection of properties and their values defined for this <see cref="Conversation"/>.
|
|||
/// </summary>
|
|||
PropertyCollection& Properties; |
|||
|
|||
}; |
|||
|
|||
}}}} |
|||
@ -0,0 +1,509 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation_transcriber.h: Public API declarations for ConversationTranscriber C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <exception> |
|||
#include <future> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_c.h> |
|||
#include <speechapi_cxx_recognizer.h> |
|||
#include <speechapi_cxx_conversation_transcription_eventargs.h> |
|||
#include <speechapi_cxx_conversation_transcription_result.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_speech_config.h> |
|||
#include <speechapi_cxx_audio_stream.h> |
|||
#include <speechapi_cxx_auto_detect_source_lang_config.h> |
|||
#include <speechapi_cxx_source_lang_config.h> |
|||
#include <speechapi_cxx_audio_config.h> |
|||
#include <speechapi_cxx_utils.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Transcription { |
|||
|
|||
class Session; |
|||
|
|||
/// <summary>
|
|||
/// Class for ConversationTranscribers.
|
|||
/// </summary>
|
|||
class ConversationTranscriber final : public Recognizer |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Create a conversation transcriber from a speech config
|
|||
/// </summary>
|
|||
/// <param name="speechconfig">Speech configuration.</param>
|
|||
/// <returns>A smart pointer wrapped conversation transcriber pointer.</returns>
|
|||
static std::shared_ptr<ConversationTranscriber> FromConfig(std::shared_ptr<SpeechConfig> speechconfig, std::nullptr_t) |
|||
{ |
|||
SPXRECOHANDLE hreco; |
|||
SPX_THROW_ON_FAIL(::recognizer_create_conversation_transcriber_from_config( |
|||
&hreco, |
|||
Utils::HandleOrInvalid<SPXSPEECHCONFIGHANDLE, SpeechConfig>(speechconfig), |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(nullptr))); |
|||
return std::make_shared<ConversationTranscriber>(hreco); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a conversation transcriber from a speech config and audio config.
|
|||
/// </summary>
|
|||
/// <param name="speechconfig">Speech configuration.</param>
|
|||
/// <param name="audioInput">Audio configuration.</param>
|
|||
/// <returns>A smart pointer wrapped conversation transcriber pointer.</returns>
|
|||
static std::shared_ptr<ConversationTranscriber> FromConfig(std::shared_ptr<SpeechConfig> speechconfig, std::shared_ptr<Audio::AudioConfig> audioInput = nullptr) |
|||
{ |
|||
SPXRECOHANDLE hreco; |
|||
SPX_THROW_ON_FAIL(::recognizer_create_conversation_transcriber_from_config( |
|||
&hreco, |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE,SpeechConfig>(speechconfig), |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(audioInput))); |
|||
return std::make_shared<ConversationTranscriber>(hreco); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a conversation transcriber from a speech config, auto detection source language config and audio config
|
|||
/// </summary>
|
|||
/// <param name="speechconfig">Speech configuration.</param>
|
|||
/// <param name="autoDetectSourceLangConfig">Auto detection source language config.</param>
|
|||
/// <param name="audioInput">Audio configuration.</param>
|
|||
/// <returns>A smart pointer wrapped conversation trasncriber pointer.</returns>
|
|||
static std::shared_ptr<ConversationTranscriber> FromConfig( |
|||
std::shared_ptr<SpeechConfig> speechconfig, |
|||
std::shared_ptr<AutoDetectSourceLanguageConfig> autoDetectSourceLangConfig, |
|||
std::shared_ptr<Audio::AudioConfig> audioInput = nullptr) |
|||
{ |
|||
SPXRECOHANDLE hreco; |
|||
SPX_THROW_ON_FAIL(::recognizer_create_conversation_transcriber_from_auto_detect_source_lang_config( |
|||
&hreco, |
|||
Utils::HandleOrInvalid<SPXSPEECHCONFIGHANDLE, SpeechConfig>(speechconfig), |
|||
Utils::HandleOrInvalid<SPXAUTODETECTSOURCELANGCONFIGHANDLE, AutoDetectSourceLanguageConfig>(autoDetectSourceLangConfig), |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(audioInput))); |
|||
return std::make_shared<ConversationTranscriber>(hreco); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a conversation transcriber from a speech config, source language config and audio config
|
|||
/// </summary>
|
|||
/// <param name="speechconfig">Speech configuration.</param>
|
|||
/// <param name="sourceLanguageConfig">Source language config.</param>
|
|||
/// <param name="audioInput">Audio configuration.</param>
|
|||
/// <returns>A smart pointer wrapped conversation transcriber pointer.</returns>
|
|||
static std::shared_ptr<ConversationTranscriber> FromConfig( |
|||
std::shared_ptr<SpeechConfig> speechconfig, |
|||
std::shared_ptr<SourceLanguageConfig> sourceLanguageConfig, |
|||
std::shared_ptr<Audio::AudioConfig> audioInput = nullptr) |
|||
{ |
|||
SPXRECOHANDLE hreco; |
|||
SPX_THROW_ON_FAIL(::recognizer_create_conversation_transcriber_from_source_lang_config( |
|||
&hreco, |
|||
Utils::HandleOrInvalid<SPXSPEECHCONFIGHANDLE, SpeechConfig>(speechconfig), |
|||
Utils::HandleOrInvalid<SPXSOURCELANGCONFIGHANDLE, SourceLanguageConfig>(sourceLanguageConfig), |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(audioInput))); |
|||
return std::make_shared<ConversationTranscriber>(hreco); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Create a conversation transcriber from a speech config, source language and audio config
|
|||
/// </summary>
|
|||
/// <param name="speechconfig">Speech configuration.</param>
|
|||
/// <param name="sourceLanguage">Source language.</param>
|
|||
/// <param name="audioInput">Audio configuration.</param>
|
|||
/// <returns>A smart pointer wrapped conversation transcriber pointer.</returns>
|
|||
static std::shared_ptr<ConversationTranscriber> FromConfig( |
|||
std::shared_ptr<SpeechConfig> speechconfig, |
|||
const SPXSTRING& sourceLanguage, |
|||
std::shared_ptr<Audio::AudioConfig> audioInput = nullptr) |
|||
{ |
|||
return FromConfig(speechconfig, SourceLanguageConfig::FromLanguage(sourceLanguage), audioInput); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Asynchronously starts a conversation transcribing.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> StartTranscribingAsync() |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this]() -> void { |
|||
SPX_INIT_HR(hr); |
|||
SPX_THROW_ON_FAIL(hr = recognizer_async_handle_release(m_hasyncStartContinuous)); // close any unfinished previous attempt
|
|||
|
|||
SPX_EXITFN_ON_FAIL(hr = recognizer_start_continuous_recognition_async(m_hreco, &m_hasyncStartContinuous)); |
|||
SPX_EXITFN_ON_FAIL(hr = recognizer_start_continuous_recognition_async_wait_for(m_hasyncStartContinuous, UINT32_MAX)); |
|||
|
|||
SPX_EXITFN_CLEANUP: |
|||
auto releaseHr = recognizer_async_handle_release(m_hasyncStartContinuous); |
|||
SPX_REPORT_ON_FAIL(releaseHr); |
|||
m_hasyncStartContinuous = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(hr); |
|||
}); |
|||
|
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Asynchronously stops a conversation transcribing.
|
|||
/// </summary>
|
|||
/// <returns>An empty future.</returns>
|
|||
std::future<void> StopTranscribingAsync() |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this]() -> void { |
|||
SPX_INIT_HR(hr); |
|||
SPX_THROW_ON_FAIL(hr = recognizer_async_handle_release(m_hasyncStopContinuous)); // close any unfinished previous attempt
|
|||
|
|||
SPX_EXITFN_ON_FAIL(hr = recognizer_stop_continuous_recognition_async(m_hreco, &m_hasyncStopContinuous)); |
|||
SPX_EXITFN_ON_FAIL(hr = recognizer_stop_continuous_recognition_async_wait_for(m_hasyncStopContinuous, UINT32_MAX)); |
|||
|
|||
SPX_EXITFN_CLEANUP: |
|||
auto releaseHr = recognizer_async_handle_release(m_hasyncStopContinuous); |
|||
SPX_REPORT_ON_FAIL(releaseHr); |
|||
m_hasyncStopContinuous = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(hr); |
|||
}); |
|||
|
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hreco">Recognizer handle.</param>
|
|||
explicit ConversationTranscriber(SPXRECOHANDLE hreco) throw() : |
|||
Recognizer(hreco), |
|||
SessionStarted(GetSessionEventConnectionsChangedCallback()), |
|||
SessionStopped(GetSessionEventConnectionsChangedCallback()), |
|||
SpeechStartDetected(GetRecognitionEventConnectionsChangedCallback()), |
|||
SpeechEndDetected(GetRecognitionEventConnectionsChangedCallback()), |
|||
Transcribing(GetRecoEventConnectionsChangedCallback()), |
|||
Transcribed(GetRecoEventConnectionsChangedCallback()), |
|||
Canceled(GetRecoCanceledEventConnectionsChangedCallback()), |
|||
m_hasyncStartContinuous(SPXHANDLE_INVALID), |
|||
m_hasyncStopContinuous(SPXHANDLE_INVALID), |
|||
m_properties(hreco), |
|||
Properties(m_properties) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
~ConversationTranscriber() |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
TermRecognizer(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the start of a recognition session (operation).
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStarted; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the end of a recognition session (operation).
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStopped; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the start of speech.
|
|||
/// </summary>
|
|||
EventSignal<const RecognitionEventArgs&> SpeechStartDetected; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the end of speech.
|
|||
/// </summary>
|
|||
EventSignal<const RecognitionEventArgs&> SpeechEndDetected; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing intermediate recognition results.
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranscriptionEventArgs&> Transcribing; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing final recognition results.
|
|||
/// (indicating a successful recognition attempt).
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranscriptionEventArgs&> Transcribed; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing canceled recognition results
|
|||
/// (indicating a recognition attempt that was canceled as a result or a direct cancellation request
|
|||
/// or, alternatively, a transport or protocol failure).
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranscriptionCanceledEventArgs&> Canceled; |
|||
|
|||
/// <summary>
|
|||
/// Sets the authorization token that will be used for connecting the server.
|
|||
/// </summary>
|
|||
/// <param name="token">The authorization token.</param>
|
|||
void SetAuthorizationToken(const SPXSTRING& token) |
|||
{ |
|||
Properties.SetProperty(PropertyId::SpeechServiceAuthorization_Token, token); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the authorization token.
|
|||
/// </summary>
|
|||
/// <returns>Authorization token</returns>
|
|||
SPXSTRING GetAuthorizationToken() |
|||
{ |
|||
return Properties.GetProperty(PropertyId::SpeechServiceAuthorization_Token, SPXSTRING()); |
|||
} |
|||
|
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hreco">Recognizer handle.</param>
|
|||
virtual void TermRecognizer() override |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
|
|||
// Disconnect the event signals in reverse construction order
|
|||
Canceled.DisconnectAll(); |
|||
Transcribed.DisconnectAll(); |
|||
Transcribing.DisconnectAll(); |
|||
SpeechEndDetected.DisconnectAll(); |
|||
SpeechStartDetected.DisconnectAll(); |
|||
SessionStopped.DisconnectAll(); |
|||
SessionStarted.DisconnectAll(); |
|||
|
|||
// Close the async handles we have open for Recognize, StartContinuous, and StopContinuous
|
|||
for (auto handle : { &m_hasyncStartContinuous, &m_hasyncStopContinuous }) |
|||
{ |
|||
if (*handle != SPXHANDLE_INVALID && ::recognizer_async_handle_is_valid(*handle)) |
|||
{ |
|||
::recognizer_async_handle_release(*handle); |
|||
*handle = SPXHANDLE_INVALID; |
|||
} |
|||
} |
|||
|
|||
// Ask the base to term
|
|||
Recognizer::TermRecognizer(); |
|||
} |
|||
|
|||
void RecoEventConnectionsChanged(const EventSignal<const ConversationTranscriptionEventArgs&>& recoEvent) |
|||
{ |
|||
if (m_hreco != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_hreco); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::recognizer_handle_is_valid(m_hreco), "%s: m_hreco is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&recoEvent == &Transcribing) |
|||
{ |
|||
recognizer_recognizing_set_callback(m_hreco, Transcribing.IsConnected() ? FireEvent_Transcribing : nullptr, this); |
|||
} |
|||
else if (&recoEvent == &Transcribed) |
|||
{ |
|||
recognizer_recognized_set_callback(m_hreco, Transcribed.IsConnected() ? FireEvent_Transcribed : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_Transcribing(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<ConversationTranscriptionEventArgs> recoEvent{ new ConversationTranscriptionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->Transcribing.Signal(*recoEvent.get()); |
|||
} |
|||
|
|||
static void FireEvent_Transcribed(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<ConversationTranscriptionEventArgs> recoEvent{ new ConversationTranscriptionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->Transcribed.Signal(*recoEvent.get()); |
|||
} |
|||
|
|||
void RecoCanceledEventConnectionsChanged(const EventSignal<const ConversationTranscriptionCanceledEventArgs&>& recoEvent) |
|||
{ |
|||
if (m_hreco != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_hreco); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::recognizer_handle_is_valid(m_hreco), "%s: m_hreco is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&recoEvent == &Canceled) |
|||
{ |
|||
recognizer_canceled_set_callback(m_hreco, Canceled.IsConnected() ? FireEvent_Canceled : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_Canceled(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
|
|||
auto ptr = new ConversationTranscriptionCanceledEventArgs(hevent); |
|||
std::shared_ptr<ConversationTranscriptionCanceledEventArgs> recoEvent(ptr); |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->Canceled.Signal(*ptr); |
|||
} |
|||
|
|||
void SessionEventConnectionsChanged(const EventSignal<const SessionEventArgs&>& sessionEvent) |
|||
{ |
|||
if (m_hreco != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_hreco); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::recognizer_handle_is_valid(m_hreco), "%s: m_hreco is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&sessionEvent == &SessionStarted) |
|||
{ |
|||
recognizer_session_started_set_callback(m_hreco, SessionStarted.IsConnected() ? FireEvent_SessionStarted : nullptr, this); |
|||
} |
|||
else if (&sessionEvent == &SessionStopped) |
|||
{ |
|||
recognizer_session_stopped_set_callback(m_hreco, SessionStopped.IsConnected() ? FireEvent_SessionStopped : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_SessionStarted(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<SessionEventArgs> sessionEvent{ new SessionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->SessionStarted.Signal(*sessionEvent.get()); |
|||
|
|||
// SessionEventArgs doesn't hold hevent, and thus can't release it properly ... release it here
|
|||
SPX_DBG_ASSERT(recognizer_event_handle_is_valid(hevent)); |
|||
recognizer_event_handle_release(hevent); |
|||
} |
|||
|
|||
static void FireEvent_SessionStopped(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<SessionEventArgs> sessionEvent{ new SessionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->SessionStopped.Signal(*sessionEvent.get()); |
|||
|
|||
// SessionEventArgs doesn't hold hevent, and thus can't release it properly ... release it here
|
|||
SPX_DBG_ASSERT(recognizer_event_handle_is_valid(hevent)); |
|||
recognizer_event_handle_release(hevent); |
|||
} |
|||
|
|||
void RecognitionEventConnectionsChanged(const EventSignal<const RecognitionEventArgs&>& recognitionEvent) |
|||
{ |
|||
if (m_hreco != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_hreco); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::recognizer_handle_is_valid(m_hreco), "%s: m_hreco is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&recognitionEvent == &SpeechStartDetected) |
|||
{ |
|||
recognizer_speech_start_detected_set_callback(m_hreco, SpeechStartDetected.IsConnected() ? FireEvent_SpeechStartDetected : nullptr, this); |
|||
} |
|||
else if (&recognitionEvent == &SpeechEndDetected) |
|||
{ |
|||
recognizer_speech_end_detected_set_callback(m_hreco, SpeechEndDetected.IsConnected() ? FireEvent_SpeechEndDetected : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_SpeechStartDetected(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<RecognitionEventArgs> recoEvent{ new RecognitionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->SpeechStartDetected.Signal(*recoEvent.get()); |
|||
|
|||
// RecognitionEventArgs doesn't hold hevent, and thus can't release it properly ... release it here
|
|||
SPX_DBG_ASSERT(recognizer_event_handle_is_valid(hevent)); |
|||
recognizer_event_handle_release(hevent); |
|||
} |
|||
|
|||
static void FireEvent_SpeechEndDetected(SPXRECOHANDLE hreco, SPXEVENTHANDLE hevent, void* pvContext) |
|||
{ |
|||
UNUSED(hreco); |
|||
std::unique_ptr<RecognitionEventArgs> recoEvent{ new RecognitionEventArgs(hevent) }; |
|||
|
|||
auto pThis = static_cast<ConversationTranscriber*>(pvContext); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
pThis->SpeechEndDetected.Signal(*recoEvent.get()); |
|||
|
|||
// RecognitionEventArgs doesn't hold hevent, and thus can't release it properly ... release it here
|
|||
SPX_DBG_ASSERT(recognizer_event_handle_is_valid(hevent)); |
|||
recognizer_event_handle_release(hevent); |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
SPXASYNCHANDLE m_hasyncStartContinuous; |
|||
SPXASYNCHANDLE m_hasyncStopContinuous; |
|||
|
|||
DISABLE_DEFAULT_CTORS(ConversationTranscriber); |
|||
friend class Microsoft::CognitiveServices::Speech::Session; |
|||
|
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXRECOHANDLE hreco) : |
|||
PropertyCollection( |
|||
[=]() { |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
recognizer_get_property_bag(hreco, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
PrivatePropertyCollection m_properties; |
|||
|
|||
inline std::function<void(const EventSignal<const SessionEventArgs&>&)> GetSessionEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const SessionEventArgs&>& sessionEvent) { this->SessionEventConnectionsChanged(sessionEvent); }; |
|||
} |
|||
|
|||
inline std::function<void(const EventSignal<const ConversationTranscriptionEventArgs&>&)> GetRecoEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const ConversationTranscriptionEventArgs&>& recoEvent) { this->RecoEventConnectionsChanged(recoEvent); }; |
|||
} |
|||
|
|||
inline std::function<void(const EventSignal<const ConversationTranscriptionCanceledEventArgs&>&)> GetRecoCanceledEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const ConversationTranscriptionCanceledEventArgs&>& recoEvent) { this->RecoCanceledEventConnectionsChanged(recoEvent); }; |
|||
} |
|||
|
|||
inline std::function<void(const EventSignal<const RecognitionEventArgs&>&)> GetRecognitionEventConnectionsChangedCallback() |
|||
{ |
|||
return [=, this](const EventSignal<const RecognitionEventArgs&>& recoEvent) { this->RecognitionEventConnectionsChanged(recoEvent); }; |
|||
} |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// A collection of properties and their values defined for this <see cref="ConversationTranscriber"/>.
|
|||
/// </summary>
|
|||
PropertyCollection& Properties; |
|||
}; |
|||
|
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Transcription
|
|||
@ -0,0 +1,165 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation_transcription_eventargs.h: Public API declarations for ConversationTranscriptionEventArgs C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_recognition_eventargs.h> |
|||
#include <speechapi_cxx_conversation_transcription_result.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Transcription { |
|||
|
|||
/// <summary>
|
|||
/// Class for conversation transcriber event arguments.
|
|||
/// </summary>
|
|||
class ConversationTranscriptionEventArgs : public RecognitionEventArgs |
|||
{ |
|||
private: |
|||
|
|||
SPXEVENTHANDLE m_hevent; |
|||
std::shared_ptr<ConversationTranscriptionResult> m_result; |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// </summary>
|
|||
/// <param name="hevent">Event handle</param>
|
|||
explicit ConversationTranscriptionEventArgs(SPXEVENTHANDLE hevent) : |
|||
RecognitionEventArgs(hevent), |
|||
m_hevent(hevent), |
|||
m_result(std::make_shared<ConversationTranscriptionResult>(ResultHandleFromEventHandle(hevent))), |
|||
Result(m_result) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p, handle=0x%p)", __FUNCTION__, (void*)this, (void*)m_hevent); |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
virtual ~ConversationTranscriptionEventArgs() |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p, handle=0x%p)", __FUNCTION__, (void*)this, (void*)m_hevent); |
|||
SPX_THROW_ON_FAIL(recognizer_event_handle_release(m_hevent)); |
|||
}; |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
private: |
|||
#endif |
|||
/// <summary>
|
|||
/// Conversation transcriber result.
|
|||
/// </summary>
|
|||
std::shared_ptr<ConversationTranscriptionResult> Result; |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
public: |
|||
#else |
|||
protected: |
|||
#endif |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Conversation transcriber result.
|
|||
/// </summary>
|
|||
std::shared_ptr<ConversationTranscriptionResult> GetResult() const { return m_result; } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_DEFAULT_CTORS(ConversationTranscriptionEventArgs); |
|||
|
|||
SPXRESULTHANDLE ResultHandleFromEventHandle(SPXEVENTHANDLE hevent) |
|||
{ |
|||
SPXRESULTHANDLE hresult = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(recognizer_recognition_event_get_result(hevent, &hresult)); |
|||
return hresult; |
|||
} |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Class for conversation transcriber canceled event arguments.
|
|||
/// </summary>
|
|||
class ConversationTranscriptionCanceledEventArgs : public ConversationTranscriptionEventArgs |
|||
{ |
|||
private: |
|||
|
|||
std::shared_ptr<CancellationDetails> m_cancellation; |
|||
CancellationReason m_cancellationReason; |
|||
CancellationErrorCode m_errorCode; |
|||
|
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// </summary>
|
|||
/// <param name="hevent">Event handle</param>
|
|||
explicit ConversationTranscriptionCanceledEventArgs(SPXEVENTHANDLE hevent) : |
|||
ConversationTranscriptionEventArgs(hevent), |
|||
m_cancellation(CancellationDetails::FromResult(GetResult())), |
|||
m_cancellationReason(m_cancellation->Reason), |
|||
m_errorCode(m_cancellation->ErrorCode), |
|||
Reason(m_cancellationReason), |
|||
ErrorCode(m_errorCode), |
|||
ErrorDetails(m_cancellation->ErrorDetails) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p)", __FUNCTION__, (void*)this); |
|||
}; |
|||
|
|||
/// <inheritdoc/>
|
|||
virtual ~ConversationTranscriptionCanceledEventArgs() |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p)", __FUNCTION__, (void*)this); |
|||
}; |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
private: |
|||
#endif |
|||
|
|||
#ifdef __clang__ |
|||
#pragma clang diagnostic push |
|||
#pragma clang diagnostic ignored "-Wunused-private-field" |
|||
#endif |
|||
/// <summary>
|
|||
/// The reason the result was canceled.
|
|||
/// </summary>
|
|||
const CancellationReason& Reason; |
|||
|
|||
/// <summary>
|
|||
/// The error code in case of an unsuccessful recognition (<see cref="Reason"/> is set to Error).
|
|||
/// If Reason is not Error, ErrorCode is set to NoError.
|
|||
/// </summary>
|
|||
const CancellationErrorCode& ErrorCode; |
|||
|
|||
#ifdef __clang__ |
|||
#pragma clang diagnostic pop |
|||
#endif |
|||
|
|||
/// <summary>
|
|||
/// The error message in case of an unsuccessful recognition (<see cref="Reason"/> is set to Error).
|
|||
/// </summary>
|
|||
const SPXSTRING ErrorDetails; |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
public: |
|||
#else |
|||
private: |
|||
#endif |
|||
/// <summary>
|
|||
/// CancellationDetails.
|
|||
/// </summary>
|
|||
std::shared_ptr<CancellationDetails> GetCancellationDetails() const { return m_cancellation; } |
|||
|
|||
private: |
|||
|
|||
DISABLE_DEFAULT_CTORS(ConversationTranscriptionCanceledEventArgs); |
|||
}; |
|||
} } } } // Microsoft::CognitiveServices::Speech::Transcription
|
|||
@ -0,0 +1,72 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation_transcription_result.h: Public API declarations for ConversationTranscription C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_recognition_result.h> |
|||
#include <speechapi_c.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Transcription { |
|||
|
|||
/// <summary>
|
|||
/// Represents the result of a conversation transcriber.
|
|||
/// </summary>
|
|||
class ConversationTranscriptionResult final : public RecognitionResult |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hresult">Result handle.</param>
|
|||
explicit ConversationTranscriptionResult(SPXRESULTHANDLE hresult) : |
|||
RecognitionResult(hresult), |
|||
SpeakerId(m_speakerId) |
|||
{ |
|||
PopulateSpeakerFields(hresult, &m_speakerId); |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p, handle=0x%p) -- resultid=%s; reason=0x%x; text=%s, speakerid=%s, utteranceid=%s", __FUNCTION__, (void*)this, (void*)Handle, Utils::ToUTF8(ResultId).c_str(), Reason, Utils::ToUTF8(Text).c_str(), Utils::ToUTF8(SpeakerId).c_str()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
~ConversationTranscriptionResult() |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s (this=0x%p, handle=0x%p)", __FUNCTION__, (void*)this, (void*)Handle); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Unique Speaker id.
|
|||
/// </summary>
|
|||
const SPXSTRING& SpeakerId; |
|||
|
|||
private: |
|||
DISABLE_DEFAULT_CTORS(ConversationTranscriptionResult); |
|||
|
|||
void PopulateSpeakerFields(SPXRESULTHANDLE hresult, SPXSTRING* pspeakerId) |
|||
{ |
|||
SPX_INIT_HR(hr); |
|||
|
|||
const size_t maxCharCount = 1024; |
|||
char sz[maxCharCount + 1] = {}; |
|||
|
|||
if (pspeakerId != nullptr && recognizer_result_handle_is_valid(hresult)) |
|||
{ |
|||
SPX_THROW_ON_FAIL(hr = conversation_transcription_result_get_speaker_id(hresult, sz, maxCharCount)); |
|||
*pspeakerId = Utils::ToSPXString(sz); |
|||
} |
|||
} |
|||
|
|||
SPXSTRING m_speakerId; |
|||
}; |
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Transcription
|
|||
@ -0,0 +1,448 @@ |
|||
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation_translator.h: Public API declarations for ConversationTranslator C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <exception> |
|||
#include <future> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <cstring> |
|||
|
|||
#include <speechapi_c_conversation_translator.h> |
|||
#include <speechapi_cxx_eventsignal.h> |
|||
#include <speechapi_cxx_audio_config.h> |
|||
#include <speechapi_cxx_conversation.h> |
|||
#include <speechapi_cxx_conversation_translator_events.h> |
|||
#include <speechapi_cxx_conversation_transcription_eventargs.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
// Forward decl: facilitates friend use of Connection::FromConversationTranslator
|
|||
class Connection; |
|||
|
|||
namespace Transcription { |
|||
|
|||
/// <summary>
|
|||
/// A conversation translator that enables a connected experience where participants can use their
|
|||
/// own devices to see everyone else's recognitions and IMs in their own languages. Participants
|
|||
/// can also speak and send IMs to others.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationTranslator : public std::enable_shared_from_this<ConversationTranslator> |
|||
{ |
|||
private: |
|||
/*! \cond PRIVATE */ |
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXCONVERSATIONHANDLE hconvtrans) : |
|||
PropertyCollection([hconvtrans]() |
|||
{ |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
conversation_translator_get_property_bag(hconvtrans, &hpropbag); |
|||
return hpropbag; |
|||
}()) |
|||
{} |
|||
}; |
|||
|
|||
SPXCONVERSATIONTRANSLATORHANDLE m_handle; |
|||
PrivatePropertyCollection m_properties; |
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Creates a conversation translator from an audio config
|
|||
/// </summary>
|
|||
/// <param name="audioConfig">Audio configuration.</param>
|
|||
/// <returns>Smart pointer to conversation translator instance.</returns>
|
|||
static std::shared_ptr<ConversationTranslator> FromConfig(std::shared_ptr<Audio::AudioConfig> audioConfig = nullptr) |
|||
{ |
|||
SPXCONVERSATIONTRANSLATORHANDLE handle; |
|||
SPX_THROW_ON_FAIL(::conversation_translator_create_from_config( |
|||
&handle, |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(audioConfig) |
|||
)); |
|||
return std::shared_ptr<ConversationTranslator>(new ConversationTranslator(handle)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor
|
|||
/// </summary>
|
|||
virtual ~ConversationTranslator() |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
|
|||
// disconnect callbacks in reverse order
|
|||
TextMessageReceived.DisconnectAll(); |
|||
Transcribed.DisconnectAll(); |
|||
Transcribing.DisconnectAll(); |
|||
ConversationExpiration.DisconnectAll(); |
|||
ParticipantsChanged.DisconnectAll(); |
|||
Canceled.DisconnectAll(); |
|||
SessionStopped.DisconnectAll(); |
|||
SessionStarted.DisconnectAll(); |
|||
|
|||
::conversation_translator_handle_release(m_handle); |
|||
m_handle = SPXHANDLE_INVALID; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the start of a transcription session (operation).
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStarted; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the end of a transcription session (operation).
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStopped; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing canceled recognition results
|
|||
/// (indicating a recognition attempt that was canceled as a result or a direct cancellation request
|
|||
/// or, alternatively, a transport or protocol failure).
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranslationCanceledEventArgs&> Canceled; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events indicating the conversation participants have changed.
|
|||
/// </summary>
|
|||
EventSignal<const ConversationParticipantsChangedEventArgs&> ParticipantsChanged; |
|||
|
|||
/// <summary>
|
|||
/// Signal for event indicating how many minutes are left until a conversation expires.
|
|||
/// </summary>
|
|||
EventSignal<const ConversationExpirationEventArgs&> ConversationExpiration; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing intermediate translated conversation transcription results.
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranslationEventArgs&> Transcribing; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing final translated conversation transcription results.
|
|||
/// (indicating a successful recognition attempt).
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranslationEventArgs&> Transcribed; |
|||
|
|||
/// <summary>
|
|||
/// Raised when a text message is received from the conversation.
|
|||
/// </summary>
|
|||
EventSignal<const ConversationTranslationEventArgs&> TextMessageReceived; |
|||
|
|||
/// <summary>
|
|||
/// Joins a conversation. After you call this, you will start receiving events.
|
|||
/// </summary>
|
|||
/// <param name="conversation">The conversation instance to use. This instance can be used by the
|
|||
/// host to manage the conversation.</param>
|
|||
/// <param name="nickname">The display name to use for the current participant in the conversation.</param>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> JoinConversationAsync(std::shared_ptr<Conversation> conversation, const SPXSTRING& nickname) |
|||
{ |
|||
return RunAsync([conversation, nickname](auto handle) |
|||
{ |
|||
return ::conversation_translator_join( |
|||
handle, |
|||
Utils::HandleOrInvalid<SPXCONVERSATIONHANDLE>(conversation), |
|||
Utils::ToUTF8(nickname).c_str()); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Joins a conversation. After you call this, you will start receiving events.
|
|||
/// </summary>
|
|||
/// <param name="conversationId">The identifier of the conversation you want to join.</param>
|
|||
/// <param name="nickname">The display name of the current participant in the conversation.</param>
|
|||
/// <param name="language">The language the participant is using.</param>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> JoinConversationAsync(const SPXSTRING& conversationId, const SPXSTRING& nickname, const SPXSTRING& language) |
|||
{ |
|||
return RunAsync([conversationId, nickname, language](auto handle) |
|||
{ |
|||
return ::conversation_translator_join_with_id( |
|||
handle, |
|||
Utils::ToUTF8(conversationId).c_str(), |
|||
Utils::ToUTF8(nickname).c_str(), |
|||
Utils::ToUTF8(language).c_str()); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Starts sending audio to the conversation service for speech recognition.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> StartTranscribingAsync() |
|||
{ |
|||
return RunAsync(::conversation_translator_start_transcribing); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Stops sending audio to the conversation service.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> StopTranscribingAsync() |
|||
{ |
|||
return RunAsync(::conversation_translator_stop_transcribing); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sends an instant message to all participants in the conversation. This instant message
|
|||
/// will be translated into each participant's text language.
|
|||
/// </summary>
|
|||
/// <param name="message">The message to send.</param>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> SendTextMessageAsync(const SPXSTRING& message) |
|||
{ |
|||
return RunAsync([message](auto handle) |
|||
{ |
|||
return ::conversation_translator_send_text_message( |
|||
handle, |
|||
Utils::ToUTF8(message).c_str()); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Leaves the current conversation. After this is called, you will no longer receive any events.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation.</returns>
|
|||
std::future<void> LeaveConversationAsync() |
|||
{ |
|||
return RunAsync(::conversation_translator_leave); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the Cognitive Speech authorization token that will be used for connecting to the server.
|
|||
/// </summary>
|
|||
/// <param name="authToken">The authorization token.</param>
|
|||
/// <param name="region">The Azure region for this token.</param>
|
|||
void SetAuthorizationToken(const SPXSTRING& authToken, const SPXSTRING& region) |
|||
{ |
|||
SPX_THROW_ON_FAIL(::conversation_translator_set_authorization_token( |
|||
m_handle, |
|||
Utils::ToUTF8(authToken).c_str(), |
|||
Utils::ToUTF8(region).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the authorization token.
|
|||
/// </summary>
|
|||
/// <returns>Authorization token</returns>
|
|||
SPXSTRING GetAuthorizationToken() |
|||
{ |
|||
return m_properties.GetProperty(PropertyId::SpeechServiceAuthorization_Token); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets your participant identifier
|
|||
/// </summary>
|
|||
/// <returns>Participant ID</returns>
|
|||
SPXSTRING GetParticipantId() |
|||
{ |
|||
return m_properties.GetProperty(PropertyId::Conversation_ParticipantId); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// A collection of properties and their values defined for this <see cref="ConversationTranslator"/>.
|
|||
/// </summary>
|
|||
PropertyCollection& Properties; |
|||
|
|||
protected: |
|||
explicit ConversationTranslator(SPXCONVERSATIONTRANSLATORHANDLE handle) : |
|||
m_handle(handle), |
|||
m_properties(handle), |
|||
SessionStarted(BindHandler(&ConversationTranslator::OnSessionEventChanged)), |
|||
SessionStopped(BindHandler(&ConversationTranslator::OnSessionEventChanged)), |
|||
Canceled(BindHandler(&ConversationTranslator::OnCanceledEventChanged)), |
|||
ParticipantsChanged(BindHandler(&ConversationTranslator::OnParticipantsEventChanged)), |
|||
ConversationExpiration(BindHandler(&ConversationTranslator::OnExpirationEventChanged)), |
|||
Transcribing(BindHandler(&ConversationTranslator::OnTranscriptionEventChanged)), |
|||
Transcribed(BindHandler(&ConversationTranslator::OnTranscriptionEventChanged)), |
|||
TextMessageReceived(BindHandler(&ConversationTranslator::OnTextMessageEventChanged)), |
|||
Properties(m_properties) |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
} |
|||
|
|||
static inline bool ValidateHandle(SPXCONVERSATIONTRANSLATORHANDLE handle, const char* function) |
|||
{ |
|||
UNUSED(function); // not used in release builds
|
|||
SPX_DBG_TRACE_VERBOSE("%s: handle=0x%8p", function, (void*)handle); |
|||
bool valid = ::conversation_translator_handle_is_valid(handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!valid, "%s: handle is INVALID!!!", function); |
|||
return valid; |
|||
} |
|||
|
|||
void OnSessionEventChanged(const EventSignal<const SessionEventArgs&>& evt) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
|
|||
if (&evt == &SessionStarted) |
|||
{ |
|||
if (SessionStarted.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::SessionStarted); }; |
|||
} |
|||
|
|||
conversation_translator_session_started_set_callback(m_handle, callback, this); |
|||
} |
|||
else if (&evt == &SessionStopped) |
|||
{ |
|||
if (SessionStopped.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::SessionStopped); }; |
|||
} |
|||
|
|||
conversation_translator_session_stopped_set_callback(m_handle, callback, this); |
|||
} |
|||
} |
|||
|
|||
void OnCanceledEventChanged(const EventSignal<const ConversationTranslationCanceledEventArgs&>&) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
if (Canceled.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::Canceled); }; |
|||
} |
|||
|
|||
conversation_translator_canceled_set_callback(m_handle, callback, this); |
|||
} |
|||
|
|||
void OnParticipantsEventChanged(const EventSignal<const ConversationParticipantsChangedEventArgs&>&) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
if (ParticipantsChanged.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::ParticipantsChanged); }; |
|||
} |
|||
|
|||
conversation_translator_participants_changed_set_callback(m_handle, callback, this); |
|||
} |
|||
|
|||
void OnExpirationEventChanged(const EventSignal<const ConversationExpirationEventArgs&>&) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
if (ConversationExpiration.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::ConversationExpiration); }; |
|||
} |
|||
|
|||
conversation_translator_conversation_expiration_set_callback(m_handle, callback, this); |
|||
} |
|||
|
|||
void OnTranscriptionEventChanged(const EventSignal<const ConversationTranslationEventArgs&>& evt) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
if (&evt == &Transcribing) |
|||
{ |
|||
if (Transcribing.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::Transcribing); }; |
|||
} |
|||
|
|||
conversation_translator_transcribing_set_callback(m_handle, callback, this); |
|||
} |
|||
else |
|||
{ |
|||
if (Transcribed.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::Transcribed); }; |
|||
} |
|||
|
|||
conversation_translator_transcribed_set_callback(m_handle, callback, this); |
|||
} |
|||
} |
|||
|
|||
void OnTextMessageEventChanged(const EventSignal<const ConversationTranslationEventArgs&>&) |
|||
{ |
|||
if (!ValidateHandle(m_handle, __FUNCTION__)) return; |
|||
|
|||
PCONV_TRANS_CALLBACK callback = nullptr; |
|||
if (TextMessageReceived.IsConnected()) |
|||
{ |
|||
callback = [](auto, auto b, auto c) { FireEvent(b, c, &ConversationTranslator::TextMessageReceived); }; |
|||
} |
|||
|
|||
conversation_translator_text_message_recevied_set_callback(m_handle, callback, this); |
|||
} |
|||
|
|||
private: |
|||
/*! \cond PRIVATE */ |
|||
|
|||
friend class Microsoft::CognitiveServices::Speech::Connection; |
|||
|
|||
DISABLE_DEFAULT_CTORS(ConversationTranslator); |
|||
|
|||
inline std::future<void> RunAsync(std::function<SPXHR(SPXCONVERSATIONHANDLE)> func) |
|||
{ |
|||
auto keepalive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keepalive, this, func]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(func(m_handle)); |
|||
}); |
|||
} |
|||
|
|||
template<typename TArg> |
|||
inline std::function<void(TArg)> BindHandler(void (ConversationTranslator::*func)(TArg)) |
|||
{ |
|||
return [this, func](TArg arg) |
|||
{ |
|||
(this->*func)(arg); |
|||
}; |
|||
} |
|||
|
|||
static inline void FreeEventHandle(SPXEVENTHANDLE hEvt) |
|||
{ |
|||
if (::conversation_translator_event_handle_is_valid(hEvt)) |
|||
{ |
|||
::conversation_translator_event_handle_release(hEvt); |
|||
} |
|||
} |
|||
|
|||
template<typename T> |
|||
static inline void FireEvent(SPXEVENTHANDLE hEvt, void* pCtxt, EventSignal<const T&> ConversationTranslator::*pEvent) |
|||
{ |
|||
try |
|||
{ |
|||
auto pThis = static_cast<ConversationTranslator*>(pCtxt); |
|||
SPX_DBG_ASSERT(pThis != nullptr); |
|||
auto keepAlive = pThis->shared_from_this(); |
|||
|
|||
T eventArgs(hEvt); |
|||
(pThis->*pEvent).Signal(eventArgs); |
|||
|
|||
// event classes don't properly release the handles so do that here
|
|||
FreeEventHandle(hEvt); |
|||
} |
|||
catch (std::exception& ex) |
|||
{ |
|||
UNUSED(ex); |
|||
FreeEventHandle(hEvt); |
|||
throw; |
|||
} |
|||
catch (...) |
|||
{ |
|||
FreeEventHandle(hEvt); |
|||
throw; |
|||
} |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
}; |
|||
|
|||
}}}} |
|||
@ -0,0 +1,262 @@ |
|||
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversation_translator_events.h: Public C++ class API declarations for ConversationTranslator related events
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <exception> |
|||
#include <future> |
|||
#include <memory> |
|||
#include <string> |
|||
#include <cstring> |
|||
|
|||
#include <speechapi_c_conversation_translator.h> |
|||
#include <speechapi_c_conversation_transcription_result.h> |
|||
#include <speechapi_cxx_conversation_transcription_eventargs.h> |
|||
#include <speechapi_cxx_translation_eventargs.h> |
|||
#include <speechapi_cxx_session_eventargs.h> |
|||
#include <speechapi_cxx_participant.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Transcription { |
|||
|
|||
/// <summary>
|
|||
/// Helper class with additional methods
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class EventHelper |
|||
{ |
|||
protected: |
|||
template<typename TVal, typename THandle> |
|||
static TVal GetValue(THandle hevent, SPXHR(SPXAPI_CALLTYPE * func)(THandle hevent, TVal* ptr)) |
|||
{ |
|||
TVal value; |
|||
SPX_THROW_ON_FAIL(func(hevent, &value)); |
|||
return value; |
|||
} |
|||
|
|||
template<typename THandle> |
|||
static SPXSTRING GetStringValue(THandle hevent, SPXHR(SPXAPI_CALLTYPE * func)(THandle hevent, char * psz, uint32_t cch)) |
|||
{ |
|||
const uint32_t maxCharCount = 1024; |
|||
char sz[maxCharCount + 1]; |
|||
SPX_THROW_ON_FAIL(func(hevent, sz, maxCharCount)); |
|||
return Utils::ToSPXString(sz); |
|||
} |
|||
|
|||
template<typename THandle> |
|||
static SPXSTRING GetStringValue(THandle hevent, SPXHR(SPXAPI_CALLTYPE* func)(THandle hevent, char* psz, uint32_t* pcch)) |
|||
{ |
|||
// query the string length
|
|||
uint32_t length = 0; |
|||
SPX_THROW_ON_FAIL(func(hevent, nullptr, &length)); |
|||
|
|||
// retrieve the string
|
|||
std::unique_ptr<char[]> buffer(new char[length]); |
|||
SPX_THROW_ON_FAIL(func(hevent, buffer.get(), &length)); |
|||
return Utils::ToSPXString(buffer.get()); |
|||
} |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Represents the result of a conversation translator recognition, or text message.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationTranslationResult : public Translation::TranslationRecognitionResult, public EventHelper |
|||
{ |
|||
private: |
|||
SPXSTRING m_participantId; |
|||
SPXSTRING m_originalLang; |
|||
|
|||
public: |
|||
explicit ConversationTranslationResult(SPXRESULTHANDLE resultHandle) : |
|||
Translation::TranslationRecognitionResult(resultHandle), |
|||
m_participantId(GetStringValue(resultHandle, conversation_translator_result_get_user_id)), |
|||
m_originalLang(GetStringValue(resultHandle, conversation_translator_result_get_original_lang)), |
|||
ParticipantId(m_participantId), |
|||
OriginalLanguage(m_originalLang) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// The unique participant identifier
|
|||
/// </summary>
|
|||
const SPXSTRING& ParticipantId; |
|||
|
|||
/// <summary>
|
|||
/// Gets the language that the original recognition or text message is in
|
|||
/// </summary>
|
|||
const SPXSTRING& OriginalLanguage; |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(ConversationTranslationResult); |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Event arguments for the ConversationExpiration event.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationExpirationEventArgs : public SessionEventArgs, public EventHelper |
|||
{ |
|||
private: |
|||
std::chrono::minutes m_expirationTime; |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Creates a new instance.
|
|||
/// </summary>
|
|||
/// <param name="hevent">The event handle.</param>
|
|||
explicit ConversationExpirationEventArgs(SPXEVENTHANDLE hevent) : |
|||
SessionEventArgs(hevent), |
|||
m_expirationTime(std::chrono::minutes(GetValue(hevent, conversation_translator_event_get_expiration_time))), |
|||
ExpirationTime(m_expirationTime) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// How many minutes are left until the conversation expires
|
|||
/// </summary>
|
|||
const std::chrono::minutes& ExpirationTime; |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(ConversationExpirationEventArgs); |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Event arguments for the ParticipantsChanged event.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationParticipantsChangedEventArgs : public SessionEventArgs, public EventHelper |
|||
{ |
|||
private: |
|||
ParticipantChangedReason m_reason; |
|||
std::vector<std::shared_ptr<Participant>> m_participants; |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Creates a new instance.
|
|||
/// </summary>
|
|||
/// <param name="hevent">The event handle.</param>
|
|||
explicit ConversationParticipantsChangedEventArgs(SPXEVENTHANDLE hevent) : |
|||
SessionEventArgs(hevent), |
|||
m_reason(GetValue(hevent, conversation_translator_event_get_participant_changed_reason)), |
|||
m_participants(GetParticipants(hevent)), |
|||
Reason(m_reason), |
|||
Participants(m_participants) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Why the participant changed event was raised (e.g. a participant joined)
|
|||
/// </summary>
|
|||
const ParticipantChangedReason& Reason; |
|||
|
|||
/// <summary>
|
|||
/// The participant(s) that joined, left, or were updated
|
|||
/// </summary>
|
|||
const std::vector<std::shared_ptr<Participant>>& Participants; |
|||
|
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
|
|||
std::vector<std::shared_ptr<Participant>> GetParticipants(SPXEVENTHANDLE hevent) |
|||
{ |
|||
std::vector<std::shared_ptr<Participant>> list; |
|||
|
|||
SPXPARTICIPANTHANDLE hparticipant = nullptr; |
|||
for (int i = 0; hparticipant != SPXHANDLE_INVALID; i++) |
|||
{ |
|||
SPX_THROW_ON_FAIL(conversation_translator_event_get_participant_changed_at_index(hevent, i, &hparticipant)); |
|||
if (hparticipant != SPXHANDLE_INVALID) |
|||
{ |
|||
list.push_back(std::make_shared<Participant>(hparticipant)); |
|||
|
|||
// the Participant object correctly frees the handle so we don't need to do anything
|
|||
// special here
|
|||
} |
|||
} |
|||
|
|||
return list; |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(ConversationParticipantsChangedEventArgs); |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Event arguments for the ConversationTranslator <see cref="ConversationTranslator::Transcribing"/>,
|
|||
/// <see cref="ConversationTranslator::Transcribed"/>, or <see cref="ConversationTranslator::TextMessageReceived"/>
|
|||
/// events.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationTranslationEventArgs : public RecognitionEventArgs, public EventHelper |
|||
{ |
|||
private: |
|||
std::shared_ptr<ConversationTranslationResult> m_result; |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Creates a new instance.
|
|||
/// </summary>
|
|||
/// <param name="hevent">The event handle returned by the C-API.</param>
|
|||
explicit ConversationTranslationEventArgs(SPXEVENTHANDLE hevent) |
|||
: RecognitionEventArgs(hevent), |
|||
m_result(std::make_shared<ConversationTranslationResult>(GetValue(hevent, recognizer_recognition_event_get_result))), |
|||
Result(m_result) |
|||
{ |
|||
} |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
private: |
|||
#endif |
|||
/// <summary>
|
|||
/// Contains the conversation translation result. This could be for a canceled event,
|
|||
/// a speech recognition, or a received text message.
|
|||
/// </summary>
|
|||
std::shared_ptr<const ConversationTranslationResult> Result; |
|||
|
|||
#if defined(BINDING_OBJECTIVE_C) |
|||
public: |
|||
#else |
|||
protected: |
|||
#endif |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Contains the conversation translation result. This could be for a canceled event,
|
|||
/// a speech recognition, or a received text message.
|
|||
/// </summary>
|
|||
std::shared_ptr<ConversationTranslationResult> GetResult() const { return m_result; } |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(ConversationTranslationEventArgs); |
|||
}; |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Event arguments for the conversation translator canceled event.
|
|||
/// Added in 1.9.0
|
|||
/// </summary>
|
|||
class ConversationTranslationCanceledEventArgs : public ConversationTranscriptionCanceledEventArgs |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Creates a new instance.
|
|||
/// </summary>
|
|||
/// <param name="hevent">The event handle.</param>
|
|||
explicit ConversationTranslationCanceledEventArgs(SPXEVENTHANDLE hevent) : |
|||
ConversationTranscriptionCanceledEventArgs(hevent) |
|||
{ } |
|||
}; |
|||
|
|||
}}}} |
|||
@ -0,0 +1,89 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license201809 for the full license information.
|
|||
//
|
|||
// speechapi_cxx_conversational_language_understanding_model.h: Public API declarations for PatternMatchingModel C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_language_understanding_model.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_c.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Intent { |
|||
|
|||
/// <summary>
|
|||
/// Represents a Conversational Language Understanding used for intent recognition.
|
|||
/// </summary>
|
|||
class ConversationalLanguageUnderstandingModel : public LanguageUnderstandingModel |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a Conversational Language Understanding (CLU) model using the specified model ID.
|
|||
/// </summary>
|
|||
/// <param name="languageResourceKey">The Azure Language resource key.</param>
|
|||
/// <param name="endpoint">The Azure Language resource endpoint.</param>
|
|||
/// <param name="projectName">The Conversational Language Understanding project name.</param>
|
|||
/// <param name="deploymentName">The Conversational Language Understanding deployment name.</param>
|
|||
/// <returns>A shared pointer to the Conversational Language Understanding model.</returns>
|
|||
static std::shared_ptr<ConversationalLanguageUnderstandingModel> FromResource(const SPXSTRING& languageResourceKey, const SPXSTRING& endpoint, const SPXSTRING& projectName, const SPXSTRING& deploymentName) |
|||
{ |
|||
return std::shared_ptr<ConversationalLanguageUnderstandingModel> { |
|||
new ConversationalLanguageUnderstandingModel(languageResourceKey, endpoint, projectName, deploymentName) |
|||
}; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Returns id for this model. Defaults to projectName-deploymentName.
|
|||
/// </summary>
|
|||
/// <returns>A string representing the id of this model.</returns>
|
|||
SPXSTRING GetModelId() const { return m_modelId; } |
|||
|
|||
/// <summary>
|
|||
/// Sets the id for this model. Defaults to projectName-deploymentName.
|
|||
/// </summary>
|
|||
/// <param name="value">A string representing the id of this model.</param>
|
|||
void SetModelId(SPXSTRING value) { m_modelId = value; } |
|||
|
|||
/// <summary>
|
|||
/// This is the Azure language resource key to be used with this model.
|
|||
/// </summary>
|
|||
SPXSTRING languageResourceKey; |
|||
|
|||
/// <summary>
|
|||
/// Conversational Language Understanding deployment endpoint to contact.
|
|||
/// </summary>
|
|||
SPXSTRING endpoint; |
|||
|
|||
/// <summary>
|
|||
/// Conversational Language Understanding project name.
|
|||
/// </summary>
|
|||
SPXSTRING projectName; |
|||
|
|||
/// <summary>
|
|||
/// Conversational Language Understanding deployment name.
|
|||
/// </summary>
|
|||
SPXSTRING deploymentName; |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(ConversationalLanguageUnderstandingModel); |
|||
|
|||
ConversationalLanguageUnderstandingModel(const SPXSTRING& languageResourceKey, const SPXSTRING& endpoint, const SPXSTRING& projectName, const SPXSTRING& deploymentName) : |
|||
LanguageUnderstandingModel(LanguageUnderstandingModelType::ConversationalLanguageUnderstandingModel), |
|||
languageResourceKey(languageResourceKey), |
|||
endpoint(endpoint), |
|||
projectName(projectName), |
|||
deploymentName(deploymentName) |
|||
{ |
|||
m_modelId = projectName + "-" + deploymentName; |
|||
} |
|||
|
|||
SPXSTRING m_modelId; |
|||
}; |
|||
|
|||
} } } } // Microsoft::CognitiveServices::Speech::Intent
|
|||
@ -0,0 +1,268 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
#pragma once |
|||
|
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_speech_config.h> |
|||
#include <speechapi_cxx_enums.h> |
|||
#include <speechapi_c_property_bag.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Dialog { |
|||
|
|||
/// <summary>
|
|||
/// Class that defines base configurations for the dialog service connector object.
|
|||
/// </summary>
|
|||
class DialogServiceConfig |
|||
{ |
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
inline explicit DialogServiceConfig(SPXSPEECHCONFIGHANDLE h_config) : m_config{ h_config } |
|||
{ |
|||
} |
|||
SpeechConfig m_config; |
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Default destructor.
|
|||
/// </summary>
|
|||
virtual ~DialogServiceConfig() = default; |
|||
|
|||
/// <summary>
|
|||
/// Internal operator used to get underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXSPEECHCONFIGHANDLE() const { return static_cast<SPXSPEECHCONFIGHANDLE>(m_config); } |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The property name.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(const SPXSTRING& name, const SPXSTRING& value) |
|||
{ |
|||
m_config.SetProperty(name, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The property id.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(PropertyId id, const SPXSTRING& value) |
|||
{ |
|||
m_config.SetProperty(id, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The parameter name.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(const SPXSTRING& name) const |
|||
{ |
|||
return m_config.GetProperty(name); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The parameter id.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(PropertyId id) const |
|||
{ |
|||
return m_config.GetProperty(id); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value that will be passed to service using the specified channel.
|
|||
/// </summary>
|
|||
/// <param name="name">The property name.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
/// <param name="channel">The channel used to pass the specified property to service.</param>
|
|||
void SetServiceProperty(const SPXSTRING& name, const SPXSTRING& value, ServicePropertyChannel channel) |
|||
{ |
|||
m_config.SetServiceProperty(name, value, channel); |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Sets proxy configuration
|
|||
///
|
|||
/// Note: Proxy functionality is not available on macOS. This function will have no effect on this platform.
|
|||
/// </summary>
|
|||
/// <param name="proxyHostName">The host name of the proxy server, without the protocol scheme (`http://`)</param>
|
|||
/// <param name="proxyPort">The port number of the proxy server</param>
|
|||
/// <param name="proxyUserName">The user name of the proxy server</param>
|
|||
/// <param name="proxyPassword">The password of the proxy server</param>
|
|||
void SetProxy(const SPXSTRING& proxyHostName, uint32_t proxyPort, const SPXSTRING& proxyUserName = SPXSTRING(), const SPXSTRING& proxyPassword = SPXSTRING()) |
|||
{ |
|||
m_config.SetProxy(proxyHostName, proxyPort, proxyUserName, proxyPassword); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Set the input language to the connector.
|
|||
/// </summary>
|
|||
/// <param name="lang">Specifies the name of spoken language to be recognized in BCP-47 format.</param>
|
|||
void SetLanguage(const SPXSTRING& lang) |
|||
{ |
|||
SetProperty(PropertyId::SpeechServiceConnection_RecoLanguage, lang); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the input language to the connector.
|
|||
/// The language is specified in BCP-47 format.
|
|||
/// </summary>
|
|||
/// <returns>The connetor language.</returns>
|
|||
SPXSTRING GetLanguage() const |
|||
{ |
|||
return GetProperty(PropertyId::SpeechServiceConnection_RecoLanguage); |
|||
} |
|||
|
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Class that defines configurations for the dialog service connector object for using a Bot Framework backend.
|
|||
/// </summary>
|
|||
class BotFrameworkConfig final : public DialogServiceConfig |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Creates a bot framework service config instance with the specified subscription key and region.
|
|||
/// </summary>
|
|||
/// <param name="subscription">Subscription key associated with the bot</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<BotFrameworkConfig> FromSubscription(const SPXSTRING& subscription, const SPXSTRING& region) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(bot_framework_config_from_subscription(&h_config, Utils::ToUTF8(subscription).c_str(), Utils::ToUTF8(region).c_str(), nullptr)); |
|||
return std::shared_ptr<BotFrameworkConfig>{ new BotFrameworkConfig(h_config) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a bot framework service config instance with the specified subscription key and region.
|
|||
/// </summary>
|
|||
/// <param name="subscription">Subscription key associated with the bot</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <param name="bot_Id"> Identifier used to select a bot associated with this subscription.</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<BotFrameworkConfig> FromSubscription(const SPXSTRING& subscription, const SPXSTRING& region, const SPXSTRING& bot_Id) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(bot_framework_config_from_subscription(&h_config, Utils::ToUTF8(subscription).c_str(), Utils::ToUTF8(region).c_str(), Utils::ToUTF8(bot_Id).c_str())); |
|||
return std::shared_ptr<BotFrameworkConfig>{ new BotFrameworkConfig(h_config) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a bot framework service config instance with the specified authorization token and region.
|
|||
/// Note: The caller needs to ensure that the authorization token is valid. Before the authorization token
|
|||
/// expires, the caller needs to refresh it by calling this setter with a new valid token.
|
|||
/// As configuration values are copied when creating a new connector, the new token value will not apply to connectors that have already been created.
|
|||
/// For connectors that have been created before, you need to set authorization token of the corresponding connector
|
|||
/// to refresh the token. Otherwise, the connectors will encounter errors during operation.
|
|||
/// </summary>
|
|||
/// <param name="authToken">The authorization token.</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<BotFrameworkConfig> FromAuthorizationToken(const SPXSTRING& authToken, const SPXSTRING& region) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(bot_framework_config_from_authorization_token(&h_config, Utils::ToUTF8(authToken).c_str(), Utils::ToUTF8(region).c_str(), nullptr)); |
|||
return std::shared_ptr<BotFrameworkConfig>{ new BotFrameworkConfig(h_config) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a bot framework service config instance with the specified authorization token and region.
|
|||
/// Note: The caller needs to ensure that the authorization token is valid. Before the authorization token
|
|||
/// expires, the caller needs to refresh it by calling this setter with a new valid token.
|
|||
/// As configuration values are copied when creating a new connector, the new token value will not apply to connectors that have already been created.
|
|||
/// For connectors that have been created before, you need to set authorization token of the corresponding connector
|
|||
/// to refresh the token. Otherwise, the connectors will encounter errors during operation.
|
|||
/// </summary>
|
|||
/// <param name="authToken">The authorization token.</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <param name="bot_Id"> Identifier used to select a bot associated with this subscription.</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<BotFrameworkConfig> FromAuthorizationToken(const SPXSTRING& authToken, const SPXSTRING& region, const SPXSTRING& bot_Id) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(bot_framework_config_from_authorization_token(&h_config, Utils::ToUTF8(authToken).c_str(), Utils::ToUTF8(region).c_str(), Utils::ToUTF8(bot_Id).c_str())); |
|||
return std::shared_ptr<BotFrameworkConfig>{ new BotFrameworkConfig(h_config) }; |
|||
} |
|||
private: |
|||
inline explicit BotFrameworkConfig(SPXSPEECHCONFIGHANDLE h_config): DialogServiceConfig{ h_config } |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Class that defines configurations for the dialog service connector object for using a CustomCommands backend.
|
|||
/// </summary>
|
|||
class CustomCommandsConfig: public DialogServiceConfig |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Creates a Custom Commands config instance with the specified application id, subscription key and region.
|
|||
/// </summary>
|
|||
/// <param name="appId">Custom Commands application id.</param>
|
|||
/// <param name="subscription">Subscription key associated with the bot</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<CustomCommandsConfig> FromSubscription(const SPXSTRING& appId, const SPXSTRING& subscription, const SPXSTRING& region) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(custom_commands_config_from_subscription(&h_config, Utils::ToUTF8(appId).c_str(), Utils::ToUTF8(subscription).c_str(), Utils::ToUTF8(region).c_str())); |
|||
return std::shared_ptr<CustomCommandsConfig>{ new CustomCommandsConfig(h_config) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a Custom Commands config instance with the specified application id authorization token and region.
|
|||
/// Note: The caller needs to ensure that the authorization token is valid. Before the authorization token
|
|||
/// expires, the caller needs to refresh it by calling this setter with a new valid token.
|
|||
/// As configuration values are copied when creating a new connector, the new token value will not apply to connectors that have already been created.
|
|||
/// For connectors that have been created before, you need to set authorization token of the corresponding connector
|
|||
/// to refresh the token. Otherwise, the connectors will encounter errors during operation.
|
|||
/// </summary>
|
|||
/// <param name="appId">Custom Commands application id.</param>
|
|||
/// <param name="authToken">The authorization token.</param>
|
|||
/// <param name="region">The region name (see the <a href="https://aka.ms/csspeech/region">region page</a>).</param>
|
|||
/// <returns>A shared pointer to the new bot framework config.</returns>
|
|||
inline static std::shared_ptr<CustomCommandsConfig> FromAuthorizationToken(const SPXSTRING& appId, const SPXSTRING& authToken, const SPXSTRING& region) |
|||
{ |
|||
SPXSPEECHCONFIGHANDLE h_config = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(custom_commands_config_from_authorization_token(&h_config, Utils::ToUTF8(appId).c_str(), Utils::ToUTF8(authToken).c_str(), Utils::ToUTF8(region).c_str())); |
|||
return std::shared_ptr<CustomCommandsConfig>{ new CustomCommandsConfig(h_config) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the corresponding backend application identifier.
|
|||
/// </summary>
|
|||
/// <param name="applicationId">Application identifier.</param>
|
|||
inline void SetApplicationId(const SPXSTRING& applicationId) |
|||
{ |
|||
SetProperty(PropertyId::Conversation_ApplicationId, applicationId); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the application identifier.
|
|||
/// </summary>
|
|||
/// <returns>Speech Channel Secret Key.</returns>
|
|||
inline SPXSTRING GetApplicationId() const |
|||
{ |
|||
return GetProperty(PropertyId::Conversation_ApplicationId); |
|||
} |
|||
|
|||
private: |
|||
inline explicit CustomCommandsConfig(SPXSPEECHCONFIGHANDLE h_config): DialogServiceConfig{ h_config } |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
} } } } |
|||
@ -0,0 +1,547 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_dialog_service_connector.h: Public API declarations for DialogServiceConnector C++ base class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <memory> |
|||
#include <future> |
|||
#include <array> |
|||
|
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_c_dialog_service_connector.h> |
|||
#include <speechapi_c_operations.h> |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_enums.h> |
|||
#include <speechapi_cxx_utils.h> |
|||
#include <speechapi_cxx_audio_config.h> |
|||
#include <speechapi_cxx_keyword_recognition_model.h> |
|||
#include <speechapi_cxx_speech_config.h> |
|||
#include <speechapi_cxx_eventsignal.h> |
|||
#include <speechapi_cxx_session_eventargs.h> |
|||
#include <speechapi_cxx_speech_recognition_result.h> |
|||
#include <speechapi_cxx_speech_recognition_eventargs.h> |
|||
#include <speechapi_cxx_dialog_service_connector_eventargs.h> |
|||
#include <speechapi_cxx_dialog_service_config.h> |
|||
#include <speechapi_cxx_translation_eventargs.h> |
|||
#include <speechapi_cxx_translation_result.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
// Forward decl: facilities friend use use of Connection::FromDialogServiceConnector
|
|||
class Connection; |
|||
|
|||
namespace Dialog { |
|||
|
|||
/// <summary>
|
|||
/// Object used to connect DirectLineSpeech or CustomCommands.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// Objects of this type are created via the <see cref="FromConfig"/> factory method.
|
|||
/// </remarks>
|
|||
class DialogServiceConnector : public std::enable_shared_from_this<DialogServiceConnector>, public Utils::NonCopyable, public Utils::NonMovable |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Destroys the instance.
|
|||
/// </summary>
|
|||
virtual ~DialogServiceConnector() |
|||
{ |
|||
SPX_DBG_TRACE_SCOPE(__FUNCTION__, __FUNCTION__); |
|||
|
|||
// Disconnect the event signals in reverse construction order
|
|||
TurnStatusReceived.DisconnectAll(); |
|||
ActivityReceived.DisconnectAll(); |
|||
Canceled.DisconnectAll(); |
|||
SpeechEndDetected.DisconnectAll(); |
|||
SpeechStartDetected.DisconnectAll(); |
|||
SessionStopped.DisconnectAll(); |
|||
SessionStarted.DisconnectAll(); |
|||
Recognizing.DisconnectAll(); |
|||
Recognized.DisconnectAll(); |
|||
|
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
::dialog_service_connector_handle_release(m_handle); |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_handle=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
m_handle = SPXHANDLE_INVALID; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates a dialog service connector from a <see cref="DialogServiceConfig"/> and an <see cref="Audio::AudioConfig" />.
|
|||
/// Users should use this function to create a dialog service connector.
|
|||
/// </summary>
|
|||
/// <param name="connectorConfig">Dialog service config.</param>
|
|||
/// <param name="audioConfig">Audio config.</param>
|
|||
/// <returns>The shared smart pointer of the created dialog service connector.</returns>
|
|||
/// <example>
|
|||
/// <code>
|
|||
/// auto audioConfig = Audio::AudioConfig::FromDefaultMicrophoneInput();
|
|||
/// auto config = CustomCommandsConfig::FromAuthorizationToken("my_app_id","my_auth_token", "my_region");
|
|||
/// auto connector = DialogServiceConnector::FromConfig(config, audioConfig);
|
|||
/// </code>
|
|||
/// </example>
|
|||
/// <remarks>
|
|||
/// When speaking of <see cref="DialogServiceConfig" /> we are referring to one of the classes that inherit from it.
|
|||
/// The specific class to be used depends on the dialog backend being used:
|
|||
/// <ul>
|
|||
/// <li><see cref="BotFrameworkConfig" /> for DirectLineSpeech</li>
|
|||
/// <li><see cref="CustomCommandsConfig" /> for CustomCommands</li>
|
|||
/// </ul>
|
|||
/// </remarks>
|
|||
static std::shared_ptr<DialogServiceConnector> FromConfig(std::shared_ptr<DialogServiceConfig> connectorConfig, std::shared_ptr<Audio::AudioConfig> audioConfig = nullptr) |
|||
{ |
|||
SPXRECOHANDLE h_connector; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_create_dialog_service_connector_from_config( |
|||
&h_connector, |
|||
Utils::HandleOrInvalid<SPXSPEECHCONFIGHANDLE, DialogServiceConfig>(connectorConfig), |
|||
Utils::HandleOrInvalid<SPXAUDIOCONFIGHANDLE, Audio::AudioConfig>(audioConfig) |
|||
)); |
|||
return std::shared_ptr<DialogServiceConnector> { new DialogServiceConnector(h_connector) }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Connects with the back end.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation that starts the connection.</returns>
|
|||
std::future<void> ConnectAsync() |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keep_alive, this]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_connect(m_handle)); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Disconnects from the back end.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation that starts the disconnection.</returns>
|
|||
std::future<void> DisconnectAsync() |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keep_alive, this]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_disconnect(m_handle)); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sends an activity to the backing dialog.
|
|||
/// </summary>
|
|||
/// <param name="activity">Activity to send</param>
|
|||
/// <returns>An asynchronous operation that starts the operation.</returns>
|
|||
std::future<std::string> SendActivityAsync(const std::string& activity) |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keep_alive, activity, this]() |
|||
{ |
|||
std::array<char, 50> buffer; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_send_activity(m_handle, activity.c_str(), buffer.data())); |
|||
return std::string{ buffer.data() }; |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Initiates keyword recognition.
|
|||
/// </summary>
|
|||
/// <param name="model">Specifies the keyword model to be used.</param>
|
|||
/// <returns>An asynchronous operation that starts the operation.</returns>
|
|||
std::future<void> StartKeywordRecognitionAsync(std::shared_ptr<KeywordRecognitionModel> model) |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
auto h_model = Utils::HandleOrInvalid<SPXKEYWORDHANDLE, KeywordRecognitionModel>(model); |
|||
return std::async(std::launch::async, [keep_alive, h_model, this]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(dialog_service_connector_start_keyword_recognition(m_handle, h_model)); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Stop keyword recognition.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation that starts the operation.</returns>
|
|||
std::future<void> StopKeywordRecognitionAsync() |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keep_alive, this]() |
|||
{ |
|||
SPX_THROW_ON_FAIL(dialog_service_connector_stop_keyword_recognition(m_handle)); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Starts a listening session that will terminate after the first utterance.
|
|||
/// </summary>
|
|||
/// <returns>An asynchronous operation that starts the operation.</returns>
|
|||
std::future<std::shared_ptr<SpeechRecognitionResult>> ListenOnceAsync() |
|||
{ |
|||
auto keep_alive = this->shared_from_this(); |
|||
return std::async(std::launch::async, [keep_alive, this]() |
|||
{ |
|||
SPX_INIT_HR(hr); |
|||
|
|||
SPXRECOHANDLE h_result = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(dialog_service_connector_listen_once(m_handle, &h_result)); |
|||
|
|||
return std::make_shared<SpeechRecognitionResult>(h_result); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Requests that an active listening operation immediately finish, interrupting any ongoing
|
|||
/// speaking, and provide a result reflecting whatever audio data has been captured so far.
|
|||
/// </summary>
|
|||
/// <returns> A task representing the asynchronous operation that stops an active listening session. </returns>
|
|||
std::future<void> StopListeningAsync() |
|||
{ |
|||
auto keepAlive = this->shared_from_this(); |
|||
auto future = std::async(std::launch::async, [keepAlive, this]() -> void { |
|||
SPX_INIT_HR(hr); |
|||
// close any unfinished previous attempt
|
|||
SPX_THROW_ON_FAIL(hr = speechapi_async_handle_release(m_hasyncStopContinuous)); |
|||
SPX_EXITFN_ON_FAIL(hr = dialog_service_connector_stop_listening_async(m_handle, &m_hasyncStopContinuous)); |
|||
SPX_EXITFN_ON_FAIL(hr = speechapi_async_wait_for(m_hasyncStopContinuous, UINT32_MAX)); |
|||
|
|||
SPX_EXITFN_CLEANUP: |
|||
auto releaseHr = speechapi_async_handle_release(m_hasyncStopContinuous); |
|||
SPX_REPORT_ON_FAIL(releaseHr); |
|||
m_hasyncStopContinuous = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(hr); |
|||
}); |
|||
|
|||
return future; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the authorization token that will be used for connecting to the service.
|
|||
/// Note: The caller needs to ensure that the authorization token is valid. Before the authorization token
|
|||
/// expires, the caller needs to refresh it by calling this setter with a new valid token.
|
|||
/// Otherwise, the connector will encounter errors during its operation.
|
|||
/// </summary>
|
|||
/// <param name="token">The authorization token.</param>
|
|||
void SetAuthorizationToken(const SPXSTRING& token) |
|||
{ |
|||
Properties.SetProperty(PropertyId::SpeechServiceAuthorization_Token, token); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the authorization token.
|
|||
/// </summary>
|
|||
/// <returns>Authorization token</returns>
|
|||
SPXSTRING GetAuthorizationToken() |
|||
{ |
|||
return Properties.GetProperty(PropertyId::SpeechServiceAuthorization_Token, SPXSTRING()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a JSON template that will be provided to the speech service for the next conversation. The service will
|
|||
/// attempt to merge this template into all activities sent to the dialog backend, whether originated by the
|
|||
/// client with SendActivityAsync or generated by the service, as is the case with speech-to-text results.
|
|||
/// </summary>
|
|||
/// <param name="activityTemplate">
|
|||
/// The activity payload, as a JSON string, to be merged into all applicable activity messages.
|
|||
/// </param>
|
|||
void SetSpeechActivityTemplate(const SPXSTRING& activityTemplate) |
|||
{ |
|||
Properties.SetProperty(PropertyId::Conversation_Speech_Activity_Template, activityTemplate); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the JSON template that will be provided to the speech service for the next conversation. The service will
|
|||
/// attempt to merge this template into all activities sent to the dialog backend, whether originated by the
|
|||
/// client with SendActivityAsync or generated by the service, as is the case with speech-to-text results.
|
|||
/// </summary>
|
|||
/// <returns> The JSON activity template currently set that will be used on subsequent requests. </returns>
|
|||
SPXSTRING GetSpeechActivityTemplate() |
|||
{ |
|||
return Properties.GetProperty(PropertyId::Conversation_Speech_Activity_Template, SPXSTRING()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing speech recognition results.
|
|||
/// </summary>
|
|||
EventSignal<const SpeechRecognitionEventArgs&> Recognized; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events containing intermediate recognition results.
|
|||
/// </summary>
|
|||
EventSignal<const SpeechRecognitionEventArgs&> Recognizing; |
|||
|
|||
/// <summary>
|
|||
/// Signals that indicates the start of a listening session.
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStarted; |
|||
|
|||
/// <summary>
|
|||
/// Signal that indicates the end of a listening session.
|
|||
/// </summary>
|
|||
EventSignal<const SessionEventArgs&> SessionStopped; |
|||
|
|||
/// <summary>
|
|||
/// Signal that indicates the first detection of speech data in the current phrase.
|
|||
/// </summary>
|
|||
EventSignal<const RecognitionEventArgs&> SpeechStartDetected; |
|||
|
|||
/// <summary>
|
|||
/// Signal that indicates the detected end of the current phrase's speech data.
|
|||
/// </summary>
|
|||
EventSignal<const RecognitionEventArgs&> SpeechEndDetected; |
|||
|
|||
/// <summary>
|
|||
/// Signal for events relating to the cancellation of an interaction. The event indicates if the reason is a direct cancellation or an error.
|
|||
/// </summary>
|
|||
EventSignal<const SpeechRecognitionCanceledEventArgs&> Canceled; |
|||
|
|||
/// <summary>
|
|||
/// Signals that an activity was received from the backend
|
|||
/// </summary>
|
|||
EventSignal<const ActivityReceivedEventArgs&> ActivityReceived; |
|||
|
|||
/// <summary>
|
|||
/// Signals that a turn status update was received from the backend
|
|||
/// </summary>
|
|||
EventSignal<const TurnStatusReceivedEventArgs&> TurnStatusReceived; |
|||
|
|||
private: |
|||
/*! \cond PROTECTED */ |
|||
template<typename T, typename F> |
|||
std::function<void(const EventSignal<const T&>&)> Callback(F f) |
|||
{ |
|||
return [=, this](const EventSignal<const T&>& evt) |
|||
{ |
|||
(this->*f)(evt); |
|||
}; |
|||
} |
|||
|
|||
static void FireEvent_Recognized(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
SpeechRecognitionEventArgs event{ h_event }; |
|||
keep_alive->Recognized.Signal(event); |
|||
/* Not releasing the handle as SpeechRecognitionEventArgs manages it */ |
|||
} |
|||
|
|||
static void FireEvent_Recognizing(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
SpeechRecognitionEventArgs event{ h_event }; |
|||
keep_alive->Recognizing.Signal(event); |
|||
/* Not releasing the handle as SpeechRecognitionEventArgs manages it */ |
|||
} |
|||
|
|||
void RecognizerEventConnectionChanged(const EventSignal<const SpeechRecognitionEventArgs&>& reco_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_handle=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&reco_event == &Recognizing) |
|||
{ |
|||
::dialog_service_connector_recognizing_set_callback(m_handle, Recognizing.IsConnected() ? DialogServiceConnector::FireEvent_Recognizing : nullptr, this); |
|||
} |
|||
else if (&reco_event == &Recognized) |
|||
{ |
|||
::dialog_service_connector_recognized_set_callback(m_handle, Recognized.IsConnected() ? DialogServiceConnector::FireEvent_Recognized : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_SessionStarted(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
SessionEventArgs event{ h_event }; |
|||
keep_alive->SessionStarted.Signal(event); |
|||
|
|||
SPX_DBG_ASSERT(::recognizer_event_handle_is_valid(h_event)); |
|||
/* Releasing the event handle as SessionEventArgs doesn't keep the handle */ |
|||
::recognizer_event_handle_release(h_event); |
|||
} |
|||
|
|||
static void FireEvent_SessionStopped(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
SessionEventArgs event{ h_event }; |
|||
keep_alive->SessionStopped.Signal(event); |
|||
|
|||
SPX_DBG_ASSERT(::recognizer_event_handle_is_valid(h_event)); |
|||
/* Releasing the event handle as SessionEventArgs doesn't keep the handle */ |
|||
::recognizer_event_handle_release(h_event); |
|||
} |
|||
|
|||
void SessionEventConnectionChanged(const EventSignal<const SessionEventArgs&>& session_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_handle=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&session_event == &SessionStarted) |
|||
{ |
|||
::dialog_service_connector_session_started_set_callback(m_handle, SessionStarted.IsConnected() ? DialogServiceConnector::FireEvent_SessionStarted : nullptr, this); |
|||
} |
|||
else if (&session_event == &SessionStopped) |
|||
{ |
|||
::dialog_service_connector_session_stopped_set_callback(m_handle, SessionStopped.IsConnected() ? DialogServiceConnector::FireEvent_SessionStopped : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_SpeechStartDetected(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
RecognitionEventArgs event{ h_event }; |
|||
keep_alive->SpeechStartDetected.Signal(event); |
|||
|
|||
SPX_DBG_ASSERT(::recognizer_event_handle_is_valid(h_event)); |
|||
/* Releasing the event handle as RecognitionEventArgs doesn't manage handle lifetime */ |
|||
::recognizer_event_handle_release(h_event); |
|||
} |
|||
|
|||
static void FireEvent_SpeechEndDetected(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
RecognitionEventArgs event{ h_event }; |
|||
keep_alive->SpeechEndDetected.Signal(event); |
|||
|
|||
SPX_DBG_ASSERT(::recognizer_event_handle_is_valid(h_event)); |
|||
/* Releasing the event handle as RecognitionEventArgs doesn't manage handle lifetime */ |
|||
::recognizer_event_handle_release(h_event); |
|||
} |
|||
|
|||
void SpeechDetectionEventConnectionChanged(const EventSignal<const RecognitionEventArgs&>& speech_detection_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_handle=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&speech_detection_event == &SpeechStartDetected) |
|||
{ |
|||
::dialog_service_connector_speech_start_detected_set_callback(m_handle, SpeechStartDetected.IsConnected() ? DialogServiceConnector::FireEvent_SpeechStartDetected : nullptr, this); |
|||
} |
|||
else if (&speech_detection_event == &SpeechEndDetected) |
|||
{ |
|||
::dialog_service_connector_speech_end_detected_set_callback(m_handle, SpeechEndDetected.IsConnected() ? DialogServiceConnector::FireEvent_SpeechEndDetected : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_Canceled(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
SpeechRecognitionCanceledEventArgs event{ h_event }; |
|||
keep_alive->Canceled.Signal(event); |
|||
/* Not releasing the handle as SpeechRecognitionCanceledEventArgs manages it */ |
|||
} |
|||
|
|||
void CanceledEventConnectionChanged(const EventSignal<const SpeechRecognitionCanceledEventArgs&>& canceled_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_handle=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&canceled_event == &Canceled) |
|||
{ |
|||
::dialog_service_connector_canceled_set_callback(m_handle, Canceled.IsConnected() ? DialogServiceConnector::FireEvent_Canceled : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_ActivityReceived(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
ActivityReceivedEventArgs event{ h_event }; |
|||
keep_alive->ActivityReceived.Signal(event); |
|||
/* Not releasing the handle as ActivityReceivedEventArgs manages it */ |
|||
} |
|||
|
|||
void ActivityReceivedConnectionChanged(const EventSignal<const ActivityReceivedEventArgs&>& activity_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&activity_event == &ActivityReceived) |
|||
{ |
|||
::dialog_service_connector_activity_received_set_callback(m_handle, ActivityReceived.IsConnected() ? DialogServiceConnector::FireEvent_ActivityReceived : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
static void FireEvent_TurnStatusReceived(SPXRECOHANDLE, SPXEVENTHANDLE h_event, void* pv_context) |
|||
{ |
|||
auto keep_alive = static_cast<DialogServiceConnector*>(pv_context)->shared_from_this(); |
|||
TurnStatusReceivedEventArgs event{ h_event }; |
|||
keep_alive->TurnStatusReceived.Signal(event); |
|||
/* Not releasing the handle as TurnStatusReceivedEventArgs manages it */ |
|||
} |
|||
|
|||
void TurnStatusReceivedConnectionChanged(const EventSignal<const TurnStatusReceivedEventArgs&>& turn_status_event) |
|||
{ |
|||
if (m_handle != SPXHANDLE_INVALID) |
|||
{ |
|||
SPX_DBG_TRACE_VERBOSE("%s: m_hreco=0x%8p", __FUNCTION__, (void*)m_handle); |
|||
SPX_DBG_TRACE_VERBOSE_IF(!::dialog_service_connector_handle_is_valid(m_handle), "%s: m_handle is INVALID!!!", __FUNCTION__); |
|||
|
|||
if (&turn_status_event == &TurnStatusReceived) |
|||
{ |
|||
::dialog_service_connector_turn_status_received_set_callback(m_handle, TurnStatusReceived.IsConnected() ? DialogServiceConnector::FireEvent_TurnStatusReceived : nullptr, this); |
|||
} |
|||
} |
|||
} |
|||
|
|||
class PrivatePropertyCollection : public PropertyCollection |
|||
{ |
|||
public: |
|||
PrivatePropertyCollection(SPXRECOHANDLE h_connector) : |
|||
PropertyCollection( |
|||
[=](){ |
|||
SPXPROPERTYBAGHANDLE h_prop_bag = SPXHANDLE_INVALID; |
|||
dialog_service_connector_get_property_bag(h_connector, &h_prop_bag); |
|||
return h_prop_bag; |
|||
}()) |
|||
{ |
|||
} |
|||
}; |
|||
|
|||
inline explicit DialogServiceConnector(SPXRECOHANDLE handle) : |
|||
Recognized{ Callback<SpeechRecognitionEventArgs>(&DialogServiceConnector::RecognizerEventConnectionChanged) }, |
|||
Recognizing{ Callback<SpeechRecognitionEventArgs>(&DialogServiceConnector::RecognizerEventConnectionChanged) }, |
|||
SessionStarted{ Callback<SessionEventArgs>(&DialogServiceConnector::SessionEventConnectionChanged) }, |
|||
SessionStopped{ Callback<SessionEventArgs>(&DialogServiceConnector::SessionEventConnectionChanged) }, |
|||
SpeechStartDetected{ Callback<RecognitionEventArgs>(&DialogServiceConnector::SpeechDetectionEventConnectionChanged) }, |
|||
SpeechEndDetected{ Callback<RecognitionEventArgs>(&DialogServiceConnector::SpeechDetectionEventConnectionChanged) }, |
|||
Canceled{ Callback<SpeechRecognitionCanceledEventArgs>(&DialogServiceConnector::CanceledEventConnectionChanged) }, |
|||
ActivityReceived{ Callback<ActivityReceivedEventArgs>(&DialogServiceConnector::ActivityReceivedConnectionChanged) }, |
|||
TurnStatusReceived{ Callback<TurnStatusReceivedEventArgs>(&DialogServiceConnector::TurnStatusReceivedConnectionChanged) }, |
|||
m_handle{ handle }, |
|||
m_properties{ handle }, |
|||
Properties{ m_properties } |
|||
{ |
|||
} |
|||
|
|||
private: |
|||
friend class Microsoft::CognitiveServices::Speech::Connection; |
|||
SPXRECOHANDLE m_handle; |
|||
SPXASYNCHANDLE m_hasyncStopContinuous; |
|||
|
|||
PrivatePropertyCollection m_properties; |
|||
/*! \endcond */ |
|||
public: |
|||
/// <summary>
|
|||
/// A collection of properties and their values defined for this <see cref="DialogServiceConnector"/>.
|
|||
/// </summary>
|
|||
PropertyCollection& Properties; |
|||
}; |
|||
|
|||
} } } } |
|||
@ -0,0 +1,148 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
#include <vector> |
|||
|
|||
#include <speechapi_cxx_audio_stream.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Dialog { |
|||
|
|||
// Forward declarations
|
|||
class DialogServiceConnector; |
|||
|
|||
/// <summary>
|
|||
/// Class for activity received event arguments.
|
|||
/// </summary>
|
|||
class ActivityReceivedEventArgs: public std::enable_shared_from_this<ActivityReceivedEventArgs> |
|||
{ |
|||
public: |
|||
friend DialogServiceConnector; |
|||
/// <summary>
|
|||
/// Releases the event.
|
|||
/// </summary>
|
|||
inline ~ActivityReceivedEventArgs() |
|||
{ |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_activity_received_event_release(m_handle)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the activity associated with the event.
|
|||
/// </summary>
|
|||
/// <returns>The serialized activity activity.</returns>
|
|||
inline std::string GetActivity() const |
|||
{ |
|||
size_t size; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_activity_received_event_get_activity_size(m_handle, &size)); |
|||
auto ptr = std::make_unique<char[]>(size + 1); |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_activity_received_event_get_activity(m_handle, ptr.get(), size + 1)); |
|||
return std::string{ ptr.get() }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the audio associated with the event.
|
|||
/// </summary>
|
|||
/// <returns>The audio.</returns>
|
|||
inline std::shared_ptr<Audio::PullAudioOutputStream> GetAudio() const |
|||
{ |
|||
SPXAUDIOSTREAMHANDLE h_audio{ SPXHANDLE_INVALID }; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_activity_received_event_get_audio(m_handle, &h_audio)); |
|||
if (h_audio == SPXHANDLE_INVALID) |
|||
{ |
|||
return nullptr; |
|||
} |
|||
return std::shared_ptr<Audio::PullAudioOutputStream>(new Audio::PullAudioOutputStream(h_audio) ); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Checks if the event contains audio.
|
|||
/// </summary>
|
|||
/// <returns>True if the event contains audio, false otherwise.</returns>
|
|||
inline bool HasAudio() const |
|||
{ |
|||
return ::dialog_service_connector_activity_received_event_has_audio(m_handle); |
|||
} |
|||
private: |
|||
/*! \cond PROTECTED */ |
|||
inline ActivityReceivedEventArgs(SPXEVENTHANDLE h_event) : m_handle{ h_event } |
|||
{ |
|||
} |
|||
|
|||
SPXEVENTHANDLE m_handle; |
|||
/*! \endcond */ |
|||
}; |
|||
|
|||
/// <summary>
|
|||
/// Class for turn status event arguments.
|
|||
/// </summary>
|
|||
class TurnStatusReceivedEventArgs : public std::enable_shared_from_this<TurnStatusReceivedEventArgs> |
|||
{ |
|||
public: |
|||
friend DialogServiceConnector; |
|||
/// <summary>
|
|||
/// Releases the event.
|
|||
/// </summary>
|
|||
inline ~TurnStatusReceivedEventArgs() |
|||
{ |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_release(m_handle)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Retrieves the interaction ID associated with this turn status event. Interaction generally correspond
|
|||
/// to a single input signal (e.g. voice utterance) or data/activity transaction and will correlate to
|
|||
/// 'replyToId' fields in Bot Framework activities.
|
|||
/// </summary>
|
|||
/// <returns> The interaction ID associated with the turn status. </returns>
|
|||
inline std::string GetInteractionId() const |
|||
{ |
|||
size_t size = 0; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_get_interaction_id_size(m_handle, &size)); |
|||
auto ptr = std::make_unique<char[]>(size + 1); |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_get_interaction_id(m_handle, ptr.get(), size + 1)); |
|||
return std::string{ ptr.get() }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Retrieves the conversation ID associated with this turn status event. Conversations may span multiple
|
|||
/// interactions and are the unit which a client may request resume/retry upon.
|
|||
/// </summary>
|
|||
/// <returns> The conversation ID associated with the turn status. </returns>
|
|||
inline std::string GetConversationId() const |
|||
{ |
|||
size_t size = 0; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_get_conversation_id_size(m_handle, &size)); |
|||
auto ptr = std::make_unique<char[]>(size + 1); |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_get_conversation_id(m_handle, ptr.get(), size + 1)); |
|||
return std::string{ ptr.get() }; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Retrieves the numeric status code associated with this turn status event. These generally correspond to
|
|||
/// standard HTTP status codes such as 200 (OK), 400 (Failure/Bad Request), and 429 (Timeout/Throttled).
|
|||
/// </summary>
|
|||
/// <returns> The status code associated with this event, analolgous to standard HTTP codes. </returns>
|
|||
inline int GetStatusCode() const |
|||
{ |
|||
int cApiStatus = 404; |
|||
SPX_THROW_ON_FAIL(::dialog_service_connector_turn_status_received_get_status(m_handle, &cApiStatus)); |
|||
return cApiStatus; |
|||
} |
|||
|
|||
private: |
|||
/*! \cond PROTECTED */ |
|||
inline TurnStatusReceivedEventArgs(SPXEVENTHANDLE h_event) : m_handle{ h_event } |
|||
{ |
|||
} |
|||
|
|||
SPXEVENTHANDLE m_handle; |
|||
/*! \endcond */ |
|||
}; |
|||
|
|||
} } } } |
|||
@ -0,0 +1,324 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_embedded_speech_config.h: Public API declarations for EmbeddedSpeechConfig C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
|
|||
#include <speechapi_c_common.h> |
|||
#include <speechapi_cxx_properties.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_speech_recognition_model.h> |
|||
#include <speechapi_cxx_speech_translation_model.h> |
|||
#include <speechapi_c_embedded_speech_config.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Class that defines embedded (offline) speech configuration.
|
|||
/// </summary>
|
|||
class EmbeddedSpeechConfig |
|||
{ |
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
|
|||
SpeechConfig m_config; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
public: |
|||
/// <summary>
|
|||
/// Internal operator used to get the underlying handle value.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXSPEECHCONFIGHANDLE() const |
|||
{ |
|||
return static_cast<SPXSPEECHCONFIGHANDLE>(m_config); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of the embedded speech config with a specified offline model path.
|
|||
/// </summary>
|
|||
/// <param name="path">The folder path to search for offline models.
|
|||
/// This can be a root path under which several models are located in subfolders,
|
|||
/// or a direct path to a specific model folder.
|
|||
/// </param>
|
|||
/// <returns>A shared pointer to the new embedded speech config instance.</returns>
|
|||
static std::shared_ptr<EmbeddedSpeechConfig> FromPath(const SPXSTRING& path) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, path.empty()); |
|||
SPXSPEECHCONFIGHANDLE hconfig = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(embedded_speech_config_create(&hconfig)); |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_add_path(hconfig, Utils::ToUTF8(path).c_str())); |
|||
|
|||
auto ptr = new EmbeddedSpeechConfig(hconfig); |
|||
return std::shared_ptr<EmbeddedSpeechConfig>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates an instance of the embedded speech config with specified offline model paths.
|
|||
/// </summary>
|
|||
/// <param name="paths">The folder paths to search for offline models.
|
|||
/// These can be root paths under which several models are located in subfolders,
|
|||
/// or direct paths to specific model folders.
|
|||
/// </param>
|
|||
/// <returns>A shared pointer to the new embedded speech config instance.</returns>
|
|||
static std::shared_ptr<EmbeddedSpeechConfig> FromPaths(const std::vector<SPXSTRING>& paths) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, paths.empty()); |
|||
SPXSPEECHCONFIGHANDLE hconfig = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_ON_FAIL(embedded_speech_config_create(&hconfig)); |
|||
for (const SPXSTRING& path : paths) |
|||
{ |
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, path.empty()); |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_add_path(hconfig, Utils::ToUTF8(path).c_str())); |
|||
} |
|||
|
|||
auto ptr = new EmbeddedSpeechConfig(hconfig); |
|||
return std::shared_ptr<EmbeddedSpeechConfig>(ptr); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a list of available speech recognition models.
|
|||
/// </summary>
|
|||
/// <returns>Speech recognition model info.</returns>
|
|||
std::vector<std::shared_ptr<SpeechRecognitionModel>> GetSpeechRecognitionModels() |
|||
{ |
|||
std::vector<std::shared_ptr<SpeechRecognitionModel>> models; |
|||
|
|||
uint32_t numModels = 0; |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_get_num_speech_reco_models(static_cast<SPXSPEECHCONFIGHANDLE>(m_config), &numModels)); |
|||
|
|||
for (uint32_t i = 0; i < numModels; i++) |
|||
{ |
|||
SPXSPEECHRECOMODELHANDLE hmodel = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_get_speech_reco_model(static_cast<SPXSPEECHCONFIGHANDLE>(m_config), i, &hmodel)); |
|||
|
|||
auto model = std::make_shared<SpeechRecognitionModel>(hmodel); |
|||
models.push_back(model); |
|||
} |
|||
|
|||
return models; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the model for speech recognition.
|
|||
/// </summary>
|
|||
/// <param name="name">The model name.</param>
|
|||
/// <param name="license">The license text.</param>
|
|||
void SetSpeechRecognitionModel(const SPXSTRING& name, const SPXSTRING& license) |
|||
{ |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_set_speech_recognition_model( |
|||
static_cast<SPXSPEECHCONFIGHANDLE>(m_config), Utils::ToUTF8(name).c_str(), Utils::ToUTF8(license).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the model name for speech recognition.
|
|||
/// </summary>
|
|||
/// <returns>The speech recognition model name.</returns>
|
|||
SPXSTRING GetSpeechRecognitionModelName() const |
|||
{ |
|||
return GetProperty(PropertyId::SpeechServiceConnection_RecoModelName); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the speech recognition output format.
|
|||
/// </summary>
|
|||
/// <param name="format">Speech recognition output format (simple or detailed).</param>
|
|||
void SetSpeechRecognitionOutputFormat(OutputFormat format) |
|||
{ |
|||
m_config.SetOutputFormat(format); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the speech recognition output format.
|
|||
/// </summary>
|
|||
/// <returns>Speech recognition output format (simple or detailed).</returns>
|
|||
OutputFormat GetSpeechRecognitionOutputFormat() const |
|||
{ |
|||
return m_config.GetOutputFormat(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the profanity option. This can be used to remove profane words or mask them.
|
|||
/// </summary>
|
|||
/// <param name="profanity">Profanity option value.</param>
|
|||
void SetProfanity(ProfanityOption profanity) |
|||
{ |
|||
m_config.SetProfanity(profanity); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the voice for embedded speech synthesis.
|
|||
/// </summary>
|
|||
/// <param name="name">The voice name of the embedded speech synthesis.</param>
|
|||
/// <param name="license">The license text.</param>
|
|||
void SetSpeechSynthesisVoice(const SPXSTRING& name, const SPXSTRING& license) |
|||
{ |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_set_speech_synthesis_voice( |
|||
static_cast<SPXSPEECHCONFIGHANDLE>(m_config), Utils::ToUTF8(name).c_str(), Utils::ToUTF8(license).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the voice name for embedded speech synthesis.
|
|||
/// </summary>
|
|||
/// <returns>The speech synthesis model name, i.e. the voice name.</returns>
|
|||
SPXSTRING GetSpeechSynthesisVoiceName() const |
|||
{ |
|||
return GetProperty(PropertyId::SpeechServiceConnection_SynthOfflineVoice); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the speech synthesis output format (e.g. Riff16Khz16BitMonoPcm).
|
|||
/// </summary>
|
|||
/// <param name="formatId">Specifies the output format ID</param>
|
|||
void SetSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat formatId) |
|||
{ |
|||
m_config.SetSpeechSynthesisOutputFormat(formatId); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the speech synthesis output format.
|
|||
/// </summary>
|
|||
/// <returns>The speech synthesis output format.</returns>
|
|||
SPXSTRING GetSpeechSynthesisOutputFormat() const |
|||
{ |
|||
return m_config.GetSpeechSynthesisOutputFormat(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a list of available speech translation models.
|
|||
/// </summary>
|
|||
/// <returns>Speech translation model info.</returns>
|
|||
std::vector<std::shared_ptr<SpeechTranslationModel>> GetSpeechTranslationModels() |
|||
{ |
|||
std::vector<std::shared_ptr<SpeechTranslationModel>> models; |
|||
|
|||
uint32_t numModels = 0; |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_get_num_speech_translation_models(static_cast<SPXSPEECHCONFIGHANDLE>(m_config), &numModels)); |
|||
|
|||
for (uint32_t i = 0; i < numModels; i++) |
|||
{ |
|||
SPXSPEECHRECOMODELHANDLE hmodel = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_get_speech_translation_model(static_cast<SPXSPEECHCONFIGHANDLE>(m_config), i, &hmodel)); |
|||
|
|||
auto model = std::make_shared<SpeechTranslationModel>(hmodel); |
|||
models.push_back(model); |
|||
} |
|||
|
|||
return models; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the model for speech translation.
|
|||
/// </summary>
|
|||
/// <param name="name">Model name.</param>
|
|||
/// <param name="license">License text.</param>
|
|||
void SetSpeechTranslationModel(const SPXSTRING& name, const SPXSTRING& license) |
|||
{ |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_set_speech_translation_model( |
|||
static_cast<SPXSPEECHCONFIGHANDLE>(m_config), Utils::ToUTF8(name).c_str(), Utils::ToUTF8(license).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the model name for speech translation.
|
|||
/// </summary>
|
|||
/// <returns>The speech translation model name.</returns>
|
|||
SPXSTRING GetSpeechTranslationModelName() const |
|||
{ |
|||
return GetProperty(PropertyId::SpeechTranslation_ModelName); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the model for keyword recognition.
|
|||
/// This is for customer specific models that are tailored for detecting
|
|||
/// wake words and direct commands.
|
|||
/// </summary>
|
|||
/// <param name="name">Model name.</param>
|
|||
/// <param name="license">License text.</param>
|
|||
void SetKeywordRecognitionModel(const SPXSTRING& name, const SPXSTRING& license) |
|||
{ |
|||
SPX_THROW_ON_FAIL(embedded_speech_config_set_keyword_recognition_model( |
|||
static_cast<SPXSPEECHCONFIGHANDLE>(m_config), Utils::ToUTF8(name).c_str(), Utils::ToUTF8(license).c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the model name for keyword recognition.
|
|||
/// </summary>
|
|||
/// <returns>The keyword recognition model name.</returns>
|
|||
SPXSTRING GetKeywordRecognitionModelName() const |
|||
{ |
|||
return GetProperty(PropertyId::KeywordRecognition_ModelName); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The property name.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(const SPXSTRING& name, const SPXSTRING& value) |
|||
{ |
|||
m_config.SetProperty(name, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The property id.</param>
|
|||
/// <param name="value">The property value.</param>
|
|||
void SetProperty(PropertyId id, const SPXSTRING& value) |
|||
{ |
|||
m_config.SetProperty(id, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by name.
|
|||
/// </summary>
|
|||
/// <param name="name">The parameter name.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(const SPXSTRING& name) const |
|||
{ |
|||
return m_config.GetProperty(name); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a property value by ID.
|
|||
/// </summary>
|
|||
/// <param name="id">The parameter id.</param>
|
|||
/// <returns>The property value.</returns>
|
|||
SPXSTRING GetProperty(PropertyId id) const |
|||
{ |
|||
return m_config.GetProperty(id); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructs the object.
|
|||
/// </summary>
|
|||
virtual ~EmbeddedSpeechConfig() = default; |
|||
|
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
inline explicit EmbeddedSpeechConfig(SPXSPEECHCONFIGHANDLE hconfig) : m_config(hconfig) |
|||
{ |
|||
} |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
DISABLE_COPY_AND_MOVE(EmbeddedSpeechConfig); |
|||
|
|||
}; |
|||
|
|||
}}} |
|||
File diff suppressed because it is too large
@ -0,0 +1,108 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <sstream> |
|||
#include <iterator> |
|||
#include <functional> |
|||
#include <azac_api_c_diagnostics.h> |
|||
#include <azac_api_cxx_common.h> |
|||
#include <speechapi_cxx_log_level.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Diagnostics { |
|||
namespace Logging { |
|||
|
|||
/// <summary>
|
|||
/// Class with static methods to control callback-based SDK logging.
|
|||
/// Turning on logging while running your Speech SDK scenario provides
|
|||
/// detailed information from the SDK's core native components. If you
|
|||
/// report an issue to Microsoft, you may be asked to provide logs to help
|
|||
/// Microsoft diagnose the issue. Your application should not take dependency
|
|||
/// on particular log strings, as they may change from one SDK release to another
|
|||
/// without notice.
|
|||
/// Use EventLogger when you want to get access to new log strings as soon
|
|||
/// as they are available, and you need to further process them. For example,
|
|||
/// integrating Speech SDK logs with your existing logging collection system.
|
|||
/// Added in version 1.20.0
|
|||
/// </summary>
|
|||
/// <remarks>Event logging is a process wide construct. That means that if (for example)
|
|||
/// you have multiple speech recognizer objects running in parallel, you can only register
|
|||
/// one callback function to receive interleaved logs from all recognizers. You cannot register
|
|||
/// a separate callback for each recognizer.</remarks>
|
|||
class EventLogger |
|||
{ |
|||
public: |
|||
using CallbackFunction_Type = ::std::function<void(std::string message)>; |
|||
|
|||
/// <summary>
|
|||
/// Register a callback function that will be invoked for each new log messages.
|
|||
/// </summary>
|
|||
/// <param name="callback">callback function to call. Set a nullptr value
|
|||
/// to stop the Event Logger.</param>
|
|||
/// <remarks>You can only register one callback function. This call will happen on a working thread of the SDK,
|
|||
/// so the log string should be copied somewhere for further processing by another thread, and the function should return immediately.
|
|||
/// No heavy processing or network calls should be done in this callback function.</remarks>
|
|||
static void SetCallback(CallbackFunction_Type callback = nullptr) |
|||
{ |
|||
AZAC_THROW_ON_FAIL(diagnostics_logmessage_set_callback(nullptr == callback ? nullptr : LineLogged)); |
|||
|
|||
SetOrGet(true, callback); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets or clears filters for callbacks.
|
|||
/// Once filters are set, the callback will be invoked only if the log string
|
|||
/// contains at least one of the strings specified by the filters. The match is case sensitive.
|
|||
/// </summary>
|
|||
/// <param name="filters">Optional. Filters to use, or an empty list to clear previously set filters</param>
|
|||
static void SetFilters(std::initializer_list<std::string> filters = {}) |
|||
{ |
|||
std::string str = ""; |
|||
|
|||
if (filters.size() > 0) |
|||
{ |
|||
std::ostringstream filtersCollapsed; |
|||
std::copy(filters.begin(), filters.end(), std::ostream_iterator<std::string>(filtersCollapsed, ";")); |
|||
str = filtersCollapsed.str(); |
|||
} |
|||
|
|||
AZAC_THROW_ON_FAIL(diagnostics_logmessage_set_filters(str.c_str())); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the level of the messages to be captured by the logger
|
|||
/// </summary>
|
|||
/// <param name="level">Maximum level of detail to be captured by the logger.</param>
|
|||
static void SetLevel(Level level) |
|||
{ |
|||
const auto levelStr = Details::LevelToString(level); |
|||
diagnostics_set_log_level("event", levelStr); |
|||
} |
|||
|
|||
private: |
|||
static CallbackFunction_Type SetOrGet(bool set, CallbackFunction_Type callback) |
|||
{ |
|||
static CallbackFunction_Type staticCallback = nullptr; |
|||
if (set) |
|||
{ |
|||
staticCallback = callback; |
|||
} |
|||
return staticCallback; |
|||
} |
|||
|
|||
static void LineLogged(const char* line) |
|||
{ |
|||
auto callback = SetOrGet(false, nullptr); |
|||
if (nullptr != callback) |
|||
{ |
|||
callback(line); |
|||
} |
|||
} |
|||
}; |
|||
}}}}} |
|||
@ -0,0 +1,47 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_eventargs.h: Public API declarations for EventArgs C++ base class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <speechapi_cxx_common.h> |
|||
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Base class for event arguments.
|
|||
/// </summary>
|
|||
class EventArgs |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// </summary>
|
|||
virtual ~EventArgs() {} |
|||
|
|||
protected: |
|||
|
|||
/*! \cond PROTECTED */ |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// </summary>
|
|||
EventArgs() {}; |
|||
|
|||
/*! \endcond */ |
|||
|
|||
private: |
|||
|
|||
DISABLE_COPY_AND_MOVE(EventArgs); |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,202 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_eventsignal.h: Public API declarations for the EventSignal<T> class. This derives from
|
|||
// EventSignalBase<T> and uses runtime type information (RTTI) to facilitate management and disconnection of handlers
|
|||
// without explicit callback token management.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <algorithm> |
|||
#include <functional> |
|||
#include <mutex> |
|||
#include <string> |
|||
|
|||
#include <speechapi_cxx_eventsignalbase.h> |
|||
|
|||
// TODO: TFS#3671067 - Vision: Consider moving majority of EventSignal to AI::Core::Details namespace, and refactoring Vision::Core::Events to inherit, and relay to private base
|
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Clients can connect to the event signal to receive events, or disconnect from the event signal to stop receiving events.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// At construction time, connect and disconnect callbacks can be provided that are called when
|
|||
/// the number of connected clients changes from zero to one or one to zero, respectively.
|
|||
/// </remarks>
|
|||
// <typeparam name="T">
|
|||
template <class T> |
|||
class EventSignal : public EventSignalBase<T> |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Callback type that is used for signalling the event to connected clients.
|
|||
/// </summary>
|
|||
using CallbackFunction = std::function<void(T eventArgs)>; |
|||
|
|||
/// <summary>
|
|||
/// A monotonically increasing token used for registration, tracking, and unregistration of callbacks.
|
|||
/// </summary>
|
|||
using CallbackToken = uint32_t; |
|||
|
|||
/// <summary>
|
|||
/// Type for callbacks used when any client connects to the signal (the number of connected clients changes from zero to one) or
|
|||
/// the last client disconnects from the signal (the number of connected clients changes from one to zero).
|
|||
/// </summary>
|
|||
using NotifyCallback_Type = std::function<void(EventSignal<T>&)>; |
|||
|
|||
/// <summary>
|
|||
/// Constructs an event signal with empty register and disconnect callbacks.
|
|||
/// <summary>
|
|||
EventSignal() : EventSignal(nullptr) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// <summary>
|
|||
/// <param name="connectedAndDisconnected">Callback to invoke if the number of connected clients changes from zero to one, or one to zero</param>
|
|||
EventSignal(NotifyCallback_Type connectedAndDisconnected) |
|||
: EventSignal(connectedAndDisconnected, connectedAndDisconnected) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Constructor.
|
|||
/// <summary>
|
|||
/// <param name="connected">Callback to invoke if the number of connected clients changes from zero to one.</param>
|
|||
/// <param name="disconnected">Callback to invoke if the number of connected clients changes from one to zero.</param>
|
|||
EventSignal(NotifyCallback_Type connected, NotifyCallback_Type disconnected) |
|||
: EventSignalBase<T>() |
|||
, m_firstConnectedCallback(connected) |
|||
, m_lastDisconnectedCallback(disconnected) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Addition assignment operator overload.
|
|||
/// Connects the provided callback <paramref name="callback"/> to the event signal, see also <see cref="Connect"/>.
|
|||
/// </summary>
|
|||
/// <param name="callback">Callback to connect.</param>
|
|||
/// <returns>Event signal reference.</returns>
|
|||
EventSignal<T>& operator+=(CallbackFunction callback) |
|||
{ |
|||
Connect(callback); |
|||
return *this; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Subtraction assignment operator overload.
|
|||
/// Disconnects the provided callback <paramref name="callback"/> from the event signal, see also <see cref="Disconnect"/>.
|
|||
/// </summary>
|
|||
/// <param name="callback">Callback to disconnect.</param>
|
|||
/// <returns>Event signal reference.</returns>
|
|||
EventSignal<T>& operator-=(CallbackFunction callback) |
|||
{ |
|||
Disconnect(callback); |
|||
return *this; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Connects given callback function to the event signal, to be invoked when the event is signalled.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// When the number of connected clients changes from zero to one, the connect callback will be called, if provided.
|
|||
/// </remarks>
|
|||
/// <param name="callback">Callback to connect.</param>
|
|||
void Connect(CallbackFunction callback) |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
|
|||
auto shouldFireFirstConnected = m_callbacks.empty() && m_firstConnectedCallback != nullptr; |
|||
|
|||
(void)EventSignalBase<T>::RegisterCallback(callback); |
|||
|
|||
lock.unlock(); |
|||
|
|||
if (shouldFireFirstConnected) |
|||
{ |
|||
m_firstConnectedCallback(*this); |
|||
} |
|||
} |
|||
|
|||
#ifndef AZAC_CONFIG_CXX_NO_RTTI |
|||
/// <summary>
|
|||
/// Disconnects given callback.
|
|||
/// <summary>
|
|||
/// <remarks>
|
|||
/// When the number of connected clients changes from one to zero, the disconnect callback will be called, if provided.
|
|||
/// </remarks>
|
|||
/// <param name="callback">Callback function.</param>
|
|||
void Disconnect(CallbackFunction callback) |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
|
|||
auto itMatchingCallback = std::find_if( |
|||
m_callbacks.begin(), |
|||
m_callbacks.end(), |
|||
[&](const std::pair<CallbackToken, CallbackFunction>& item) |
|||
{ |
|||
return callback.target_type() == item.second.target_type(); |
|||
}); |
|||
|
|||
auto removeHappened = EventSignal<T>::UnregisterCallback(itMatchingCallback->first); |
|||
lock.unlock(); |
|||
if (removeHappened && m_callbacks.empty() && m_lastDisconnectedCallback != nullptr) |
|||
{ |
|||
m_lastDisconnectedCallback(*this); |
|||
} |
|||
} |
|||
#else |
|||
void Disconnect(CallbackFunction) |
|||
{ |
|||
// Callback disconnection without a stored token requires runtime type information.
|
|||
// To remove callbacks with RTTI disabled, use UnregisterCallback(token).
|
|||
SPX_THROW_HR(SPXERR_NOT_IMPL); |
|||
} |
|||
#endif |
|||
|
|||
/// <summary>
|
|||
/// Disconnects all registered callbacks.
|
|||
/// </summary>
|
|||
void DisconnectAll() |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
auto shouldFireLastDisconnected = !m_callbacks.empty() && m_lastDisconnectedCallback != nullptr; |
|||
|
|||
EventSignal<T>::UnregisterAllCallbacks(); |
|||
|
|||
lock.unlock(); |
|||
|
|||
if (shouldFireLastDisconnected) |
|||
{ |
|||
m_lastDisconnectedCallback(*this); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Signals the event with given arguments <paramref name="t"/> to all connected callbacks.
|
|||
/// <summary>
|
|||
/// <param name="t">Event arguments to signal.</param>
|
|||
void Signal(T t) |
|||
{ |
|||
EventSignalBase<T>::Signal(t); |
|||
} |
|||
|
|||
private: |
|||
using EventSignalBase<T>::m_mutex; |
|||
using EventSignalBase<T>::m_callbacks; |
|||
|
|||
NotifyCallback_Type m_firstConnectedCallback; |
|||
NotifyCallback_Type m_lastDisconnectedCallback; |
|||
|
|||
EventSignal(const EventSignal&) = delete; |
|||
EventSignal(const EventSignal&&) = delete; |
|||
EventSignal& operator=(const EventSignal&) = delete; |
|||
}; |
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,166 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_eventsignalbase.h: Public API declarations for EventSignalBase<T> C++ template class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <algorithm> |
|||
#include <functional> |
|||
#include <map> |
|||
#include <mutex> |
|||
#include <string> |
|||
|
|||
// TODO: TFS#3671067 - Vision: Consider moving majority of EventSignal to AI::Core::Details namespace, and refactoring Vision::Core::Events to inherit, and relay to private base
|
|||
|
|||
#include <speechapi_cxx_common.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
/// <summary>
|
|||
/// Clients can connect to the event signal to receive events, or disconnect from the event signal to stop receiving events.
|
|||
/// </summary>
|
|||
/// <remarks>
|
|||
/// At construction time, connect and disconnect callbacks can be provided that are called when
|
|||
/// the number of connected clients changes from zero to one or one to zero, respectively.
|
|||
/// </remarks>
|
|||
// <typeparam name="T">
|
|||
template <class T> |
|||
class EventSignalBase |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Constructs an event signal with empty connect and disconnect actions.
|
|||
/// <summary>
|
|||
EventSignalBase() : |
|||
m_nextCallbackToken(0) |
|||
{ |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Destructor.
|
|||
/// <summary>
|
|||
virtual ~EventSignalBase() |
|||
{ |
|||
UnregisterAllCallbacks(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Callback type that is used for signalling the event to connected clients.
|
|||
/// </summary>
|
|||
using CallbackFunction = std::function<void(T eventArgs)>; |
|||
|
|||
/// <summary>
|
|||
/// The argument type for the callback event
|
|||
/// </summary>
|
|||
using CallbackArgument = T; |
|||
|
|||
/// <summary>
|
|||
/// A monotonically increasing token used for registration, tracking, and unregistration of callbacks.
|
|||
/// </summary>
|
|||
using CallbackToken = uint32_t; |
|||
|
|||
/// <summary>
|
|||
/// Registers a callback to this EventSignalBase and assigns it a unique token.
|
|||
/// </summary>
|
|||
/// <param name="callback"> The callback to register. </param>
|
|||
/// <returns>
|
|||
/// The new token associated with this registration that can be used for subsequent unregistration.
|
|||
/// </returns>
|
|||
CallbackToken RegisterCallback(CallbackFunction callback) |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
|
|||
auto token = m_nextCallbackToken; |
|||
m_nextCallbackToken++; |
|||
|
|||
m_callbacks.emplace(token, callback); |
|||
|
|||
return token; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// If present, unregisters a callback from this EventSource associated with the provided token. Tokens are
|
|||
/// returned from RegisterCallback at the time of registration.
|
|||
/// </summary>
|
|||
/// <param name="token">
|
|||
/// The token associated with the callback to be removed. This token is provided by the return value of
|
|||
/// RegisterCallback at the time of registration.
|
|||
/// </param>
|
|||
/// <returns> A value indicating whether any callback was unregistered in response to this request. </returns>
|
|||
bool UnregisterCallback(CallbackToken token) |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
return (bool)m_callbacks.erase(token); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Function call operator.
|
|||
/// Signals the event with given arguments <paramref name="t"/> to connected clients, see also <see cref="Signal"/>.
|
|||
/// </summary>
|
|||
/// <param name="t">Event arguments to signal.</param>
|
|||
void operator()(T t) |
|||
{ |
|||
Signal(t); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Unregisters all registered callbacks.
|
|||
/// <summary>
|
|||
void UnregisterAllCallbacks() |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
m_callbacks.clear(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Signals the event with given arguments <paramref name="t"/> to all connected callbacks.
|
|||
/// <summary>
|
|||
/// <param name="t">Event arguments to signal.</param>
|
|||
void Signal(T t) |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
|
|||
auto callbacksSnapshot = m_callbacks; |
|||
for (auto callbackCopyPair : callbacksSnapshot) |
|||
{ |
|||
// now, while a callback is in progress, it can disconnect itself and any other connected
|
|||
// callback. Check to see if the next one stored in the copy container is still connected.
|
|||
bool stillConnected = (std::find_if(m_callbacks.begin(), m_callbacks.end(), |
|||
[&](const std::pair<CallbackToken, CallbackFunction> item) { |
|||
return callbackCopyPair.first == item.first; |
|||
}) != m_callbacks.end()); |
|||
|
|||
if (stillConnected) |
|||
{ |
|||
callbackCopyPair.second(t); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Checks if a callback is connected.
|
|||
/// <summary>
|
|||
/// <returns>true if a callback is connected</returns>
|
|||
bool IsConnected() const |
|||
{ |
|||
std::unique_lock<std::recursive_mutex> lock(m_mutex); |
|||
return !m_callbacks.empty(); |
|||
} |
|||
|
|||
protected: |
|||
std::map<CallbackToken, CallbackFunction> m_callbacks; |
|||
CallbackToken m_nextCallbackToken; |
|||
mutable std::recursive_mutex m_mutex; |
|||
|
|||
private: |
|||
EventSignalBase(const EventSignalBase&) = delete; |
|||
EventSignalBase(const EventSignalBase&&) = delete; |
|||
EventSignalBase& operator=(const EventSignalBase&) = delete; |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
@ -0,0 +1,115 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <string> |
|||
#include <sstream> |
|||
#include <iterator> |
|||
#include <azac_api_c_diagnostics.h> |
|||
#include <speechapi_c_property_bag.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_cxx_log_level.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
namespace Diagnostics { |
|||
namespace Logging { |
|||
|
|||
/// <summary>
|
|||
/// Class with static methods to control file-based SDK logging.
|
|||
/// Turning on logging while running your Speech SDK scenario provides
|
|||
/// detailed information from the SDK's core native components. If you
|
|||
/// report an issue to Microsoft, you may be asked to provide logs to help
|
|||
/// Microsoft diagnose the issue. Your application should not take dependency
|
|||
/// on particular log strings, as they may change from one SDK release to another
|
|||
/// without notice.
|
|||
/// FileLogger is the simplest logging solution and suitable for diagnosing
|
|||
/// most on-device issues when running Speech SDK.
|
|||
/// Added in version 1.20.0
|
|||
/// </summary>
|
|||
/// <remarks>File logging is a process wide construct. That means that if (for example)
|
|||
/// you have multiple speech recognizer objects running in parallel, there will be one
|
|||
/// log file containing interleaved logs lines from all recognizers. You cannot get a
|
|||
/// separate log file for each recognizer.</remarks>
|
|||
class FileLogger |
|||
{ |
|||
public: |
|||
/// <summary>
|
|||
/// Starts logging to a file.
|
|||
/// </summary>
|
|||
/// <param name="filePath">Path to a log file on local disk</param>
|
|||
/// <param name="append">Optional. If true, appends to existing log file. If false, creates a new log file</param>
|
|||
/// <remarks>Note that each write operation to the file is immediately followed by a flush to disk.
|
|||
/// For typical usage (e.g. one Speech Recognizer and a Solid State Drive (SSD)) this should not
|
|||
/// cause performace issues. You may however want to avoid file logging when running many Speech
|
|||
/// SDK recognizers or other SDK objects simultaneously. Use MemoryLogger or EventLogger instead.</remarks>
|
|||
static void Start(const SPXSTRING& filePath, bool append = false) |
|||
{ |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
|
|||
SPX_THROW_HR_IF(SPXERR_INVALID_ARG, filePath.empty()); |
|||
|
|||
SPX_THROW_ON_FAIL(property_bag_create(&hpropbag)); |
|||
SPX_THROW_ON_FAIL(property_bag_set_string(hpropbag, -1, "SPEECH-LogFilename", Utils::ToUTF8(filePath).c_str())); |
|||
SPX_THROW_ON_FAIL(property_bag_set_string(hpropbag, -1, "SPEECH-AppendToLogFile", append ? "1" : "0")); |
|||
SPX_THROW_ON_FAIL(diagnostics_log_start_logging(hpropbag, nullptr)); |
|||
SPX_THROW_ON_FAIL(property_bag_release(hpropbag)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Stops logging to a file.
|
|||
/// </summary>
|
|||
/// <remarks>This call is optional. If logging as been started,
|
|||
/// the log file will be written when the process exists normally.</remarks>
|
|||
static void Stop() |
|||
{ |
|||
SPX_THROW_ON_FAIL(diagnostics_log_stop_logging()); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets or clears the filters that apply to file logging.
|
|||
/// Once filters are set, the callback will be invoked only if the log string
|
|||
/// contains at least one of the strings specified by the filters. The match is case sensitive.
|
|||
/// </summary>
|
|||
/// <param name="filters">Optional. Filters to use, or an empty list to remove previously set filters.</param>
|
|||
static void SetFilters(std::initializer_list<std::string> filters = {}) |
|||
{ |
|||
SPXPROPERTYBAGHANDLE hpropbag = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(property_bag_create(&hpropbag)); |
|||
|
|||
PropBagSetFilter(hpropbag, filters); |
|||
|
|||
SPX_THROW_ON_FAIL(diagnostics_log_apply_properties(hpropbag, nullptr)); |
|||
SPX_THROW_ON_FAIL(property_bag_release(hpropbag)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the level of the messages to be captured by the logger
|
|||
/// </summary>
|
|||
/// <param name="level">Maximum level of detail to be captured by the logger.</param>
|
|||
static void SetLevel(Level level) |
|||
{ |
|||
const auto levelStr = Details::LevelToString(level); |
|||
diagnostics_set_log_level("memory", levelStr); |
|||
} |
|||
|
|||
private: |
|||
static void PropBagSetFilter(AZAC_HANDLE hpropbag, std::initializer_list<std::string> filters) |
|||
{ |
|||
std::string str = ""; |
|||
|
|||
if (filters.size() > 0) |
|||
{ |
|||
std::ostringstream filtersCollapsed; |
|||
std::copy(filters.begin(), filters.end(), std::ostream_iterator<std::string>(filtersCollapsed, ";")); |
|||
str = filtersCollapsed.str(); |
|||
} |
|||
|
|||
SPX_THROW_ON_FAIL(property_bag_set_string(hpropbag, -1, "SPEECH-LogFileFilters", str.c_str())); |
|||
} |
|||
}; |
|||
|
|||
}}}}} |
|||
@ -0,0 +1,70 @@ |
|||
//
|
|||
// Copyright (c) Microsoft. All rights reserved.
|
|||
// See https://aka.ms/csspeech/license for the full license information.
|
|||
//
|
|||
// speechapi_cxx_grammar.h: Public API declarations for Grammar C++ class
|
|||
//
|
|||
|
|||
#pragma once |
|||
#include <speechapi_cxx_common.h> |
|||
#include <speechapi_cxx_smart_handle.h> |
|||
#include <speechapi_cxx_string_helpers.h> |
|||
#include <speechapi_c.h> |
|||
|
|||
namespace Microsoft { |
|||
namespace CognitiveServices { |
|||
namespace Speech { |
|||
|
|||
|
|||
/// <summary>
|
|||
/// Represents base class grammar for customizing speech recognition.
|
|||
/// Added in version 1.5.0.
|
|||
/// </summary>
|
|||
class Grammar |
|||
{ |
|||
public: |
|||
|
|||
/// <summary>
|
|||
/// Creates a grammar from a storage ID.
|
|||
/// Added in version 1.7.0.
|
|||
/// </summary>
|
|||
/// <param name="storageId)">The persisted storage ID of the language model.</param>
|
|||
/// <returns>The grammar.</returns>
|
|||
/// <remarks>
|
|||
/// Creating a grammar from a storage ID is only usable in specific scenarios and is not generally possible.
|
|||
/// </remarks>
|
|||
static std::shared_ptr<Grammar> FromStorageId(const SPXSTRING& storageId) |
|||
{ |
|||
SPXGRAMMARHANDLE hgrammar = SPXHANDLE_INVALID; |
|||
SPX_THROW_ON_FAIL(grammar_create_from_storage_id(&hgrammar, Utils::ToUTF8(storageId.c_str()))); |
|||
|
|||
return std::make_shared<Grammar>(hgrammar); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Internal constructor. Creates a new instance using the provided handle.
|
|||
/// </summary>
|
|||
/// <param name="hgrammar">Grammar handle.</param>
|
|||
explicit Grammar(SPXGRAMMARHANDLE hgrammar = SPXHANDLE_INVALID) : m_hgrammar(hgrammar) { } |
|||
|
|||
/// <summary>
|
|||
/// Destructor, does nothing.
|
|||
/// </summary>
|
|||
virtual ~Grammar() { } |
|||
|
|||
/// <summary>
|
|||
/// Internal. Explicit conversion operator.
|
|||
/// </summary>
|
|||
/// <returns>A handle.</returns>
|
|||
explicit operator SPXGRAMMARHANDLE() { return m_hgrammar; } |
|||
|
|||
protected: |
|||
/*! \cond PROTECTED */ |
|||
DISABLE_COPY_AND_MOVE(Grammar); |
|||
|
|||
SmartHandle<SPXGRAMMARHANDLE, &grammar_handle_release> m_hgrammar; |
|||
/*! \endcond */ |
|||
}; |
|||
|
|||
|
|||
} } } // Microsoft::CognitiveServices::Speech
|
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue