介紹
我是個超級板球迷。從我記事起,我就迷上了這項運動,至今它仍在我的日常生活中起著重要的作用。我相信很多讀到這篇文章的人都會點頭!
但是自從我開始工作以來,要跟上所有的比賽就成了一件棘手的事。我不能看一場完整的比賽,只能看一些短暫的片段,或者看文字解說。
所以作為數據科學家的我決定做點什麼。有沒有一種方法可以讓我使用我的Python技能並剪輯出比賽的所有重要部分?實際上,我想用Python創建我自己的集錦集合。
事實證明,我甚至不需要依靠機器學習或深度學習技術來做到這一點!現在,我想分享我的代碼,在後面附有代碼。這將讓你嘗試我們將在這篇文章中使用的一個簡單的語音分析方法:
我將討論我如何編寫這個集錦生成的處理流程,使你可以學習和應用到任何比賽(或任何你想要的其他運動)。
目錄
- 體育視頻集錦簡介
- 集錦生成的不同方法
- 我自己生成集錦的方法
- 理解問題描述
- 在Python中實現集錦生成
體育視頻集錦簡介
我們都看過一些體育比賽的精彩部分。即使你對運動沒有興趣,你也會在餐館、酒店等地方看到電視上的精彩鏡頭。
集錦生成是從體育視頻中提取最有趣的部分的剪輯的過程。
你可以將其視為視頻摘要的經典用例。在視頻摘要中,全長視頻將轉換為較短的格式,以便保留最重要的內容。
在板球比賽中,完整的比賽視頻包含了四分打、六分打、三柱門等動作。未經過剪輯的版本會捕捉一些無趣的事件,如防禦、離場、歪球、失誤點等。
另一方面,集錦是人們腎上腺素激增的開始。所有主要的視頻集錦,例如四分打、六分打、三柱門,這些結合在一起就構成了典型的集錦組合。
從一場完整的比賽視頻中手動提取集錦需要大量的人工。這是一項耗時的工作,除非你想日復一日地從事這項工作,否則你需要找到其他方法。
存儲一場完整的比賽視頻也占用大量資源。因此,一場完整的比賽視頻中自動提取集錦可以為創作者和用戶節省大量時間。這就是我們將在本文中討論的內容。
生成集錦的不同方法
除了手動方法之外,我們還有其他方法可以生成集錦。我們可以使用兩種常見的方法-自然語言處理(NLP)和計算機視覺。在開始使用我的方法之前,讓我們簡要討論一下它們如何工作。
基於自然語言處理(NLP)的方法
在查看以下步驟之前,請先考慮一下。你如何使用NLP或基於文本的方法從板球比賽中提取重要的數據?
以下是流程:
- 從輸入視頻中提取音頻
- 將音頻轉錄為文本
- 對文本應用基於提取的摘要技術來識別最重要的短語
- 提取相應重要短語的片段,生成集錦
基於計算機視覺的方法
這種基於計算機視覺的方法會給人一種非常直觀的印象。畢竟,計算機視覺是我們訓練機器看圖像和視頻的領域。因此,使用計算機視覺生成集錦的一種方法是一直跟蹤比賽的記分卡,只有在出四分打、六分打、三柱門時才進行提取。
自己生成集錦的方法
在這一點上,你可能想知道,我們剛才談到了機器學習和深度學習的兩個子領域。但是文章的標題和介紹表明我們不會使用這兩個領域。那麼我們真的可以在不構建模型的情況下生成集錦嗎?是的!
「並非每個問題都需要深度學習和機器學習。對領域和數據的透徹理解可以解決大多數問題。」 – Sunil Ray
我將討論使用自動生成的集錦的概念——簡易語音分析(Simple Speech Analysis)。在討論最終方法之前,讓我們討論一些術語。
什麼是短時能量?
我們可以在時域或頻域中分析音頻信號。在時域中,針對時間分量分析音頻信號,而在頻域中,針對頻率分量進行分析:
音頻信號的能量是指聲音的響度。它是由時域中音頻信號幅度的平方和求出的。當為整個音頻信號的一部分計算能量時,則稱為短時能量。
解決方案背後的基本思想是,在大多數體育比賽中,每當發生有趣的事件時,評論員和觀眾的聲音都會增加。
讓我們以板球為例。每當擊球手擊中界線或投球手取球時,評論員的聲音就會上升。觀眾的歡呼聲就開始爆發。我們可以使用音頻中的這些更改來捕捉視頻中有趣的時刻。
以下是流程:
- 輸入完整匹配的視頻
- 提取音頻
- 將音頻分成塊
- 計算每個塊的短時能量
- 將每個塊歸為是否"興奮"(簡單的基於閾值)
- 合併所有"興奮"片段,以形成視頻集錦
問題描述
板球運動是印度最著名的運動,在印度幾乎所有地區都可以玩。因此,作為頑固的板球迷,我決定自動從完整比賽的板球視頻中提取集錦。但是,相同的想法也可以應用於其他運動。
在本文中,我只考慮了2007年T20世界盃印度對澳大利亞半決賽的前6輪。你可以在YouTube上觀看完整的比賽(https://www.youtube.com/watch?v=lFq4eW9ewRE&t=2162s),並從這裡下載前六場的視頻(https://drive.google.com/drive/folders/1FRODSq1dgp-JvUcXRALKjn6bvIu15gU6)。
使用Python生成集錦
我已經藉助名為WavePad Audio Editor的軟體從視頻中提取了音頻。你可以從此處下載音頻剪輯(https://drive.google.com/drive/folders/1FRODSq1dgp-JvUcXRALKjn6bvIu15gU6)。
filename='powerplay.wav'
import librosa
x, sr = librosa.load(filename,sr=16000)
我們可以使用以下代碼以分鐘為單位獲取音頻剪輯的持續時間:
int(librosa.get_duration(x, sr)/60)
現在,由於我們有興趣找出特定的音頻塊是否包含音頻聲音的上升,因此將音頻分為5秒的塊:
max_slice=5
window_length = max_slice * sr
讓我們聽一聽音頻塊:
import IPython.display as ipd
a=x[21*window_length:22*window_length]
ipd.Audio(a, rate=sr)
計算塊的能量:
energy = sum(abs(a**2))
print(energy)
在時間序列域中可視化塊:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(14, 8))
ax1 = fig.add_subplot(211)
ax1.set_xlabel('time')
ax1.set_ylabel('Amplitude')
ax1.plot(a)
如我們所見,信號幅度隨時間變化。接下來,為每個塊分配短期能量:
import numpy as np
energy = np.array([sum(abs(x[i:i+window_length]**2)) for i in range(0, len(x), window_length)])
讓我們查看這些塊的短時能量分布:
import matplotlib.pyplot as plt
plt.hist(energy)
plt.show()
如上圖所示,能量分布是右偏的。我們將選擇極值作為閾值,因為僅當評論者的講話和觀眾的歡呼聲很高時,我們才對剪輯感興趣。
在這裡,我認為閾值是12,000,因為它位於分布的尾部。隨意嘗試不同的值,看看會得到什麼結果。
import pandas as pd
df=pd.DataFrame(columns=['energy','start','end'])
thresh=12000
row_index=0
for i in range(len(energy)):
value=energy[i]
if(value>=thresh):
i=np.where(energy == value)[0]
df.loc[row_index,'energy']=value
df.loc[row_index,'start']=i[0] * 5
df.loc[row_index,'end']=(i[0]+1) * 5
row_index= row_index + 1
將相連的時間間隔的連續音頻片段合併為一個:
temp=[]
i=0
j=0
n=len(df) - 2
m=len(df) - 1
while(i<=n):
j=i+1
while(j<=m):
if(df['end'][i] == df['start'][j]):
df.loc[i,'end'] = df.loc[j,'end']
temp.append(j)
j=j+1
else:
i=j
break
df.drop(temp,axis=0,inplace=True)
在特定時間間隔內提取視頻以形成集錦。 切記,由於只有在擊球手打完球之後,評論員的講話和觀眾的歡呼才會增加,所以我考慮了每個「興奮」的片段之前五秒:
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
start=np.array(df['start'])
end=np.array(df['end'])
for i in range(len(df)):
if(i!=0):
start_lim = start[i] - 5
else:
start_lim = start[i]
end_lim = end[i]
filename="highlight" + str(i+1) + ".mp4"
ffmpeg_extract_subclip("powerplay.mp4",start_lim,end_lim,targetname=filename)
我已經使用在線視頻編輯器來合併所有提取的視頻剪輯成單個視頻。
恭喜你生成了你自己的集錦集合!繼續將此技術應用於你想要的任何比賽或運動吧。它可能看起來很簡單,但是它是一種強大的方法。這裡有完整代碼(https://github.com/aravindpai/Cricket-Highlights-Generation)
結尾
本文的關鍵結論是:在進入模型構建過程之前,要對領域和數據有一個全面的了解,因為它可以幫助我們更好地解決大多數問題。
在本文中,我們了解了如何使用簡單的語音分析來自動提取一場完整體育比賽視頻中的集錦。我建議你也嘗試不同的運動。