Unity Sentisを使ったローカルで高速なspeech-to-text
はじめに
UnityがHuggingFace上でUnity Sentisのサンプルを公開しました。下記から簡単にサンプルを試すことができます。
今回は、Unityが公開しているサンプルの1つ、「sentis-whisper-tiny」を使ってローカルで高速にspeech-to-textを行う、サンプルを作成します。
実行環境
今回は、Unity 6 Betaを使用します。Unity Sentisの特徴上、モバイル、PC関係なく動作するそうですが、今回はMac上で動作確認しています。
Unity
- Unityバージョン:Unity 6 Beta
使用ライブラリ
- unity Sentis version 1.4.0-pre.3
- sentis-whisper-tiny
動作デバイス
- MacBookPro 16inch 2021
- チップ:Apple M1 Max
- メモリ:32GB
sentis-whisper-tinyについて
sentis-whisper-tinyは、Hugging Face上で公開されているopenai/whisper-tinyをUnity Sentisで使用できる様にしたものです。16kHzのモノラル音声ファイル(最大30秒)を指定された言語への直接転写(英語、ドイツ語、フランス語)か、英語への翻訳を行えます。
ローカルで音声入力が行えるメリット
ローカルでspeech-to-textが行えるメリットとして、API使用量が掛からないこと、ネットワークに繋がらなくても動作する点にメリットがあります。これによって大人数を対象にしたプロダクトにおいても、コストをかけずにspeech-to-textを実現できます。
成果予定物
今回のテーマ「Unity Sentisを使ったローカルで高速なspeech-to-text」にある様に、下記のポストの様にローカルで高速なSpeech-to-textを作成します。
作成手順
成果物を作るにあたって、以下の手順で実現します。
- Unity Sentisを導入する。
- sentis-whisper-tinyを導入する。
- 音声入力を実装する。
- 音声入力したファイルをsentis-whisper-tinyに渡してテキストに変換。
- これらをUI上で実現する。
Unity Sentisの導入
Unity Editor上のpackgae managerから、import package com.unity.sentisで導入を行います。この時、packgae manager上で確認できれば問題ありません。
sentis-whisper-tinyを導入
プロジェクトのAssets直下を、ターミナルで開き下記のコマンドを実行します。
git clone https://huggingface.co/unity/sentis-whisper-tiny
git cloneコマンドが行われて、sentis-whisper-tinyを導入できます。
音声入力の実装
音声入力の実装は下記のcsファイルで実現します。ボタンが押されたらマイクから、録音を開始します。録音停止ボタンが押されたら、録音を終了して音声ファイルとして出力します。
using System;
using UnityEngine;
using System.IO;
using UnityEngine.Serialization;
using UnityEngine.UI;
public class VoiceRecorder : MonoBehaviour
{
public AudioClip recordedClip;
[SerializeField] private RunWhisper runWhisper;
[SerializeField] private Button startRecordingButton;
[SerializeField] private Button stopRecordingButton;
private void Start()
{
startRecordingButton.onClick.AddListener(StartRecording);
stopRecordingButton.onClick.AddListener(StopRecording);
}
private void StartRecording()
{
recordedClip = Microphone.Start(null, false, 10, 16000);
Debug.Log("Recording started");
}
private void StopRecording()
{
Microphone.End(null);
Debug.Log("Recording stopped");
SaveRecordedClip();
}
private void SaveRecordedClip()
{
string fileName = "recorded_clip_" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".wav";
string filePath = Path.Combine(Application.dataPath, fileName);
SavWav.Save(filePath, recordedClip);
Debug.Log("Recorded clip saved as " + filePath);
runWhisper.audioClip = recordedClip;
runWhisper.StartWhisper();
}
}
音声入力したファイルをsentis-whisper-tinyに渡してテキストに変換。
sentis-whisper-tinyにあるRunWhisper(speech-to-textを実現するコード)を修正して、先ほど録音した音声をGameView上のテキストとして表示します。修正部分を下記に載せます。
69行目
+ public TextMeshProUGUI textMeshProUGUI;
71行目
+ Start
- StartWhisper
180行目
+ TranscriptionCompleted(outputString);
183行目
+void TranscriptionCompleted(string transcription)
+{
+ Debug.Log("Transcription: " + transcription);
+ textMeshProUGUI.text = "Output:"+transcription;
+}
UI上で実現する。
UI上で実現するために、下記の画像の様なUIを実現します。
UIの実現が完了したら、MainCameraにRunWhisper.cs、VoiceRecorder.csをアタッチします。さらに必要なUIをアタッチして完了です。
完成
ここまで完了しましたら、実行することでローカルで高速なspeech-to-textを実現できます。
おわりに
以上で今回の記事はおわりになります。今後もUnity Sentisで実現できる実装を紹介します。良いと思った方は、いいねとフォローをお願いします。
Discussion