AI時代的網站與手機App建置與開發Part36 - 使用Azure OpenAI的影片生成功能

 l  摘要

Azure OpenAI支援的影片生成功能可以用來生成商品介紹短片(例如房地產, 汽車, 機車, 等等), 內容介紹短片, 測試不同影片的巿場反應, 教學短片, 電影預告或動畫短片, 電腦遊戲開發, 旅遊導覽, 或是快速呈現概念與想法, 短短幾分鐘就可以生出需要的影片, 相較於廣告工作室的製作的影片, 成本更是低廉. 例如輸入以下的內容當做提示:[飛行中的LABUBU與台北101大樓], 或是[卡皮巴拉與動物園導覽]等等, 都是影片生成的典型範例.

 

: 使用Azure OpenAI影片生成功能生成的企鵝影片範例

l  使用Azure OpenAI服務

欲使用Azure OpenAI資源實踐文字生成, 首先要登入Microsoft Azure Portal(網址: https://portal.azure.com), 登入成功後您會看到如圖1的畫面:

1: Microsoft Azure Portal建立資源的畫面

點選圖1中的[建立資源], 螢幕就會出現如圖2的畫面

2: 建立Azure OpenAI資源的畫面

點選圖2畫面左方的[AI應用程式與代理程式], 再點選右邊的[Azure OpenAI], 您將會看到如圖3的畫面:

3: 輸入Azure OpenAI資源的基本資訊

請於圖3畫面建立新的或選擇資源群組或選擇現有的資源群組, 選擇建立群組的區域, 收費層級, 然後點選[下一頁], 您將會看到圖4的畫面:

4: 設定Azure OpenAI資源網路安全性的畫面

請於圖4畫面中選擇[所有網路], 點選[下一頁], 您就會看到設定分類標籤的畫面, 如圖5所示:

5: 設定分類標籤的畫面, 請點選[下一頁]繼續, 您將會看到如圖6的畫面:

6: 建立Azure OpenAI資源的畫面

請點選[建立]鍵執行建立Azure OpenAI資源, 建立完成後請瀏覽至建立妥的Azure

OpenAI資源, 您將會看到如圖7的畫面

7: Azure OpenAI資源管理畫面

點選[探索Azure AI Foundry入口網站], 再點選左邊功能表的[影片]功能, 您將會看到如圖8的畫面:

8: 影片生成功能的體驗館

點選[立即部署]功能, 您會看到如圖9的畫面:

9: 選擇部署影片生成模型的畫面, 請點選左方欲使用的影片生成模型(例如sora), 再按下[確認], 螢幕上就會出現影片生成模型的相關使用資料, 如圖10所示:

10: 檢視欲部署的影片生成模型的詳細資料

按下圖10畫面中的[部署到選取的資源]鍵進行部署, 部署完成後就會出現體驗影片生成功能的體驗畫面, 如圖11所示:

11: 體驗影片生成功能的體驗畫面

完成生成影片工作之後, 點選生成的影片上方的的[檢視程式碼]連結, 可以看到叫用影片生成功能的範例程式碼, 如圖12所示:

12: 檢視叫用影片生成功能的範例程式碼的畫面. 請點選畫面中的[金鑰認証]頁籤, 在畫面的下方就可以看到叫用影片生成功能的諯點與金鑰, 我們需要這兩個資訊以製作叫用影片生成功的程式:

以下就是使用JavaScript叫用Azure OpenAI影片生成功能的網頁程式

<!DOCTYPE html>

<html>

<head>

  <title>Azure OpenAI - Plain JS Example</title>

  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/

bootstrap@5.3.3/dist/css/bootstrap.min.css">

  <style>

    html, body {

      height: 100%;

      width: 100%;

    }

  </style>

</head>

<body>

    <div class="container" style="width:40%;height:100%">

        <h3 class="mb-3 text-center">影片生成</h3>

        <div class="form-floating mb-3">

            <input id="prompt" class="form-control"                                                  value="飛行的Labubu" placeholder=""/>

            <label class="form-label">影片生成提示</label>

        </div>

        <div class="mb-3">

            <button class="btn btn-success" onclick="generateVideo()">

影片生成</button>

        </div>

    </div>    

    <script>

    const endpoint = "Azure OpenAI影片生成功能的端點";

    const apiKey = "Azure OpenAI影片生成功能的金鑰";

    const model = 'sora';

    const apiVersion = "preview";

    // 叫用createVideoGenerationJob函式生成影片,

// 再叫用pollJobStatus函式等待影片生成完成

    async function generateVideo() {

       // 取得使用者輸入的提示  

        const prompt = document.getElementById("prompt").value;    

        // 利用使用者輸入的提示生成影片

const jobId = await createVideoGenerationJob(prompt);      

        if (!jobId)                  // 生成影片失敗

            return;                  // 結束函式

        await pollJobStatus(jobId);  // 非同步等待影片生成完成

    };

 

    // 叫用Azure OpenAI影片生成功能的函式

    async function createVideoGenerationJob(prompt) {

        try {

            // 叫用Azure OpenAI影片生成功能

            const response = await fetch(`${endpoint}/openai/v1/video

/generations/jobs?api-version=${apiVersion}`, {

                method: 'POST',

                headers: {

                    'Content-Type': 'application/json',

                    'api-key': apiKey,

                },

                body: JSON.stringify({

                    "model": model,

                    "prompt": prompt,

                    "n_variants": "1",

                    "n_seconds": "5",

                    "height": "1080",

                    "width": "1920",

                }),

            });                

            if (!response.ok) {           // 叫用影片生成功能失敗

                throw new Error(

`HTTP error! Status: ${response.status}`);

            }

            const data = await response.json();     // 取得影片生成結果

            console.log('Video generation job created:', data);

            return data.id;           // 傳回執行影片生成功能的jobId

        } catch (error) {                           // 捕捉執行時期錯誤

            console.log(`Error creating video generation

job:${error.message}`); // 顯示錯誤訊息

        }

    }

 

    // 查詢影片生成工作進度

    async function pollJobStatus(jobId) {

        try {

            // 查詢指定jobId的影片生成工作的進度

            const response = await fetch(`${endpoint}/openai/v1/video/

generations/jobs/${jobId}?api-version=${apiVersion}`, {

                method: 'GET',

                headers: {

                    'api-key': apiKey,

                },

            });

            if (!response.ok) {                     // 查詢失敗

                throw new Error(

`HTTP error! Status: ${response.status}`);  // 抛出例外

            }

            const data = await response.json();     // 取得查詢結果

            console.log('Job status:', data.status);

            if (data.status === 'succeeded') { // 如果狀態為succeeded

                // 下載生成的影片            

downloadGeneratedVideo(data.generations[0].id);    

            }

            else if (data.status === 'failed') { // 如果狀態為failed

                throw new Error('Video generation failed'); // 抛出例外

            }

        }

        catch (error) {                             // 捕捉執行時期錯誤

            console.error(

'Error polling job status:', error);    // 顯示錯誤訊息

        }

    }

    // 負責下載生成的影片的函式

    async function downloadGeneratedVideo(generationId){

        // 取得生成的影片的下載網址

        let url = `${endpoint}/openai/v1/video/generations/

${generationId}/content/video?api-version=${apiVersion}`;

        try {            

            // 依據下載網址下載生成的影片

            const response = await fetch(url, {

                method:"GET",

                headers:{

                    "Authorization": apiKey,

                    "Content-Type": "application/json"

                }});

            if (!response.ok) {                  // 如果下載失敗

                throw new Error(

`HTTP error! Status: ${response.status}`);  // 抛出例外

            }

            const blob = await response.blob(); // 取得生成的影片的內容

            // 依據生成的影片內容建立影片網址

const videoUrl = window.URL.createObjectURL(blob);  

            // 建立<a>超連結元素

const link = document.createElement('a');

            link.href = videoUrl;    // 設定<a>超連結元素的href屬性

            // 設定下載影片的檔案名稱

link.download = 'sora_generated_video.mp4';        

            // <a>超連結元素加入到顯示的網頁文件document.body.appendChild(link);                    

            link.click();                  // 點選<a>超連結元素

            // <a>超連結元素從顯示的網頁文件移除document.body.removeChild(link);                    

            // 釋放生成的影片內容的網址window.URL.revokeObjectURL(url);                    

        }

        catch (error) {                   // 捕捉執行時期錯誤

            console.error(

'Error downloading video:', error.message);//顯示錯誤訊息

        }

    }

    </script>

</body>

</html>

程式碼範例下載網址: https://github.com/CraigIII/AzureOpenAIVideoGeneration.git

留言

這個網誌中的熱門文章

AI時代的網站與手機App建置與開發Part27 - ML.NET與物件偵測

AI時代的網站與手機App建置與開發Part24 - ML.NET與圖片異常偵測

AI時代的網站與手機App建置與開發Part28 - 使用YOLO模型進行物件偵測