Pular para o conteúdo principal

Desafio 29: Análise de Vídeo com Video Indexer

Tempo Estimado

60 min | Custo: $5-15 (estimado) | Domínio: Implementar Soluções de Visão Computacional (10-15%)

Habilidades do exame abordadas

  • Usar o Azure AI Video Indexer para extrair insights de vídeo
  • Extrair transcrições, rostos, tópicos e sentimentos
  • Consultar conteúdo de vídeo por palavra-chave e tempo

Visão Geral

O Azure AI Video Indexer extrai insights ricos de conteúdo de vídeo e áudio:

InsightDescrição
TranscriptFala-para-texto com identificação de falante
OCRExtração de texto exibido na tela
TopicsExtração de tópicos baseada na Wikipedia
KeywordsTermos-chave da transcrição
FacesDetecção e agrupamento facial (não identificação sem aprovação)
SentimentsAnálise de sentimento (positivo/negativo/neutro) do texto transcrito
Scenes/ShotsSegmentação visual de cenas
LabelsRótulos de objetos visuais por frame

A API usa um endpoint diferente: https://api.videoindexer.ai

Pré-requisitos

  • Assinatura Azure
  • Conta Azure AI Video Indexer
  • Python 3.9+ com biblioteca requests
  • Arquivo de vídeo ou URL

Implementação

Tarefa 1: Configurar Conta do Video Indexer

az group create --name rg-ai102-videoindexer --location eastus2

# Create Video Indexer account (ARM-connected)
az resource create \
--resource-group rg-ai102-videoindexer \
--resource-type Microsoft.VideoIndexer/accounts \
--name vi-ai102 \
--location eastus2 \
--properties '{}'

Tarefa 2: Enviar e Indexar Vídeo

import os
import time
import requests

# Video Indexer configuration
ACCOUNT_ID = os.environ["VIDEO_INDEXER_ACCOUNT_ID"]
LOCATION = "eastus2"
API_KEY = os.environ["VIDEO_INDEXER_API_KEY"]
API_URL = "https://api.videoindexer.ai"

# Get access token
def get_access_token():
url = f"{API_URL}/Auth/{LOCATION}/Accounts/{ACCOUNT_ID}/AccessToken"
headers = {"Ocp-Apim-Subscription-Key": API_KEY}
params = {"allowEdit": "true"}
response = requests.get(url, headers=headers, params=params)
return response.json()

token = get_access_token()
print(f"Access token acquired (length: {len(token)})")

# Upload video from URL
def upload_video(video_url, video_name):
url = f"{API_URL}/{LOCATION}/Accounts/{ACCOUNT_ID}/Videos"
params = {
"accessToken": token,
"name": video_name,
"videoUrl": video_url,
"language": "en-US",
"indexingPreset": "Default"
}
response = requests.post(url, params=params)
result = response.json()
print(f"Video uploaded: {result['id']} (state: {result['state']})")
return result["id"]

video_id = upload_video(
"https://example.com/sample-presentation.mp4",
"AI-102 Sample Presentation"
)

# Poll for indexing completion
def wait_for_indexing(video_id):
while True:
url = f"{API_URL}/{LOCATION}/Accounts/{ACCOUNT_ID}/Videos/{video_id}/Index"
params = {"accessToken": token}
response = requests.get(url, params=params)
result = response.json()
state = result["state"]
print(f" Indexing state: {state}")

if state == "Processed":
return result
elif state == "Failed":
raise Exception(f"Indexing failed: {result.get('failureMessage')}")
time.sleep(30)

print("\nWaiting for indexing...")
insights = wait_for_indexing(video_id)
print("Indexing complete!")

Tarefa 3: Extrair Insights do Vídeo

def get_video_insights(video_id):
url = f"{API_URL}/{LOCATION}/Accounts/{ACCOUNT_ID}/Videos/{video_id}/Index"
params = {"accessToken": token}
response = requests.get(url, params=params)
return response.json()

insights = get_video_insights(video_id)
video_insights = insights["videos"][0]["insights"]

# Extract transcript
print("=== TRANSCRIPT ===")
if "transcript" in video_insights:
for item in video_insights["transcript"][:5]: # First 5 entries
print(f" [{item['instances'][0]['start']} - {item['instances'][0]['end']}]")
print(f" Speaker {item.get('speakerId', 'N/A')}: {item['text']}")
print()

# Extract topics
print("=== TOPICS ===")
if "topics" in video_insights:
for topic in video_insights["topics"]:
print(f" - {topic['name']} (confidence: {topic['confidence']:.3f})")

# Extract keywords
print("\n=== KEYWORDS ===")
if "keywords" in video_insights:
for kw in video_insights["keywords"][:10]:
print(f" - {kw['text']} (appears {len(kw['instances'])} times)")

# Extract OCR text
print("\n=== ON-SCREEN TEXT (OCR) ===")
if "ocr" in video_insights:
for ocr_item in video_insights["ocr"][:5]:
print(f" [{ocr_item['instances'][0]['start']}] '{ocr_item['text']}'")

# Search within video
def search_video(video_id, query):
url = f"{API_URL}/{LOCATION}/Accounts/{ACCOUNT_ID}/Videos/{video_id}/Index"
params = {"accessToken": token, "searchText": query}
response = requests.get(url, params=params)
result = response.json()

# Find matching segments
search_results = result.get("searchMatches", [])
print(f"\nSearch '{query}': {len(search_results)} matches")
for match in search_results:
print(f" [{match['startTime']} - {match['endTime']}] {match['type']}: {match.get('text', '')[:50]}")

search_video(video_id, "Azure AI")

Saída Esperada

Access token acquired (length: 1247)
Video uploaded: abc123def (state: Uploading)

Waiting for indexing...
Indexing state: Processing
Indexing state: Processing
Indexing state: Processed
Indexing complete!

=== TRANSCRIPT ===
[0:00:00.000 - 0:00:04.500]
Speaker 1: Welcome to our presentation on Azure AI Services.

[0:00:04.500 - 0:00:09.200]
Speaker 1: Today we'll cover computer vision and natural language processing.

=== TOPICS ===
- Artificial intelligence (confidence: 0.923)
- Cloud computing (confidence: 0.856)
- Computer vision (confidence: 0.834)

=== KEYWORDS ===
- Azure AI (appears 12 times)
- computer vision (appears 8 times)
- machine learning (appears 5 times)

=== ON-SCREEN TEXT (OCR) ===
[0:00:02.000] 'Azure AI Services Overview'
[0:01:15.000] 'Computer Vision API'

Search 'Azure AI': 4 matches
[0:00:00.000 - 0:00:04.500] Transcript: Welcome to our presentation on Azure AI...
[0:02:30.000 - 0:02:35.000] Ocr: Azure AI Vision

Quebra & conserta

CenárioSintomaCausa RaizCorreção
401 UnauthorizedAcesso negadoToken expirado (válido por 1 hora)Solicite novo token de acesso
Indexação travada em ProcessingNunca completaVídeo muito longo ou corrompidoVerifique o formato do vídeo; tente um clipe mais curto
Transcrição vaziaNenhuma fala detectadaFaixa de áudio ausente ou muito baixaVerifique se o áudio existe; confira o parâmetro de idioma
Nenhum rosto detectadoInsights de face vaziosRostos muito pequenos ou obscurecidosGaranta que rostos ocupem área suficiente no frame
Busca não retorna resultadossearchMatches vazioVídeo não totalmente indexadoAguarde state=Processed antes de buscar

Verificação de Conhecimento

1. Qual endpoint de API o Azure AI Video Indexer usa?

2. Qual é o fluxo de trabalho típico para processar um vídeo com o Video Indexer?

3. Quais insights o Video Indexer extrai da faixa de áudio?

4. Como você busca conteúdo específico dentro de um vídeo indexado?

5. Qual preset de indexação você deve usar para um vídeo com fala e texto na tela?

Limpeza

az group delete --name rg-ai102-videoindexer --yes --no-wait

Saiba Mais