ailia_speech  1.3.0.0
APIの使用方法

High Level API

High Level APIの概要

C::のHigh Level API では、AiliaSpeechのLow Level APIを抽象化したAiliaSpeechModelが使用可能です。AiliaSpeechModelは、マルチスレッドでテキスト化を行う設計となっています。Openでモデルファイルを読み込み、PCMの波形をTranscribeに供給、推論が終わったらGetResultsで推論結果を取得します。

void OnEnable(){
// インスタンス作成
AiliaSpeechModel ailia_speech = new AiliaSpeechModel();
ailia_speech.Open(asset_path + "/" + encoder_path, asset_path + "/" + decoder_path, env_id, memory_mode, api_model_type, task, flag, language);
}
void Update(){
// マイクから波形の取得
float [] waveData = GetMicInput();
// マルチスレッドの処理結果を取得
List<string> results = ailia_speech.GetResults();
for (uint idx = 0; idx < results.Count; idx++){
string text = results[(int)idx];
string display_text = text + "\n";
content_text = content_text + display_text;
}
// 新規推論をリクエスト
ailia_speech.Transcribe(waveData, frequency, channels, complete);
waveQueue = new List<float[]>(); // キューを初期化
}
void OnDisable(){
// インスタンス解放
ailia_speech.Close();
}

ライブ変換

ライブ変換を有効にするには、Open APIの引数にAILIA_SPEECH_FLAG_LIVEを与えます。

flag = AiliaSpeech.AILIA_SPEECH_FLAG_LIVE;

プレビューは、IntermediateCallbackに通知されます。

string text = GetIntermediateText();

VAD

無音検知を使用する場合、Open APIの後にOpenVAD APIを呼び出します。

ailia_speech.OpenVad(asset_path + "/" + "silero_vad.onnx", AiliaSpeech.AILIA_SPEECH_VAD_TYPE_SILERO);

ポストプロセス

音声認識結果に対して、音声認識誤り訂正や、翻訳などの後処理を適用する場合、Open APIの後にOpenPostProcess APIを呼び出します。

音声認識誤り訂正を使用する場合

ailia_speech.OpenPostProcess(asset_path + "/" +"t5_whisper_medical-encoder.obf.onnx", asset_path + "/" +"t5_whisper_medical-decoder-with-lm-head.obf.onnx", asset_path + "/" +"spiece.model", null, "医療用語の訂正: ", AiliaSpeech.AILIA_SPEECH_POST_PROCESS_TYPE_T5);

翻訳を使用する場合

英語から日本語

ailia_speech.OpenPostProcess(asset_path + "/" +"fugumt_en_ja_seq2seq-lm-with-past.onnx", null, asset_path + "/" +"fugumt_en_ja_source.spm", asset_path + "/" +"fugumt_en_ja_target.spm", null, AiliaSpeech.AILIA_SPEECH_POST_PROCESS_TYPE_FUGUMT_EN_JA);

日本語から英語

ailia_speech.OpenPostProcess(asset_path + "/" +"fugumt_ja_en_encoder_model.onnx", asset_path + "/" +"fugumt_ja_en_decoder_model.onnx", asset_path + "/" +"fugumt_ja_en_source.spm", asset_path + "/" +"fugumt_ja_en_target.spm", null, AiliaSpeech.AILIA_SPEECH_POST_PROCESS_TYPE_FUGUMT_JA_EN);

翻訳

AiliaSpeechTranslateModelを使用することで、翻訳のみを実行することが可能です。

void OnEnable(){
// インスタンス作成
AiliaSpeechModel ailia_speech = new AiliaSpeechModel();
ailia_speech_translate.Open(asset_path + "/" +"fugumt_en_ja_seq2seq-lm-with-past.onnx", null, asset_path + "/" +"fugumt_en_ja_source.spm", asset_path + "/" +"fugumt_en_ja_target.spm", AiliaSpeech.AILIA_SPEECH_POST_PROCESS_TYPE_FUGUMT_EN_JA, env_id, memory_mode);
}
void Translate(){
// 翻訳
string output = ailia_speech_translate.Translate(ui_input_field.text);
}
void OnDisable(){
// インスタンス解放
ailia_speech_translate.Close();
}

Low Level API

Low Level APIの概要

C::のLow Level APIでは、AiliaSpeech名前空間にC APIをそのままマッピングしています。

ailia Speechでは、ailiaSpeechCreateでインスタンスを作成、ailiaSpeechOpenModelFileでモデルを開き、ailiaSpeechPushInputDataでPCMを入力、ailiaSpeechBufferedで十分なPCMが入力されたか確認、ailiaSpeechTranscribeでテキスト化、ailiaSpeechGetTextで認識結果を取得可能です。

ailiaSpeechPushInputDataは音声全体を入力する必要はなく、少しずつ音声を供給することが可能であり、マイクからのリアルタイム入力を受けることができます。

// インスタンス作成
IntPtr net = IntPtr.Zero;
AiliaSpeech.AILIASpeechApiCallback callback = AiliaSpeech.GetCallback();
int memory_mode = Ailia.AILIA_MEMORY_REDUCE_CONSTANT | Ailia.AILIA_MEMORY_REDUCE_CONSTANT_WITH_INPUT_INITIALIZER | Ailia.AILIA_MEMORY_REUSE_INTERSTAGE;
AiliaSpeech.ailiaSpeechCreate(ref net, env_id, Ailia.AILIA_MULTITHREAD_AUTO, memory_mode, AiliaSpeech.AILIA_SPEECH_TASK_TRANSCRIBE, AiliaSpeech.AILIA_SPEECH_FLAG_NONE, callback, AiliaSpeech.AILIA_SPEECH_API_CALLBACK_VERSION);
string base_path = Application.streamingAssetsPath+"/";
AiliaSpeech.ailiaSpeechOpenModelFile(net, base_path + "encoder_small.onnx", base_path + "decoder_small_fix_kv_cache.onnx", AiliaSpeech.AILIA_SPEECH_MODEL_TYPE_WHISPER_MULTILINGUAL_SMALL);
// 言語設定
AiliaSpeech.ailiaSpeechSetLanguage(net, "ja");
// PCMをまとめて供給
AiliaSpeech.ailiaSpeechPushInputData(net, samples_buf, threadChannels, (uint)samples_buf.Length / threadChannels, threadFrequency);
// テキスト化するための十分なPCMがあるか
while (true){
// テキスト化するための十分なPCMが供給されたか
uint buffered = 0;
AiliaSpeech.ailiaSpeechBuffered(net, ref buffered);
if (buffered == 1){
// テキスト化の実行
AiliaSpeech.ailiaSpeechTranscribe(net);
// 取得できたテキストの数を取得
uint count = 0;
AiliaSpeech.ailiaSpeechGetTextCount(net, ref count);
// テキストの取得
for (uint idx = 0; idx < count; idx++){
AiliaSpeech.AILIASpeechText text = new AiliaSpeech.AILIASpeechText();
AiliaSpeech.ailiaSpeechGetText(net, text, AiliaSpeech.AILIA_SPEECH_TEXT_VERSION, idx);
float cur_time = text.time_stamp_begin;
float next_time = text.time_stamp_end;
Debug.Log(Marshal.PtrToStringAnsi(text.text));
}
}
// 全てのPCMの処理が終わったかどうか
uint complete = 0;
AiliaSpeech.ailiaSpeechComplete(net, ref complete);
if (complete == 1){
break;
}
}
// インスタンス解放
AiliaSpeech.ailiaSpeechDestroy(net);

GPUの使用

GPUを使用するには、AiliaSpeech.Openのenv_id引数にGPUのenv_idを指定します。 AILIA_ENVIRONMENT_ID_AUTOを指定した場合は、CPUで推論が行われます。 GPUのenv_idを取得する方法は、AiliaSpeechSample.csのGetEnvId()を参照してください。 下記の例では、ailiaのAPIを使用して環境を列挙し、env_typeが1の場合にGPUのenv_idを取得しています。

private int GetEnvId(int env_type){
int env_id = Ailia.AILIA_ENVIRONMENT_ID_AUTO;
if (env_type == 1) { // GPU
int count = 0;
Ailia.ailiaGetEnvironmentCount(ref count);
for (int i = 0; i < count; i++){
IntPtr env_ptr = IntPtr.Zero;
Ailia.ailiaGetEnvironment(ref env_ptr, (uint)i, Ailia.AILIA_ENVIRONMENT_VERSION);
Ailia.AILIAEnvironment env = (Ailia.AILIAEnvironment)Marshal.PtrToStructure(env_ptr, typeof(Ailia.AILIAEnvironment));
if (env.backend == Ailia.AILIA_ENVIRONMENT_BACKEND_MPS || env.backend == Ailia.AILIA_ENVIRONMENT_BACKEND_CUDA || env.backend == Ailia.AILIA_ENVIRONMENT_BACKEND_VULKAN){
env_id = env.id;
env_name = Marshal.PtrToStringAnsi(env.name);
}
}
} else {
env_name = "cpu";
}
return env_id;
}

プラットフォームごとの注意点

Windows

Unity Pluginのサンプルでは、ファイルダイアログにStandaloneFileBrowserアセットを使用しています。StandaloneFileBrowserの制約で、Windows環境でil2cppでビルドするとエラーが発生するため、monoでビルドしてください。これはailia Speechの制約ではないため、ファイルダイアログを使用しない場合はil2cppを使用可能です。

iOS

iOSで動作させる場合は、CapabilityにIncreased Memory Limitを指定してください。Smallモデルで1.82GB程度のメモリが必要なためです。

Android

AndroidではStreamingAssetsのファイルへの直接アクセスが行えないため、起動時にTemporaryCachePathにモデルファイルを転送します。