{"id":46812,"date":"2024-09-18T00:00:00","date_gmt":"2024-09-18T07:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/building-video-summarizer-using-ai\/"},"modified":"2025-11-13T12:57:05","modified_gmt":"2025-11-13T20:57:05","slug":"building-video-summarizer-using-ai","status":"publish","type":"post","link":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/building-video-summarizer-using-ai\/","title":{"rendered":"Building Video Summarizer Using AI"},"content":{"rendered":"<p>With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform manually. An example of this is a video summarizer. Previously, the process of summarizing video content relied mainly on human vision and hearing. However, with AI models such as <a href=\"https:\/\/platform.openai.com\/docs\/models\/gpt-4-turbo-and-gpt-4\">GPT-4<\/a> and <a href=\"https:\/\/platform.openai.com\/docs\/models\/whisper\">Whisper<\/a>, it is now possible to automate this task.<\/p>\n<p>We will be utilizing the following technologies: OpenAI, Node.js, React, and GridDB. This blog will teach you how to create a basic web application for uploading a video and receiving a summary of the content.<\/p>\n<h2>Getting Started<\/h2>\n<p>Source code can be found here:<\/p>\n<p><code>$ git clone https:\/\/github.com\/griddbnet\/Blogs --branch voice_summarizer<\/code><\/p>\n<p>This project running on Ubuntu 20.04 LTS. These are the mandatory stack requirements that you need to run for this project:<\/p>\n<h3>OpenAI Key<\/h3>\n<p>To access any OpenAI services, we need a valid key. Go to this <a href=\"https:\/\/platform.openai.com\/api-keys\">link<\/a> and create a new OpenAI key.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/openai-key.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/openai-key.png\" alt=\"\" width=\"2992\" height=\"1322\" class=\"aligncenter size-full wp-image-30243\" srcset=\"\/wp-content\/uploads\/2024\/09\/openai-key.png 2992w, \/wp-content\/uploads\/2024\/09\/openai-key-300x133.png 300w, \/wp-content\/uploads\/2024\/09\/openai-key-1024x452.png 1024w, \/wp-content\/uploads\/2024\/09\/openai-key-768x339.png 768w, \/wp-content\/uploads\/2024\/09\/openai-key-1536x679.png 1536w, \/wp-content\/uploads\/2024\/09\/openai-key-2048x905.png 2048w, \/wp-content\/uploads\/2024\/09\/openai-key-600x265.png 600w\" sizes=\"(max-width: 2992px) 100vw, 2992px\" \/><\/a><\/p>\n<p>The OpenAI key is on a project basis, so we need to create a project first in the OpenAI platform and you need also to enable any models that you use on a project. For this project, we will need <code>gpt-4o<\/code> and <code>whisper<\/code> models.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/openai-enabled-models.png\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/openai-enabled-models.png\" alt=\"\" width=\"2542\" height=\"640\" class=\"aligncenter size-full wp-image-30242\" srcset=\"\/wp-content\/uploads\/2024\/09\/openai-enabled-models.png 2542w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-300x76.png 300w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-1024x258.png 1024w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-768x193.png 768w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-1536x387.png 1536w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-2048x516.png 2048w, \/wp-content\/uploads\/2024\/09\/openai-enabled-models-600x151.png 600w\" sizes=\"(max-width: 2542px) 100vw, 2542px\" \/><\/a><\/p>\n<p>The OpenAI key will be saved on the <code>.env<\/code> file and make sure not to include it in version control by adding it to the <code>.gitignore<\/code>.<\/p>\n<h3>Node.js<\/h3>\n<p>This project will run on the Node.js platform. You need to install it from <a href=\"https:\/\/nodejs.org\/en\/download\">here<\/a>. For this project, we will use the <code>nvm<\/code> package manager and Node.js v16.20.2 LTS version.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\"># installs nvm (Node Version Manager)\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.7\/install.sh | bash\n\n# download and install Node.js\nnvm install 16\n\n# verifies the right Node.js version is in the environment\nnode -v # should print `v16.20.2`\n\n# verifies the right NPM version is in the environment\nnpm -v # should print `8.19.4``<\/code><\/pre>\n<\/div>\n<p>To connect Node.js and GridDB database, you need the <a href=\"https:\/\/github.com\/nodejs\/node-addon-api\">gridb-node-api<\/a> npm package which is a Node.js binding developed using GridDB C Client and Node addon API.<\/p>\n<h3>FFmpeg<\/h3>\n<p>This project utilizes the <a href=\"https:\/\/www.npmjs.com\/package\/fluent-ffmpeg\"><code>fluent-ffmpeg<\/code><\/a> npm package, which requires FFmpeg to be installed on the system. For Ubuntu, you can use the following command to install it:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">sudo apt update\nsudo apt install ffmpeg<\/code><\/pre>\n<\/div>\n<p>For more installation information, please go to the <a href=\"https:\/\/ffmpeg.org\/\">FFmpeg official website<\/a>.<\/p>\n<h3>GridDB<\/h3>\n<p>To save the video summary and video data, we will use the GridDB database. Please look at the <a href=\"https:\/\/docs.griddb.net\/latest\/gettingstarted\/using-apt\/#install-with-apt-get\">guide<\/a> for detailed installation. We will use Ubuntu 20.04 LTS here.<\/p>\n<p>Run GridDB and check if the service is running. Use this command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">sudo systemctl status gridstore<\/code><\/pre>\n<\/div>\n<p>If not running try to run the database with this command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">sudo systemctl start gridstore<\/code><\/pre>\n<\/div>\n<h2>Run the Project<\/h2>\n<h3>Pull the Source Code<\/h3>\n<p>To run the project, you need to clone the code from this <a href=\"https:\/\/github.com\/junwatu\/video-summarizer-nodejs-griddb\">repository<\/a>.<\/p>\n<p>Run this command to pull the source code.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/junwatu\/video-summarizer-nodejs-griddb.git<\/code><\/pre>\n<\/div>\n<p>Change the directory to the <code>app<\/code> folder and install any project dependencies using this command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">cd video-summarizer-nodejs-griddb\nnpm install<\/code><\/pre>\n<\/div>\n<h3>Setup <code>.env<\/code><\/h3>\n<p>This project needs a few environment variables. Copy the <code>env.example<\/code> file to the <code>.env<\/code> file.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">cp .env .example .env<\/code><\/pre>\n<\/div>\n<p>You need to fill in the environment variables in this file:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">OPENAI_API_KEY=sk-....\nVITE_API_URL=http:\/\/localhost:3000<\/code><\/pre>\n<\/div>\n<p>It is important to note that the project must be restarted every time you change the <code>VITE_API_URL<\/code> environment variable.<\/p>\n<h3>Start the Project<\/h3>\n<p>Run this command to run the project:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">npm run start:build<\/code><\/pre>\n<\/div>\n<h3>Open Web App<\/h3>\n<p>Open the web app using the browser. The default URL is <code>http:\/\/localhost:3000<\/code>. Upload any videos and it&#8217;s recommended to upload a short video for fast processing. You can also use the video in the <code>test\/video<\/code> folder. Depending on the video duration, it will take a minute to process.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/ai-powered-video-summary.png\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/ai-powered-video-summary.png\" alt=\"\" width=\"1219\" height=\"850\" class=\"aligncenter size-full wp-image-30244\" srcset=\"\/wp-content\/uploads\/2024\/09\/ai-powered-video-summary.png 1219w, \/wp-content\/uploads\/2024\/09\/ai-powered-video-summary-300x209.png 300w, \/wp-content\/uploads\/2024\/09\/ai-powered-video-summary-1024x714.png 1024w, \/wp-content\/uploads\/2024\/09\/ai-powered-video-summary-768x536.png 768w, \/wp-content\/uploads\/2024\/09\/ai-powered-video-summary-600x418.png 600w\" sizes=\"(max-width: 1219px) 100vw, 1219px\" \/><\/a><\/p>\n<h2>How it Works?<\/h2>\n<p>The user flow for this project or web app involves opening the web app, uploading the video, waiting for processing, and receiving the summary result. It uses the GPT-4o and Whisper models from OpenAI to summarize the uploaded user video. This project requires two models because OpenAI models cannot process video directly, however they can process images or audio files. On the other side, in Node.js, to separate the video into images and audio files, we use the <a href=\"https:\/\/www.npmjs.com\/package\/fluent-ffmpeg\"><code>fluent-ffmpeg<\/code><\/a> npm package.<\/p>\n<p>These are the primary preparation steps for videos before we input them into OpenAI models for the summarization process.<\/p>\n<h3>1&#46; Video Processing<\/h3>\n<p>While it&#8217;s not possible to directly send a video to the API, GPT-4o can understand videos if you sample frames and then provide them as images. It performs better at this task than the earlier GPT-4 Turbo model.<\/p>\n<p>This function, <code>extractFrames()<\/code>, will extract images from the video file and save them in the <code>frames<\/code> folder.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">export function extractFrames(videoPath, secondsPerFrame, outputFolder) {\n    return new Promise((resolve, reject) => {\n        const frameRate = 1 \/ secondsPerFrame\n        const framePattern = path.join(outputFolder, 'frame-%03d.png')\n\n        ffmpeg(videoPath)\n            .outputOptions([`-vf fps=${frameRate}`])\n            .output(framePattern)\n            .on('end', () => {\n                fs.readdir(outputFolder, (err, files) => {\n                    if (err) {\n                        reject(err)\n                    } else {\n                        const framePaths = files.map(file => path.join(outputFolder, file))\n                        resolve(framePaths)\n                    }\n                })\n            })\n            .on('error', reject)\n            .run()\n    })\n}<\/code><\/pre>\n<\/div>\n<p>In the function <code>extractFrames<\/code>, the parameter <code>secondsPerFrame<\/code> defines the interval between frames that you want to extract from the video. Specifically, <code>secondsPerFrame<\/code> determines how many seconds should elapse between each frame that is extracted.<\/p>\n<p>Here\u00e2\u0080\u0099s how it works:<\/p>\n<p>Frame Rate Calculation: The frame rate is calculated as the reciprocal of secondsPerFrame, i.e., frameRate = 1 \/ secondsPerFrame. This means:<\/p>\n<ul>\n<li>If <code>secondsPerFrame<\/code> is 1, the frame rate is 1 frame per second.<\/li>\n<li>If <code>secondsPerFrame<\/code> is 0.5, the frame rate is 2 frames per second.<\/li>\n<li>If <code>secondsPerFrame<\/code> is 2, the frame rate is 0.5 frames per second (one frame every 2 seconds).<\/li>\n<\/ul>\n<h3>2&#46; Image Processing<\/h3>\n<p>The GPT-4o model can directly process images and take intelligent actions based on the image. We can provide images in two formats:<\/p>\n<ul>\n<li>Base64 Encoded<\/li>\n<li>URL<\/li>\n<\/ul>\n<p>In this project, we will use base64 encoding for the images. The function <code>imageToBase64()<\/code> will read each image file and convert it into a base64 encoded image.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">export function imageToBase64(imagePath) {\n    return new Promise((resolve, reject) => {\n        fs.readFile(imagePath, (err, data) => {\n            if (err) {\n                reject(err)\n            } else {\n                const base64String = data.toString('base64')\n                resolve(base64String)\n            }\n        })\n    })\n}<\/code><\/pre>\n<\/div>\n<h3>3&#46; Audio Extraction<\/h3>\n<p>For a better context summarization, we can add audio to the OpenAI model. To extract audio from video, we can also use the <code>fluent-ffmpeg<\/code> npm. The audio result is in <code>mp3<\/code> format and saved in the <code>audio<\/code> directory.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">\/\/ Function to extract audio from video\nexport function extractAudio(videoPath, audioPath) {\n    return new Promise((resolve, reject) => {\n        ffmpeg(videoPath)\n            .output(audioPath)\n            .audioBitrate('32k')\n            .on('end', resolve)\n            .on('error', reject)\n            .run()\n    })\n}<\/code><\/pre>\n<\/div>\n<h3>4&#46; Audio Transcription<\/h3>\n<p>After extracting the audio, we need to transcribe it into text using the speech-to-text model Whisper.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">async function transcribeAudio(filePath) {\n    try {\n        const transcription = await openai.audio.transcriptions.create({\n            file: fs.createReadStream(filePath),\n            model: 'whisper-1'\n        })\n        return transcription.text\n    } catch (error) {\n        throw new Error(`Transcription failed: ${error.message}`)\n    }\n}<\/code><\/pre>\n<\/div>\n<p>The <code>transcribeAudio()<\/code> will transcribe an audio file to text using the <code>whisper-1<\/code> AI model. For more information about how this speech-to-text model works, please read <a href=\"https:\/\/openai.com\/index\/whisper\/\">here<\/a>.<\/p>\n<blockquote>\n<p>The code for video processing, image processing, and audio extraction can be found in the file <code>libs\/videoProcessing.js<\/code>.<\/p>\n<\/blockquote>\n<h2>Video Summarization Process<\/h2>\n<p>The video summary is created by inputting both the visual and audio transcription elements of the video into the model simultaneously. By providing both of these inputs, the model is expected to produce a more accurate summary as it can perceive the entire video at once.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">\/\/ Generate a summary with visual and audio transcription\nimport OpenAI from \"openai\";\n\nconst openai = new OpenAI({\n    \/\/ eslint-disable-next-line no-undef\n    apiKey: process.env.OPENAI_API_KEY\n});\n\nasync function createVideoSummarization(frames, audioTranscription) {\n    const frameObjects = frames.map(x => ({\n        type: 'image_url',\n        image_url: {\n            url: `data:image\/jpg; base64, ${x}`,\n            detail: 'low'\n        }\n    }));\n\n    const response = await openai.chat.completions.create({\n        model: \"gpt-4o\",\n        messages: [{\n                role: \"system\",\n                content: \"You are generating a video summary. Please provide a summary of the video. Respond in Markdown.\"\n            }\n            ,\n            {\n                role: \"user\",\n                content: [{\n                        type: 'text',\n                        text: \"These are the frames from the video.\"\n                    }\n                    ,\n                    ...frameObjects,\n                    {\n                        type: 'text',\n                        text: `The audio transcription is: ${audioTranscription}`\n                    }\n                ],\n            }\n            ,\n        ],\n        temperature: 0,\n    });\n    console.log(response.choices[0].message.content);\n    return response;\n}\n\nexport { createVideoSummarization }<\/code><\/pre>\n<\/div>\n<p>The <code>content<\/code> parameter is an array and may contain text or images. Prompts can be added to summarize the video, as image frames addition, and audio text transcription for better context. You can look into the <a href=\"https:\/\/platform.openai.com\/docs\/api-reference\/chat\/create\">Chat API<\/a> documentation for more information about the parameters.<\/p>\n<h2>Save Video Summary to GridDB<\/h2>\n<p>The GridDB database is utilized to store the video summary, video file path, and audio transcription. The code to save these data resides in the <code>griddbservices.js<\/code> file.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">export async function saveData({ filename, audioTranscription, summary }) {\n    const id = generateRandomID();\n    const videoFilename = String(filename);\n    const audioToText = String(audioTranscription);\n    const videoSummary = String(summary);\n\n    const packetInfo = [parseInt(id), videoFilename, audioToText, videoSummary];\n    const saveStatus = await GridDB.insert(packetInfo, collectionDb);\n    return saveStatus;\n}<\/code><\/pre>\n<\/div>\n<p>There are three important fields here, which are:<\/p>\n<table>\n<thead>\n<tr>\n<th>Parameter<\/th>\n<th>Type<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>filename<\/code><\/td>\n<td>String<\/td>\n<td>The name of the video file.<\/td>\n<\/tr>\n<tr>\n<td><code>audioTranscription<\/code><\/td>\n<td>String<\/td>\n<td>The transcription of the audio from the video.<\/td>\n<\/tr>\n<tr>\n<td><code>summary<\/code><\/td>\n<td>String<\/td>\n<td>A summary of the video content.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The <code>saveData<\/code> function is a wrapper to save data to GridDB. You can find the real code that saves the data in the <code>libs\/griddb.cjs<\/code> file.<\/p>\n<h2>Get All Summaries<\/h2>\n<p>All the summaries data can be accessed in the route <code>\/summaries<\/code>. The default URL is:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">http:\/\/localhost:3000\/summaries<\/code><\/pre>\n<\/div>\n<p>The response is JSON data, which is very easy to process on the client if you need further features or enhancements for the project.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/all-summaries.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/09\/all-summaries.png\" alt=\"\" width=\"1654\" height=\"862\" class=\"aligncenter size-full wp-image-30245\" srcset=\"\/wp-content\/uploads\/2024\/09\/all-summaries.png 1654w, \/wp-content\/uploads\/2024\/09\/all-summaries-300x156.png 300w, \/wp-content\/uploads\/2024\/09\/all-summaries-1024x534.png 1024w, \/wp-content\/uploads\/2024\/09\/all-summaries-768x400.png 768w, \/wp-content\/uploads\/2024\/09\/all-summaries-1536x801.png 1536w, \/wp-content\/uploads\/2024\/09\/all-summaries-600x313.png 600w\" sizes=\"(max-width: 1654px) 100vw, 1654px\" \/><\/a><\/p>\n<h2>Limitation<\/h2>\n<p>This project is a prototype and tested with MP4 videos with a video duration not exceeding 5 minutes.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform manually. An example of this is a video summarizer. Previously, the process of summarizing video content relied mainly on human vision and hearing. However, with AI models such as GPT-4 and [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":30251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-46812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-18T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-13T20:57:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Building Video Summarizer Using AI\",\"datePublished\":\"2024-09-18T07:00:00+00:00\",\"dateModified\":\"2025-11-13T20:57:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\"},\"wordCount\":1153,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\",\"name\":\"Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg\",\"datePublished\":\"2024-09-18T07:00:00+00:00\",\"dateModified\":\"2025-11-13T20:57:05+00:00\",\"description\":\"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg\",\"contentUrl\":\"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg\",\"width\":1792,\"height\":1024},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb.net\/en\/#website\",\"url\":\"https:\/\/griddb.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT","description":"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/","og_locale":"en_US","og_type":"article","og_title":"Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT","og_description":"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform","og_url":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2024-09-18T07:00:00+00:00","article_modified_time":"2025-11-13T20:57:05+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg","type":"image\/jpeg"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/"},"author":{"name":"griddb-admin","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Building Video Summarizer Using AI","datePublished":"2024-09-18T07:00:00+00:00","dateModified":"2025-11-13T20:57:05+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/"},"wordCount":1153,"commentCount":0,"publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/","url":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/","name":"Building Video Summarizer Using AI | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg","datePublished":"2024-09-18T07:00:00+00:00","dateModified":"2025-11-13T20:57:05+00:00","description":"With the recent advancements in AI technology, such as OpenAI, it has become possible to automate tasks that were previously too tedious to perform","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/building-video-summarizer-using-ai\/#primaryimage","url":"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg","contentUrl":"\/wp-content\/uploads\/2024\/09\/ezgif-4-cd66d05271.jpg","width":1792,"height":1024},{"@type":"WebSite","@id":"https:\/\/griddb.net\/en\/#website","url":"https:\/\/griddb.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/posts\/46812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/comments?post=46812"}],"version-history":[{"count":1,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/posts\/46812\/revisions"}],"predecessor-version":[{"id":51472,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/posts\/46812\/revisions\/51472"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/media\/30251"}],"wp:attachment":[{"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/media?parent=46812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/categories?post=46812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/wp-json\/wp\/v2\/tags?post=46812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}