2012/07/09(月) [n年前の日記]
#1 [dtm][javascript][prog] まだHTML5 Audioを勉強中
Webページ上で多数の音声を次々に鳴らす実験をしていたのだけど。とりあえず、こんな感じになった。
_HTML5 Audio test 2 (2016/09/04, 2017/03/19 置き場所変更)
Dropbox に置いたので、「音声リスト読込」ボタンを押した後の全音声読み込みに少し時間がかかるのだけど。一応鳴ってるっぽい。
データフォルダURLに ./voice1/ を指定して「音声リスト読込」「再生」をすれば、この実験の目指してたところが分かって、そのくだらなさに呆れかえること間違いなしなのだけど、それはさておき。ランダムに一定間隔で、細切れの音声を次々に再生すれば、それっぽくなるんじゃないかと安易に思っていたけれど、全然甘かった。以下、感じた問題点をメモ。
_HTML5 Audio test 2 (2016/09/04, 2017/03/19 置き場所変更)
Dropbox に置いたので、「音声リスト読込」ボタンを押した後の全音声読み込みに少し時間がかかるのだけど。一応鳴ってるっぽい。
データフォルダURLに ./voice1/ を指定して「音声リスト読込」「再生」をすれば、この実験の目指してたところが分かって、そのくだらなさに呆れかえること間違いなしなのだけど、それはさておき。ランダムに一定間隔で、細切れの音声を次々に再生すれば、それっぽくなるんじゃないかと安易に思っていたけれど、全然甘かった。以下、感じた問題点をメモ。
◎ 問題点その1。 :
前に鳴っていた音声を途中で打ち切って、次の音声を再生しようとすると、ブチブチとノイズが入って気に障る。これはブラウザの、サウンド周りの実装に起因してる気がする。
微小なフェードアウトをかけてみたり、Audio.muted = true で打ち切ってみたりしたけれど、全く改善せず。そもそも、音を聞いた限りでは、フェードアウトが出来てない予感。Audio.volume の値はたしかに変化しているが、音量変化が実際に行われるタイミングが異なっているのではないかと邪推。あるいは、現状のブラウザは、連続でサウンドを鳴らすとそれだけでノイズが入る状態なのかもしれない。
解決策としては…。
微小なフェードアウトをかけてみたり、Audio.muted = true で打ち切ってみたりしたけれど、全く改善せず。そもそも、音を聞いた限りでは、フェードアウトが出来てない予感。Audio.volume の値はたしかに変化しているが、音量変化が実際に行われるタイミングが異なっているのではないかと邪推。あるいは、現状のブラウザは、連続でサウンドを鳴らすとそれだけでノイズが入る状態なのかもしれない。
解決策としては…。
- Audio Data API/Web Audio API を勉強して、それらを使って鳴らす。Firefox と Google Chrome 以外はガン無視。
- Flash で作り直す。
- Javaアプレットで作り直して(たぶん)地獄を見る。
- PyGame や Ruby/SDL 等を使って、ローカル環境のみで実験する。
◎ 問題点その2。 :
これも、音声を途中で打ち切る場合の問題だけど。一旦ブチッと切って繋げてしまうと、どうにも不自然。各音声を滑らかに繋げる・変化させるための、何かしらの工夫が必要だなと。
一応、前の音声をフェードアウトさせつつ、同時に次の音声をフェードインで重ねてみたりもしたのだけれど。そもそもフェードアウトが実現できてないっぽいので、改善されたようには聞こえなかった。
ただ、このあたり、一般的な音声合成のソレとは事情が異なるから難易度は低いはず。一般的な音声合成なら、発音がはっきり聞こえないと問題があるけれど。自分がやりたかったソレは、むしろはっきり発音しないほうが都合がいいというか、突拍子もない、予測不能な声らしき音が聞こえてきたほうがそれっぽくなりそうだし。低レベルな音声処理部分に問題が無ければ、いくらでも解決策は見出せそうな予感も。…考えが甘いかもしれないけれど。
一応、前の音声をフェードアウトさせつつ、同時に次の音声をフェードインで重ねてみたりもしたのだけれど。そもそもフェードアウトが実現できてないっぽいので、改善されたようには聞こえなかった。
ただ、このあたり、一般的な音声合成のソレとは事情が異なるから難易度は低いはず。一般的な音声合成なら、発音がはっきり聞こえないと問題があるけれど。自分がやりたかったソレは、むしろはっきり発音しないほうが都合がいいというか、突拍子もない、予測不能な声らしき音が聞こえてきたほうがそれっぽくなりそうだし。低レベルな音声処理部分に問題が無ければ、いくらでも解決策は見出せそうな予感も。…考えが甘いかもしれないけれど。
◎ 問題点その3。 :
同じ音声が続けて鳴った場合に不自然。ピッチを変える、エンベロープ相当を加味して変化を与える等、何かしら微妙な違いを与えないといけない予感。
一応、Audio.playbackrate なるプロパティで、再生速度を変更できるらしいのだけど。試してみたところ、ピッチが変化するわけではなく、本当に再生速度変更だったり、ずっとブチブチしたノイズが入ったり、そもそもブラウザによっては変化してるように聞こえない・おそらくは機能が未実装だったりで、期待してた効果は得られなかった。
ただ、これについては、事前にどんな音声データを用意するかで、解決できそうな気もする。1つの音声データから、聞こえ具合が微妙に異なる音声データを複数作り、プログラム側は同じ音声を続けて再生しないようにすればいい。もっとも、そのやり方では、音声データがどんどん増えてしまう問題もあるわけで。プログラム側で変化を与えたほうが、容量が少なくて済みそう。
一応、Audio.playbackrate なるプロパティで、再生速度を変更できるらしいのだけど。試してみたところ、ピッチが変化するわけではなく、本当に再生速度変更だったり、ずっとブチブチしたノイズが入ったり、そもそもブラウザによっては変化してるように聞こえない・おそらくは機能が未実装だったりで、期待してた効果は得られなかった。
ただ、これについては、事前にどんな音声データを用意するかで、解決できそうな気もする。1つの音声データから、聞こえ具合が微妙に異なる音声データを複数作り、プログラム側は同じ音声を続けて再生しないようにすればいい。もっとも、そのやり方では、音声データがどんどん増えてしまう問題もあるわけで。プログラム側で変化を与えたほうが、容量が少なくて済みそう。
◎ 問題点その4。 :
ランダムで鳴らすと、各音声の関連性が見出せず、今一つな感じが強い。「ああ、乱数で鳴らしてますねえ」と興醒めしてしまう。どの音声から、どの音声に繋がるか、別途データが必要なのかもしれない。
しかし、そういう鳴らし方は、結局は楽曲データを鳴らしているのと変わらないわけで。サンプラー音源にその手の音声を突っ込んで、MIDIシーケンサ相当で鳴らしたほうが手っ取り早いだろう、という話になりそう。
個人的には、そういうことをしなくてもそれっぽくならないか、パラメータを与えることで変化を出せないか、と思って実験を始めたわけで。最初から人間が音声の並びを全部用意できるなら、そりゃ実現は容易だけど、単なる力技になって、作業時間がどんどん増えてしまう。というか、膨大なシナリオを声優さんに渡して収録するほうが、音声が自然になるからベスト、という話にもなりそう。しかし、そのやり方では、音声に関してインタラクティブ性が実現できないわけで。画面内の状況変化に対応して音声が変化していかなければ、この手のソレを行う意味がないと思っていたり。
しかし、そういう鳴らし方は、結局は楽曲データを鳴らしているのと変わらないわけで。サンプラー音源にその手の音声を突っ込んで、MIDIシーケンサ相当で鳴らしたほうが手っ取り早いだろう、という話になりそう。
個人的には、そういうことをしなくてもそれっぽくならないか、パラメータを与えることで変化を出せないか、と思って実験を始めたわけで。最初から人間が音声の並びを全部用意できるなら、そりゃ実現は容易だけど、単なる力技になって、作業時間がどんどん増えてしまう。というか、膨大なシナリオを声優さんに渡して収録するほうが、音声が自然になるからベスト、という話にもなりそう。しかし、そのやり方では、音声に関してインタラクティブ性が実現できないわけで。画面内の状況変化に対応して音声が変化していかなければ、この手のソレを行う意味がないと思っていたり。
◎ ということで。 :
心底くだらないことを安直な方法でやろうとしたにも関わらず、それでも結構技術的な問題点が多々見えてきてしまって、なかなか難しいもんだなと。
3Dカスタム少女とか、カスタムメイド3Dとか、このへんの処理はどうやっているんだろう…。音声データ以外の管理情報をどこまで持つのか、その管理情報をどう活用して、波形レベルでどんな変化を与えるのか、というあたりが鍵なのだろうか。いや、もっと簡単な方法で実現しているのでは、という気もしているのだけど。
3Dカスタム少女とか、カスタムメイド3Dとか、このへんの処理はどうやっているんだろう…。音声データ以外の管理情報をどこまで持つのか、その管理情報をどう活用して、波形レベルでどんな変化を与えるのか、というあたりが鍵なのだろうか。いや、もっと簡単な方法で実現しているのでは、という気もしているのだけど。
◎ 2017/03/19追記。 :
Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。
[ ツッコむ ]
以上です。