概要
前回コルーチンで非同期処理を書いていた以下の記事をUniTaskで書き直したものです。
修正したDemoAudioRecorder.csのスクリプトのみ掲載しています。
残りのスクリプトや使い方等は、以前の投稿をご覧ください。
開発環境
Windows 10
Unity 2019.4.31f1
Api Compatibility Level .NET Standard 2.0
実装
詳細はスクリプト中にコメントで記載しています。
DemoAudioRecorder.cs
using System;
using System.Linq;
using UnityEngine;
using Cysharp.Threading.Tasks;
public class DemoAudioRecorder : MonoBehaviour
{
// Start is called before the first frame update
private string microphone;
private AudioClip microphoneInput;
private const int RECORD_LENGTH_SEC = 10;
private const int SAMPLE_RATE = 41100;
void Start()
{
// 利用可能なマイクを検出
microphone = Microphone.devices.FirstOrDefault();
Debug.Log("microphone: " + microphone);
if (microphone == null)
{
Debug.LogError("No microphone found");
return;
}
// 第二引数をtrueにすると循環バッファとしてループ保存
microphoneInput = Microphone.Start(microphone, false, RECORD_LENGTH_SEC, SAMPLE_RATE);
Debug.Log("録音を開始します。何か話してください。");
WaitAndExecute().Forget(); // Forget()メソッドで、awaitが無いけれど大丈夫?という警告を無視
}
// Update is called once per frame
void Update() { }
/// <summary>
/// 10秒間待機して、録音結果をWAVファイルに保存
/// </summary>
private async UniTask WaitAndExecute()
{
// 10秒間待機
await UniTask.Delay(TimeSpan.FromSeconds(10));
Debug.Log("録音を終了し、WAVファイルに保存します。");
// 保存先ファイルの設定
var filePath = string.Format("{0}/{1}/{2}", Application.persistentDataPath, "recordings", "recordedAudio.wav");
Debug.Log("filePath: " + filePath);
// AudioClipからWAVファイルを作成
SaveWavFile(filePath, microphoneInput);
}
/// <summary>
/// AudioClipからWAVファイルを作成
/// WavUtilityには以下のコードを利用。ただし、FromAudioClipメソッドの一部を修正
/// https://github.com/deadlyfingers/UnityWav/tree/master
/// </summary>
private void SaveWavFile(string filepath, AudioClip clip)
{
// AudioClipからWAVファイルを作成
byte[] wavBytes = WavUtility.FromAudioClip(clip, filepath, true);
}
}