4

Javascript を使用して音声の録音を書き起こすツールに取り組んでいます。audio基本的に、キー イベントをフックして、タグで読み込まれたファイルを再生、一時停止、およびループします。

このようなことを行うための高度な既存のデスクトップ アプリが多数あります ( Transcriberなど -スクリーンショットはこちら)。ほとんどの文字起こしツールには、音声ファイル内をジャンプするために使用できる波形が組み込まれています。これは、文字起こし者がフレーズを視覚的に見つけて繰り返しまたはループすることを学習できるため、非常に役立ちます。

Javascript を使用して、ブラウザでこの機能のサブセットをエミュレートできるかどうか疑問に思っています。私は信号処理についてあまり知りません。おそらくそれは実現可能でさえありません。

しかし、私が思い描いているのは、Javascript がファイルからサウンド ストリームを読み取り、振幅を定期的にサンプリングすることです。振幅が特定の時間のしきい値よりも長く非常に低い場合、それはフレーズ ブレークとしてラベル付けされます。

このようなラベリングは、転写に非常に役立つと思います。次に、キー コマンドを設定して、前の沈黙の期間にジャンプすることができました。仮説として(jQueryベースのAPIを想像して):

var audio = $('audio#someid');

var silences = silenceFindingVoodoo(audio);

silencessilenceには時間のリストが含まれているため、ユーザーがさまざまなsをジャンプできるように何らかの方法で接続しcurrentTime、 を選択した値に設定して再生することができます。

Javascriptでこの種のことを行うことさえ考えられますか?

4

5 に答える 5

3

はい、Web Audio APIで可能です。より正確にはAnalyserNodeが必要です。簡単な概念実証を行うために、この例を取得して、次のコードを に追加しますdrawTimeDomain()

var threshold = 1000;
var sum = 0;
for (var i in amplitudeArray) {
    sum += Math.abs(128 - amplitudeArray[i]);
}
var test = (sum < threshold) ? 'silent' : 'sound';
console.log('silent info', test);

サイレントをミリ秒単位でフィルタリングする追加のロジックが必要です (たとえば、500 ミリ秒を超えるサイレントは、実際のサイレントと見なされます)。

于 2019-01-10T14:21:10.000 に答える
1

これらのオーディオ ファイルを処理するために使用したいツールが JavaScript だとは思いません。ただし、javascript を使用すると、音声ファイル内で無音部分が発生する場所を記述した対応する XML ファイルを簡単に読み取ることができ、ユーザー インターフェイスを適切に調整できます。次に、問題は、これらの XML ファイルを生成するために何を使用するかです。

  1. すぐに機能のデモを行う必要がある場合は、手動で行うことができます。(これらのオーディオ エンベロープが発生する場所を確認するには、大胆さを使用してください)

  2. C# で wav 処理ライブラリを作成するこのCodeProject の記事を確認してください。著者は、入力ファイルから無音を抽出する関数を作成しました。おそらく、ハッキングを開始するのに適した場所です。

私の最初の考えは 2 つだけです ... オーディオ処理 API はたくさんありますが、それらは特定のフレームワークとアプリケーション プログラミング言語用に書かれています。フーリエ変換が本当に好きでない限り、ゼロから何かを書き込もうとする前に、必ずそれらを利用してください。

于 2009-10-01T02:39:55.450 に答える
1

これは JavaScript を使用して可能だと思います(もちろん、お勧めできないかもしれませんが)。この記事:

https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data

...ファイルにバイナリデータとしてアクセスする方法について説明します。オーディオファイルをバイナリデータとして取得したら、好きなことを行うことができます(とにかく、私はJavaScriptにあまり強くありません)。WAV 形式のオーディオ ファイルの場合、データは既に時間領域のサンプルによって編成されているため、これは簡単な作業です。圧縮形式 (MP3 など) のオーディオ ファイルでは、圧縮されたデータを時間領域のサンプルに変換することは、javascript で実行するのが非常に困難になるため、成功した場合、あなたの周りに宗教を見つけることができます。

更新: 質問をもう一度読んだ後、ファイルが WAV 形式ではなく MP3 形式であっても、JavaScript で議論していることを実際に実行できる可能性があることに気付きました。私があなたの質問を理解しているように、あなたは実際に無音のストレッチを実際に取り除くのではなく、オーディオストリーム内の無音のポイントを見つけようとしているだけです。

サイレント ストレッチを見つけるために、MP3 ファイルの周波数領域データを WAV ファイルの時間領域データに戻す必要は必ずしもありません。実際、オーディオの静かなストレッチを特定することは、実際には時間領域よりも周波数領域でより確実に行うことができます。静かなストレッチは、周波数応答グラフがはっきりと平坦になる傾向がありますが、時間領域では、特に自動レベリングが発生している場合、可聴音声のピーク振幅がバックグラウンド ノイズのピークよりもそれほど高くないことがあります。

ファイルが VBR (可変ビット レート) ではなく CBR (固定ビット レート) である場合、javascript での MP3 ファイルの分析は非常に簡単になります。

于 2009-10-01T02:41:10.563 に答える
1

私の知る限り、JavaScript はこれを行うには十分強力ではありません。

これを行うには、フラッシュまたはある種のサーバー側処理に頼る必要があります。

HTML5 のオーディオ/ビデオ タグを使用すると、ページをだましてこのようなことをさせることができる場合があります。サーバー側で沈黙を特定し、それらの沈黙のタイムスタンプをページ内のメタデータ (隠しフィールドなど) としてクライアントに送信し、それを使用して JavaScript が音声ファイル内のそれらのスポットを識別できるようにすることができます。

于 2009-10-01T02:13:13.520 に答える
1

WebWorker スレッドを使用する場合、Javascript でこれを実行できる可能性がありますが、これを行うにはブラウザーでより多くのスレッドを使用する必要があります。問題を複数のスレッドに分割して処理することはできますが、これを再生と同期させることはほぼ不可能です。そのため、Javascript は、オーディオ処理を行うことでサイレント期間を決定できますが、それを再生にうまくリンクできないため、最適な選択ではありません。

ただし、ユーザーに波形を表示したい場合は、javascript とキャンバスを使用できますが、ストリーミングについては次の段落を参照してください。

あなたの最善の策は、サーバーにオーディオをストリーミングさせ、処理を実行してすべての無音を見つけることです。次に、これらのそれぞれを個別のファイルに保存して、無音の間を簡単にジャンプできるようにする必要があります。ストリーミングによって、サーバー アプリは新しいファイルをいつロードするかを判断できるため、中断はありません。

于 2009-10-01T02:22:25.843 に答える