このコンテンツは自動機械翻訳サービスによる翻訳版であり、皆さまの便宜のために提供しています。原本の英語版と異なる誤り、省略、解釈の微妙な違いが含まれる場合があります。ご不明な点がある場合は、英語版原本をご確認ください。
Cloudflare Streamは動画が大好きです。しかし、すべてのワークフローに全体像が必要ではないことはわかっています。ポッドキャストの人気は、スタンドアロンの音声がいかに説得力のあるものであるかを浮き彫りにしています。開発者にとって、音声にアクセスするためだけに動画を処理するのは、遅く、コストがかかり、複雑なものです。
動画動画が高額になる理由動画ファイルは、時間をかけてつなぎ合わせられた高解像度のimagesの密度の高いスタックです。そのため、1つのファイルとしてだけでなく、1秒あたりのフレーム数、解像度、コーデックなどの高次元データのコンテナとなっています。動画を分析することは、時間解像度のフレームレートを移動することを意味します。
それに比べて、音声ファイルははるかにシンプルです。オーディオファイルが1つのチャンネルのみで構成されている場合は、単一のフォームとして定義されます。このフォームの技術的特性は、サンプルレート(1秒あたりに採用される音声サンプルの数)とビットの深さ(各サンプルの精度)によって定義されます。
計算量の多いAI推論パイプラインの台頭により、お客様の多くは音声の分析のみを必要とするダウンストリームのワークフローを実行したいと考えています。たとえば:
このような場合に動画データを使用することは、費用がかかるだけでなく、不要なものです。
そこで導入するのが、音声抽出機能です。この機能により、一回のAPI呼び出し、またはダッシュボードのクリックで、あらゆる動画から軽量のM4A音声トラックを抽出できるようになりました。
動画から音声を抽出するための柔軟な方法を2つご紹介します。
メディアTransformationsは、どこにでも保存できるソーシャルメディアクリップなどの短い形式の動画を処理して変換するのに最適です。メディアを送信元から直接取得し、当社のエッジで最適化し、効率的に配信することで機能します。
当社は、このワークフローを拡張して音声も含めました。変換URLにmode=audioを追加するだけで、どこにでも保存された動画ファイルから音声をオンザフライで抽出できるようになりました。
ドメインでメディアTransformationsを有効にすると、あらゆるソース動画から音声を抽出できます。時間と継続時間を指定して、特定のセクションをクリップすることもできます。
例:
https://example.com/cdn-cgi/media/mode=audio,time=5s,duration=10s/<SOURCE-VIDEO>
上記のリクエストにより、ソース動画から5秒マークから始まる10秒のM4A音声クリップが作成されます。セットアップやその他のオプションの詳細については、メディアTransformationsのドキュメントをご覧ください。
Stream内で管理するあらゆるコンテンツのオーディオトラックを直接ダウンロードできるようになりました。オフライン視聴用のダウンロード可能なMP4生成に加え、永続的なM4Aオーディオファイルの作成と保存もできるようになりました。
ここでは、Cloudflareの自社製品の1つであるWorkers AIでMedia Transformationsを使用する方法を示すサンプルコードをご覧いただけます。次のコードでは、まず動画の音声を英語に翻訳し、次にスペイン語に翻訳するという2つのステップを実行します。
export default {
async fetch(request, env, ctx) {
// 1. Use Media Transformations to fetch only the audio track
const res = await fetch( "https://blog.cloudflare.com/cdn-cgi/media/mode=audio/https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/announcing-audio-mode.mp4" );
const blob = await res.arrayBuffer();
// 2. Transcribe the audio to text using Whisper
const transcript_response = await env.AI.run(
"@cf/openai/whisper-large-v3-turbo",
{
audio: base64Encode(blob), // A base64 encoded string is required by @cf/openai/whisper-large-v3-turbo
}
);
// Check if transcription was successful and text exists
if (!transcript_response.text) {
return Response.json({ error: "Failed to transcribe audio." }, { status: 500 });
}
// 3. Translate the transcribed text using the M2M100 model
const translation_response = await env.AI.run(
'@cf/meta/m2m100-1.2b',
{
text: transcript_response.text,
source_lang: 'en', // The source language (English)
target_lang: 'es' // The target language (Spanish)
}
);
// 4. Return both the original transcription and the translation
return Response.json({
transcription: transcript_response.text,
translation: translation_response.translated_text
});
}
};
export function base64Encode(buf) {
let string = '';
(new Uint8Array(buf)).forEach(
(byte) => { string += String.fromCharCode(byte) }
)
return btoa(string)
}
実行後、workerはクリーンなJSONレスポンスを返します。以下に示すのは、workerが返したレスポンスを文字起こし、翻訳されたものです。
トランスクリプト:
{
"transcription": "I'm excited to announce that Media Transformations from Cloudflare has added audio-only mode. Now you can quickly extract and deliver just the audio from your short form video. And from there, you can transcribe it or summarize it on Worker's AI or run moderation or inference tasks easily.",
"translation": "Estoy encantado de anunciar que Media Transformations de Cloudflare ha añadido el modo solo de audio. Ahora puede extraer y entregar rápidamente sólo el audio de su vídeo de forma corta. Y desde allí, puede transcribirlo o resumirlo en la IA de Worker o ejecutar tareas de moderación o inferencia fácilmente."
}
Streamチームの夏インターンとして、私は長い間要望されてきたこの機能のリリースに取り組みました。まず、Streamのメディアパイプラインの複雑なアーキテクチャを理解することでした。
Streamで動画が処理される場合、次の2つの経路のいずれかをとります。1つ目は、Streamに直接アップロードされた動画を処理するビデオオンデマンド(VOD)パイプラインです。アダプティブビットレートストリーミング用のエンコードされた動画セグメントのセットを生成し保存し、HLS/DASHでストリーミング配信することができます。もう1つの経路は、Stream LiveとMedia Transformationsサービスを稼働する、オンザフライエンコーディング(またはOTFE)パイプラインです。OTFEは、ファイルを事前処理して保存する代わりに、お客様自身のWebサイトからメディアを取得し、エッジでTransformationsを行います。
私のプロジェクトは、これらの両方のパイプラインを拡張して音声抽出をサポートすることでした。
OTFEパイプラインは、リアルタイムで操作できるように設計されています。既存のフローは視覚的なタスク向けに設計されています。メディア Transformations を有効にしているお客様が、自分のWebサイトにリクエストを行うと、エントリーポイントとして機能するエッジサーバーにルーティングされます。その後、リクエストは検証され、ユーザーのリクエストごとに、OTFEは動画を取得し、サイズ変更バージョンまたは静止フレームのサムネイルを生成します。
音声のみの抽出をサポートするために、既存のワークフローに新しいモードを追加しました。これには、次のようなものが含まれます:
検証ロジックの拡張:特に音声の場合、重要な検証ステップは、抽出を試みる前にソース動画に音声トラックが含まれていることを確認することでした。これは、リクエストされたURLが正しい形式であることを確認する既存の検証ステップに追加されるものです。
新しいTransformationsハンドラーの構築:これは私のプロジェクトの中核でした。私は、高品質のM4Aファイルを配信するために、ビジュアルトラックを破棄する新しいハンドラーをOTFEプラットフォーム内で構築しました。
このプロジェクトは、OTFEに関する私の仕事と同様に、現在のMP4ダウンロードのワークフローを音声のみのM4Aダウンロードに拡張するものでした。これにより、一連の興味深い技術的決定が提示されました。
動画ダウンロードの作成の一般的なフローは、認証と検証を処理するメインAPI層へのPOSTリクエストから始まり、対応するデータベースレコードを作成します。次に、ジョブを非同期キューに入れ、Workerが処理タスクを実行します。VODのオーディオダウンロードを可能にするために、新しいタイプ固有のAPIエンドポイント(POST /downloads/{type} )を導入しましたが、従来のPOST /downloadsルートはデフォルトや動画のダウンロードタイプのダウンロードを作成するためのエイリアスとして保存します。これにより、完全な後方互換性が確保されました。
ダウンロードの作成というコア作業は、非同期キューによって行われます。含まれるサービス:
APIルートからメディア処理コマンドまで、このパイプラインの各コンポーネントを拡張することで、お客様のために音声中心のワークフローを可能にする、要望の多かった新しい機能を提供することができました。
この機能は、Streamダッシュボードでも利用可能になりました。どの動画に移動するだけで、動画または音声をダウンロードできるオプションが表示されます。
ダウンロードの準備が完了すると、ファイルのURLと、無効にするオプションが表示されます。
このプロジェクトは、長年のお客様のニーズに応え、動画から音声を操作するためのよりシンプルな方法を提供するものです。問題の理解からソリューションの出荷まで、そして特にチームから受けたメンターシップやガイダンスには本当に感謝しています。開発者がこの新機能を使用して、Cloudflare Streamでより効率的で刺激的なアプリケーションを構築する様子が見られることを楽しみにしています。
Streamに動画をアップロードするか、APIを使用して、音声抽出機能をお試しください。このような技術的課題に挑戦してみたいと思われる方は、当社のインターンシップと初期人材プログラムをご覧になり、ご自身の道のりを始めてください。