LangChain支持嗶哩嗶哩視頻總結

是基于LangChain框架下的開發,所以最開始請先

pip install Langchain
pip install bilibili-api-python

技術要點:

  1. 使用Langchain框架自帶的Document loaders

  2. 修改BiliBiliLoader的源碼,自帶的并不支持當前b站的視頻加載

源碼文件修改:

import json
import re
import warnings
from typing import List, Tupleimport requests
from langchain_core.documents import Document
from bilibili_api import sync, video
from langchain_community.document_loaders.base import BaseLoader
# Pre-compile regular expressions for video ID extraction
BV_PATTERN = re.compile(r"BV\w+")
AV_PATTERN = re.compile(r"av[0-9]+")class BiliBiliLoader(BaseLoader):"""Loader for fetching transcripts from BiliBili videos."""def __init__(self, video_urls: List[str], sessdata: str, bili_jct: str, buvid3: str):"""Initialize with bilibili url.Args:video_urls (List[str]): List of BiliBili video URLs.sessdata (str): SESSDATA cookie value for authentication.bili_jct (str): BILI_JCT cookie value for authentication.buvid3 (str): BUVI3 cookie value for authentication."""self.video_urls = video_urlsself.credential = video.Credential(sessdata=sessdata, bili_jct=bili_jct, buvid3=buvid3)def load(self) -> List[Document]:"""Load and return a list of documents containing video transcripts.Returns:List[Document]: List of Document objects transcripts and metadata."""results = []for url in self.video_urls:transcript, video_info = self._get_bilibili_subs_and_info(url)doc = Document(page_content=transcript, metadata=video_info)results.append(doc)return resultsdef _get_bilibili_subs_and_info(self, url: str) -> Tuple[str, dict]:"""Retrieve video information and transcript for a given BiliBili URL.Args:url (str): BiliBili video URL.Returns:Tuple[str, dict]: A tuple containing the transcript and video information."""bvid = BV_PATTERN.search(url)if bvid:v = video.Video(bvid=bvid.group(), credential=self.credential)else:aid = AV_PATTERN.search(url)if aid:v = video.Video(aid=int(aid.group()[2:]), credential=self.credential)else:raise ValueError(f"Unable to find a valid video ID in URL: {url}")video_info = sync(v.get_info())video_info.update({"url": url})sub = sync(v.get_subtitle(video_info["cid"]))# Retrieve and process subtitle contentsub_list = sub["subtitles"]if sub_list:sub_url = sub_list[0]["subtitle_url"]if not sub_url.startswith("http"):sub_url = "https:" + sub_urlresponse = requests.get(sub_url)if response.status_code == 200:raw_sub_titles = json.loads(response.content)["body"]raw_transcript = " ".join([c["content"] for c in raw_sub_titles])raw_transcript_with_meta_info = (f"Video Title: {video_info['title']}, "f"description: {video_info['desc']}\n\n"f"Transcript: {raw_transcript}")return raw_transcript_with_meta_info, video_infoelse:warnings.warn(f"Failed to fetch subtitles for {url}. "f"HTTP Status Code: {response.status_code}")return "", video_infoelse:warnings.warn(f"No subtitles found for video: {url}. Returning empty transcript.")return "", video_info

其中SESSDATA,BUVID3,BILI_JCT 三個參數需要通過訪問登錄B站進行獲取。固定值也是必須值,不需要刷新,永久有效,但是如果該賬戶訪問次數過多和頻繁存在被封禁情況,現在不知道b站那邊封禁策略。

獲取方法:打開b站網頁,F12開發者工具,應用程序->cookies>www.bilibili.com 下的元素獲取。

from langchain_community.document_loaders import BiliBiliLoader
SESSDATA = "***************************************"
BUVID3 = "**************************************"
BILI_JCT = "******************************************"loader = BiliBiliLoader(["https://www.bilibili.com/video/BV1PZ421S7VF/?spm_id_from=333.1007.tianma.1-2-2.click"
],
sessdata = SESSDATA,
bili_jct = BILI_JCT,
buvid3 = BUVID3,
)
docs = loader.load()
print(docs)

源碼解析:

_get_bilibili_subs_and_info:

他是一個檢索給定 BiliBili URL 的視頻信息和文字記錄。

獲取到視頻信息后,可以找到字幕URL的獲取路徑,訪問該路徑可以獲取到字幕信息:

sub_list = sub["subtitles"]
if sub_list:sub_url = sub_list[0]["subtitle_url"]if not sub_url.startswith("http"):sub_url = "https:" + sub_urlresponse = requests.get(sub_url)

例子:https://aisubtitle.hdslb.com/bfs/ai_subtitle/prod/125040837614317115816310f6f57f99190f192792b6f2d98ac0?auth_key=1708498531-6e1797becb564b90a29714989167da05-0-e9073436bc93efbbb4f87a3b0c3f7b3f

如果請求字幕接口成功,那么對于所有的返回的語音字幕文字進行處理:

response = requests.get(sub_url)
if response.status_code == 200:raw_sub_titles = json.loads(response.content)["body"]raw_transcript = " ".join([c["content"] for c in raw_sub_titles])raw_transcript_with_meta_info = (f"Video Title: {video_info['title']}, "f"description: {video_info['desc']}\n\n"f"Transcript: {raw_transcript}")

問題:

  1. 部分b站視頻不支持語音文字字幕獲取,獲取時給錯誤提示,現在測試情況95%的是視頻都是可以獲取到了。

  2. 目前視頻語言字幕抓取語言,測試只抓取中文,抓取的數據目測是b站提供的字幕數據,其他國家的語言不提供一律轉為中文。

  3. AI 字幕需要使用登錄賬號的cookie進行請求,請求頻繁或者過多會出現封禁,體現為接口返回正常返回內容,但是subtitle列表為空(即使實際上有ai字幕),無法獲取subtitle_url。建議準備多個賬號備用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696999.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696999.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696999.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在 Emacs Prelude 上使用 graphviz 的 dot 繪制流程圖

文章目錄 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 <2022-08-23 周二> 如何在Emacs Prelude上使用graphviz的dot繪制流程圖 標題中的Emacs Prelude是指&#xff1a;bbatsov/prelude&#xff0c;在custom.el中添加即可&#xff1a; ;;; graphviz (prelude-re…

【高德地圖】Android高德地圖繪制標記點Marker

&#x1f4d6;第4章 Android高德地圖繪制標記點Marker ?繪制默認 Marker?繪制多個Marker?繪制自定義 Marker?Marker點擊事件?Marker動畫效果?Marker拖拽事件?繪制默認 Infowindow&#x1f6a9;隱藏InfoWindow 彈框 ?繪制自定義 InfoWindow&#x1f6a9;實現 InfoWindow…

Java 中 CopyOnWriteArrayList和CopyOnWriteArraySet

什么是CopyOnWriteArrayList和CopyOnWriteArraySet CopyOnWriteArrayList和CopyOnWriteArraySet都是Java并發編程中提供的線程安全的集合類。 CopyOnWriteArrayList是一個線程安全的ArrayList&#xff0c;其內部通過volatile數組和顯式鎖ReentrantLock來實現線程安全。它采用…

解決ios17無法復制的問題

原代碼寫過一片js實現復制的代碼 那段代碼有問題 以下是之前寫的一段有問題的原代碼&#xff1a; let url "kkkkkk";const hiddenTextarea document.createElement("textarea");hiddenTextarea.style.position "absolute";hiddenTextarea.st…

ArcgisForJS如何實現添加含圖片樣式的點要素?

文章目錄 0.引言1.加載底圖2.獲取點要素的坐標3.添加含圖片樣式的幾何要素4.完整實現 0.引言 ArcGIS API for JavaScript 是一個用于在Web和移動應用程序中創建交互式地圖和地理空間分析應用的庫。本文在ArcGIS For JavaScript中使用Graphic對象來創建包含圖片樣式的點要素。 …

MIT-6.824-Lab2,Raft部分筆記|Use Go

文章目錄 前記Paper6&#xff1a;RaftLEC5、6&#xff1a;RaftLAB22AtaskHintlockingstructureguide設計與編碼 2BtaskHint設計與編碼 2CtaskHint question后記 LEC5&#xff1a;GO, Threads, and Raftgo threads技巧raft實驗易錯點debug技巧 前記 趁著研一考完期末有點點空余…

軟考29-上午題-【數據結構】-排序

一、排序的基本概念 1-1、穩定性 穩定性指的是相同的數據所在的位置經過排序后是否發生變化。若是排序后&#xff0c;次序不變&#xff0c;則是穩定的。 1-2、歸位 每一趟排序能確定一個元素的最終位置。 1-3、內部排序 排序記錄全部存放在內存中進行排序的過程。 1-4、外部…

vue使用.sync和update實現父組件與子組件數據綁定的案例

在 Vue 中&#xff0c;.sync 是一個用于實現雙向數據綁定的特殊修飾符。它允許父組件通過一種簡潔的方式向子組件傳遞一個 prop&#xff0c;并在子組件中修改這個 prop 的值&#xff0c;然后將修改后的值反饋回父組件&#xff0c;實現雙向數據綁定。 使用 .sync 修飾符的基本語…

微信小程序 --- wx.request網絡請求封裝

網絡請求封裝 網絡請求模塊難度較大&#xff0c;如果學習起來感覺吃力&#xff0c;可以直接學習 [請求封裝-使用 npm 包發送請求] 以后的模塊 01. 為什么要封裝 wx.request 小程序大多數 API 都是異步 API&#xff0c;如 wx.request()&#xff0c;wx.login() 等。這類 API 接口…

【精選】Java面向對象進階——內部類

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

【操作系統】磁盤文件管理系統

實驗六 磁盤文件管理的模擬實現 實驗目的 文件系統是操作系統中用來存儲和管理信息的機構&#xff0c;具有按名存取的功能&#xff0c;不僅能方便用戶對信息的使用&#xff0c;也有效提高了信息的安全性。本實驗模擬文件系統的目錄結構&#xff0c;并在此基礎上實現文件的各種…

FISCO BCOS(十七)利用腳本進行區塊鏈系統監控

要利用腳本進行區塊鏈系統監控&#xff0c;你可以使用各種編程語言編寫腳本&#xff0c;如Python、Shell等 利用腳本進行區塊鏈系統監控可以提高系統的穩定性、可靠性&#xff0c;并幫助及時發現和解決潛在問題&#xff0c;從而確保區塊鏈網絡的正常運行。本文可以利用腳本來解…

Java實戰:分布式Session解決方案

本文將詳細介紹Java分布式Session的解決方案。我們將探討分布式Session的基本概念&#xff0c;以及常見的分布式Session管理技術&#xff0c;如Cookie、Token、Redis等。此外&#xff0c;我們將通過具體的示例來展示如何在Java應用程序中實現分布式Session。本文適合希望了解和…

Swift基礎知識:21.Swift繼承

在 Swift 中&#xff0c;類可以通過繼承從其他類獲得屬性和方法。被繼承的類稱為父類&#xff08;或超類&#xff09;&#xff0c;繼承的類稱為子類。子類可以繼承父類的特性&#xff0c;并且可以添加自己的新特性。繼承允許類層次結構中的代碼重用和多態性。 定義一個基類&am…

Vue3 使用動態組件 component

component 標簽&#xff1a;用于動態渲染標簽或組件。 語法格式&#xff1a; <component is"標簽或組件名">標簽內容</component> 動態渲染標簽&#xff1a; <template><h3>我是父組件</h3><component is"h1">動態…

SpringCloud(15)之SpringCloud Gateway

一、Spring Cloud Gateway介紹 Spring Cloud Gateway 是Spring Cloud團隊的一個全新項目&#xff0c;基于Spring 5.0、SpringBoot2.0、 Project Reactor 等技術開發的網關。旨在為微服務架構提供一種簡單有效統一的API路由管理方式。 Spring Cloud Gateway 作為SpringCloud生態…

(delphi11最新學習資料) Object Pascal 學習筆記---第5章第3節(自定義托管記錄)

5.3.5 運算符和自定義托管記錄 ? 在 Delphi 語言中&#xff0c;有一組特殊的運算符可用于記錄&#xff0c;以定義自定義托管記錄。在此之前&#xff0c;請允許我回顧一下記錄內存初始化的規則&#xff0c;以及普通記錄和托管記錄之間的區別。 ? Delphi 中的記錄可以包含任何…

大語言模型LangChain本地知識庫:向量數據庫與文件處理技術的深度整合

文章目錄 大語言模型LangChain本地知識庫&#xff1a;向量數據庫與文件處理技術的深度整合引言向量數據庫在LangChain知識庫中的應用文件處理技術在知識庫中的角色向量數據庫與文件處理技術的整合實踐挑戰與展望結論 大語言模型LangChain本地知識庫&#xff1a;向量數據庫與文件…

【Unity】MySql +Navicat 安裝教程

問題描述 在使用Unity開發的時候&#xff0c;有的時候我們是需要使用Mysql數據庫的&#xff0c;本教程使用的MySql 和Navicat均為免安裝版 ?mysql安裝 1.下載mysql解壓至任意目錄&#xff0c;此處以“C:\mysql-5.6.39-winx64”為例. mysql百度云連接&#xff1a; 鏈接&…

Java的遞歸【詳解】

1.認識遞歸基礎知識 什么是方法遞歸&#xff1f; 遞歸是一種算法&#xff0c;在程序設計語言中廣泛應用。 從形式上說&#xff1a;方法調用自身的形式稱為方法遞歸&#xff08; recursion&#xff09;。 遞歸的形式&#xff1a; 直接遞歸&#xff1a;方法自己調用自己。 間接遞…