Unity研究所<Unityによるゲーム開発、映像開発>

Unity初心者40代後半中年中間管理職おやじが綴るゲームで小遣い稼ぎできるようになるまでのブログ

Unity 小ネタ スマホで録音してWavファイルで保存

今回は、現在Google Play Storeで公開中のスマホアプリ「Sound Effect Player」に追加した、録音機能の実装方法について覚書として残しておく

 

play.google.com

 

youtu.be

 

〇概要

このアプリでの録音機能について一応簡単に触れておく

このアプリにはタップして音を鳴らすためのボタン(音楽機材のサンプラー的にPadと呼んでいる)が複数あり、それぞれのPadに音声ファイルを登録して鳴らすような仕様となっている

 

その中で、自分でスマホで録音してWavファイルとしてスマホ内に保存して、これをPadに登録して鳴らすことも可能にしている

 

ということで・・・・・(あれ、前置きいらんかったかも)

 

スマホでの録音

➁Wavファイルとして保存

 

までを書き残しておく

 

流れとしては、

・Microphoneクラスを使用

・使えるデバイスの検索

・Start関数で録音開始 AudioClipとして記憶

・End関数で録音終了 

・AudioClipをWav形式のファイルとして保続 

 

 

スマホでの録音

コード全体////////////////////////////////////////////////////////////////////////////////// 

using UnityEngine;

AudioClip SamplingClip;

 

 //まずは使用可能なデバイスを検索

 if (Microphone.devices.Length == 0) 
 {
  return;
 }

 //いくつか列挙される場合もあるが、主に使われる(?)一番目のデバイス名を取得

 string mic = Microphone.devices[0]; 

 

  //録音中かどうかにより、処理を分岐

 //アプリの操作の流れ的には、録音ファイルを登録するPadをタップして録音開始する 

 if (!isRecording)
 {

  //録音中でない場合は録音開始

  SamplingClip = Microphone.Start(mic, false, 10, 44100);

 

  if (SamplingClip) {
   isRecording = true;
   CurrentFileLabel.text = "録音中"; //状態の表示を更新
  }

 }

//録音中にPadが押された場合
 else { 

   //録音終了
   Microphone.End(mic);

   if (SamplingClip == null)
   {
    CurrentFileLabel.text = "録音失敗";
   }
   else {

    //AudioClipがnullでない場合はWav形式でファイルを保存

    SaveWavFile();
    isRecording = false;

   }
 }/////////////////////////////////////////////////////////////////////////////////////////

〇Microphoneクラス 使用関数

//デバイスの検索

public static string devices ; 

 

//録音開始

public static AudioClip Microphone.Start (string deviceName, bool loop, int lengthSec, int frequency);


deviceName  デバイス
loop

 ループ録音を行なうかどうか、行なう場合は lengthSec に到達したときにクリップの最初に戻って録音を継続する
lengthSec  録音するオーディオクリップの長さ
frequency  録音するオーディオクリップの周波数

 

//録音終了

End (string deviceName);

 

 

➁Wavファイルとして保存

流れとしては

・ファイル名を入力するダイアログを表示

・ファイル名が入力されてOKボタンが押されたら、ファイルを保存

 

//ファイル名を入力するダイアログを表示

public void SaveWavFile()
{
 FileBrowser.SetDefaultFilter(".wav");
 FileBrowser.ShowSaveDialog(OnSaveSuccess, OnSaveCancel, false, false, null,
"Save", "Save");

}

 

 ファイルダイアログについては、フリーのアセットを使用させてもらっているので、下記を参照 

harukichi.hatenadiary.jp


 //ファイル名が入力されてOKボタンが押された場合の処理

void OnSaveSuccess(string paths)
{

 //ファイルダイアログで入力したファイル名と、アプリの保存されているパスを

 合成して保存先のパスを生成

 string destpath = 

 Application.persistentDataPath+"/"+FileBrowserHelpers.GetFilename(paths[0]);

 

 //保存先とAudioClipを渡してWavファイル保存処理へ

 if (!SavWav.Save(destpath, SamplingClip))
  CurrentFileLabel.text = "音声ファイルの保存失敗";

 

 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
}

 

なお、AudioClipをWavファイル形式で保存するコードは、「darktable」さんの「SavWav.cs」を使用させてもらったのと、中身はよくわからないので・・・(-_-メ)

Unity3D: script to save an AudioClip as a .wav file. · GitHub

 

 

Androidのファイルの保存について

 現状Google Play StoreにアップロードできるアプリのAPIレベルは29以上になってしまい、以前のように自由にファイルブラウザでアクセスするというようなことはできなくなってしまったので、この点非常に面倒になってしまった

 

 セキュリティの問題とか・・・・

 

 なので、スマホにファイルを保存するには、許可されたフォルダにしかできない

 

 ということで、「 Application.persistentDataPath」というアプリ自体が保存されるパスを取得してきてその中に保存するという形でwavファイルを保存している

 

 このやり方が正解かも正直よくわからないが・・・・<m(__)m>

 

今回は以上