🤖

Unity Sentisを使ったローカルで高速なspeech-to-text

2024/05/05に公開

はじめに

UnityがHuggingFace上でUnity Sentisのサンプルを公開しました。下記から簡単にサンプルを試すことができます。
https://huggingface.co/models?library=unity-sentis&sort=trending

今回は、Unityが公開しているサンプルの1つ、「sentis-whisper-tiny」を使ってローカルで高速にspeech-to-textを行う、サンプルを作成します。
https://huggingface.co/unity/sentis-whisper-tiny

実行環境

今回は、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を作成します。
https://twitter.com/HiromuGamesPOPO/status/1787011019539411350

作成手順

成果物を作るにあたって、以下の手順で実現します。

  1. Unity Sentisを導入する。
  2. sentis-whisper-tinyを導入する。
  3. 音声入力を実装する。
  4. 音声入力したファイルをsentis-whisper-tinyに渡してテキストに変換。
  5. これらをUI上で実現する。

Unity Sentisの導入

Unity Editor上のpackgae managerから、import package com.unity.sentisで導入を行います。この時、packgae manager上で確認できれば問題ありません。
alt text

sentis-whisper-tinyを導入

プロジェクトのAssets直下を、ターミナルで開き下記のコマンドを実行します。

git clone https://huggingface.co/unity/sentis-whisper-tiny

git cloneコマンドが行われて、sentis-whisper-tinyを導入できます。

音声入力の実装

音声入力の実装は下記のcsファイルで実現します。ボタンが押されたらマイクから、録音を開始します。録音停止ボタンが押されたら、録音を終了して音声ファイルとして出力します。

VoiceRecorder.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上のテキストとして表示します。修正部分を下記に載せます。

RunWhisper.cs
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を実現します。
alt text
UIの実現が完了したら、MainCameraにRunWhisper.cs、VoiceRecorder.csをアタッチします。さらに必要なUIをアタッチして完了です。

完成

ここまで完了しましたら、実行することでローカルで高速なspeech-to-textを実現できます。
https://twitter.com/HiromuGamesPOPO/status/1787011019539411350

おわりに

以上で今回の記事はおわりになります。今後もUnity Sentisで実現できる実装を紹介します。良いと思った方は、いいねとフォローをお願いします。

Discussion