2013-01-15

Flashで外部swfに埋め込んだサウンドを使う

さきほど書いた記事 Flashで外部swfに埋め込んだフォントを使う と同じやりかたで外部swfのEmbed soundも再生できた。ここでは効果音として短い音を鳴らしている。BGMを鳴らす方法は Flashで外部swfに埋め込んだサウンドをBGMにする に書いた。

環境

  • Windows7 64bit
  • FlashPro CS3 (CS6はwav埋め込んだswfを出力できなかった、理由不明。CS3ならできた)
  • FlashDevelop 4.0.4 + Flex SDK 4.6

ソース

Main.as

package 
{
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;
    import flash.system.LoaderContext;
    import flash.system.ApplicationDomain;
    import flash.utils.getTimer;
    
    /**
     * ...
     * @author itouhiro
     */
    [SWF(backgroundColor="0xf8f8f8", width="320",height="240", frameRate="10")]
    public class Main extends Sprite 
    {
        private var wavfiles:Array = 'あ い いぇ う ヴぁ うぃ ヴぃ うぇ ヴぇ うぉ ヴぉ え お おぁ か が き ぎ きぇ ぎぇ きゃ ぎゃ きゅ ぎゅ きょ ぎょ く ぐ け げ こ ご さ ざ し じ しぇ じぇ しゃ じゃ しゅ じゅ しょ じょ す ず すぃ ずぃ せ ぜ そ ぞ た だ ち ちぇ ちゃ ちゅ ちょ つ つぁ つぃ つぇ つぉ て で てぃ でぃ てゅ でゅ と ど とぅ どぅ な に にぇ にゃ にゅ にょ ぬ ね の は ば ぱ ひ び ぴ ひぇ びぇ ぴぇ ひゃ びゃ ぴゃ ひゅ びゅ ぴゅ ひょ びょ ぴょ ふ ぶ ぷ ふぁ ふぃ ふぇ ふぉ へ べ ぺ ほ ぼ ぽ ま み みぇ みゃ みゅ みょ む め も や ゆ よ ら り りぇ りゃ りゅ りょ る れ ろ わ ん'.split(' ');
        private var channel:SoundChannel;
        private var voices:Object;
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
            var req:URLRequest = new URLRequest('https://sites.google.com/site/itouhiro/2013/voice_teto.swf');
            var ld:Loader = new Loader();
            var context:LoaderContext = new LoaderContext();
            
            //指定する。Load先のappDomain
            context.applicationDomain = ApplicationDomain.currentDomain;
            ld.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
            ld.load(req, context);
        }
        
        private function loadCompleteHandler(e:Event):void 
        {
            voices = { }; //assoc array
            for (var i:int = 0; i < wavfiles.length; i++) {
                var classRef:Class = ApplicationDomain.currentDomain.getDefinition(wavfiles[i]) as Class;
                var snd:Sound = new classRef();
                voices[wavfiles[i]] = snd;
            }
            
            channel = new SoundChannel();
            var greeting = 'こ ん に ち わ ぴょ ん な ぜ ヴぇ す と お つ く さ な い の か'.split(' ');
            for (i = 0; i < greeting.length; i++) {
                trace('channel = voices[' + greeting[i] + '].play(1, 0); ');
                channel = voices[greeting[i]].play(1, 0);
                //channel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler);
                var wait:uint = getTimer();
                while (getTimer() - wait < 300) { ; }  //wait 0.3 sec
            }
        }
    }
}

Event.SOUND_COMPLETEをうまく受け取れないので、getTimer()の簡易sleepでウェイトをかけています。ウェイトかけないと、すべての音をほぼ同時に発音してしまい、何言ってるかわからないので。

実際のswfファイルは音がでるので、ここには貼っていません。 Googleサイト itouhiroで「添付ファイルをダウンロードするには、ここをクリック」をクリックすると聞くことができます。

サウンド埋め込みswfの作り方

外部swfである voice_teto.swf の作り方をメモ。

  • 「重音テト音声ライブラリー」 http://kasaneteto.jp で単独音をダウンロード。今回使ったのは以前ダウンロードした重音テトLite091010。
  • Cygwinで以下のPerlスクリプトを動作させる。
print("#!/bin/sh\n");
while(<*.wav>){
  $fn = $_;
  $fn_new = 'short/'.$fn;
  #print("mv $fn $fn_new\n");
  print("/m/sox-14.3.0/sox -q $fn $fn_new gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04"."\n");
}

するとこんなシェルスクリプトが生成される。

#!/bin/sh
/m/sox-14.3.0/sox -q あ.wav short/あ.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q いぇ.wav short/いぇ.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q い.wav short/い.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q うぃ.wav short/うぃ.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q うぇ.wav short/うぇ.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q うぉ.wav short/うぉ.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
/m/sox-14.3.0/sox -q う.wav short/う.wav gain -n -0.1 fade q 0 00:00:00.24 00:00:00.04
...(以下省略)...

そのシェルスクリプトを実行すると、音量をノーマライズ(限度近くまで音量を上げる)して、音声再生時間を短くして、fade out(音の終わりをぶつ切りではなく徐々に音量を下げる)処理をする。

  • そのwavファイルを聞いて、音のおかしなものがないか確認する。私の確認したときは さ.wav ざ.wav ぽ.wav に問題あって手加工した。
  • 必要なwavファイルのみ voice_tetoフォルダに配置する。
  • Flash ProでJSFLを使って指定フォルダ以下のファイルをライブラリにimport の手順を実行して、ライブラリにwavファイルを読み込みリンケージ設定する。
  • voice_teto.flaというファイル名で保存しておく。
  • FlashProで[ファイル - パブリッシュ設定] で Flash(.swf)のオーディオストリームの音質を変える。デフォルトは mp3 16kbpsという低音質になっているので、mp3 80kbps 品質優先などに変える。そして[パブリッシュ]。
  • voice_teto.swfが出力される。

小春音アミ 声の加工

wav頭の空白を除去する

r:_ami フォルダに使用wavを集めて、 Cygwinで以下を実行。

/r/voice_ami$ for F in *[^1].wav; do echo sox $F `echo $F|sed "s/\.wav//"`trim.wav silence 1 0.01 0.1% 1 0.01 0.1% : newfile : restart; done > trimtop.bat
/r/voice_ami$ unix2dos trimtop.bat

r:_ami.bat をダブルクリックして実行。

wavの頭の空白を除去できる。wavの終わりになんだか無音が残る。

sox infile outfile silenceの文法

  •   silenceのあとの1はsplitの場合は1でよい(曲頭の空白を消すという意味)。splitしない場合は2とか指定する意味がある。
  •   そのあとの0.01は秒。0.5秒だとこのwavの無音領域より長いのでカットできない。
  •   0.1%は無音判定の閾値(volume値)。0%でもカットできるけど超極小音量が残って「見た目は無音がかなり残ってる」ように見える。
  •   そのあとの1 0.01 0.1%は曲の末尾の無音を消す指定だが、正確には消せないので、正確にカットするにはreverseも使う必要あり。

曲終わりにも無音を残さないようにする1

(まず無音で先頭を曲をカット(曲末尾は適当にカット)して、そのカット部分を前後逆にして無音で先頭をカット(曲末尾は適当にカット)、そして逆にして保存)←うまく動作しない。wavが前後反転

R:\sox-14.4.0>sox norm.wav a.wav silence 1 0.01 0.1% 1 0.01 0.1% reverse silence 1 0.01 0.1% 1 0.01 0.1% reverse : newfile : restart

曲終わりにも無音を残さないようにする2

(まず無音で先頭の無音を正確にカット(曲末尾は適当にカット)して、そのカット部分を前後逆にして無音で先頭だけ正確にカット、そして逆にして保存)←うまく動作しない

R:\sox-14.4.0>sox norm.wav a.wav silence 1 0.01 0.1% 1 0.01 0.1% reverse silence 1 0.01 0.1% reverse : newfile : restart

0.01秒指定じゃなくてsample数(1秒で44100samples)で指定することもできる←うまく動作しない

R:\sox-14.4.0>sox norm.wav a.wav silence 1 100 0.1% 1 100 0.1% reverse silence 1 100 0.1% reverse : newfile : restart

声素材

[話者] 声素材は「小春音アミ」 http://www14.big.or.jp/~amiami/happy/ を使用した。以前使っていた重音テトはライセンスが少し気になってた。こういうキーボードで声出るFlashは想定してないみたいで‥‥。オレのは無料Flashではあるけど、もしかして音源再配布にあたるかもしれないと懸念を持ったのさ。

小春音アミは音源ダウンロードページで

声の出るピアノなどのアプリにつかったり、 HANASUなどの会話合成技術でしゃべらせたり。。。 いろんな用途につかってみてください♪

と、まさに今回の用途に使っていいと明示的に許可をくれるライセンスだったので感謝さ。おもに「小春音アミ 単独音  Ver 3.00」の おまけ音源/*短.wav を未加工で使わせてもらってる。今までの音素材は未加工で使えるのはなかったし、使い勝手もいいんだ。 ぁぃぅぇぉゃゅょ はB4(高め)の声を短くfade outして Amplify -10dB加工で音量を下げている。

あと「ゲームやアプリに使えそうな声素材」からも使用してる。 ! ? 、 。 の記号を押したときの声にね。

[合いの手] 声もかわいい感じだね。ちゃんと背骨が通ってる感じのしっかりした声なのでよかった。

0 件のコメント:

コメントを投稿

人気記事