mirror of
https://github.com/StanGirard/quivr.git
synced 2024-11-21 16:12:42 +03:00
feat(quivr-whisper): add initial project files (#3492)
# Description Please include a summary of the changes and the related issue. Please also include relevant motivation and context. ## Checklist before requesting a review Please delete options that are not relevant. - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented hard-to-understand areas - [ ] I have ideally added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged ## Screenshots (if appropriate):
This commit is contained in:
parent
58946d01ca
commit
169587b2a3
5
examples/quivr-whisper/.env_example
Normal file
5
examples/quivr-whisper/.env_example
Normal file
@ -0,0 +1,5 @@
|
||||
QUIVR_API_KEY=XXXX
|
||||
QUIVR_CHAT_ID=1XXXX
|
||||
QUIVR_BRAIN_ID=XXXX
|
||||
QUIVR_URL=XXXX
|
||||
OPENAI_API_KEY=XXXX
|
1
examples/quivr-whisper/.gitignore
vendored
Normal file
1
examples/quivr-whisper/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.env
|
1
examples/quivr-whisper/.python-version
Normal file
1
examples/quivr-whisper/.python-version
Normal file
@ -0,0 +1 @@
|
||||
3.11.9
|
3
examples/quivr-whisper/README.md
Normal file
3
examples/quivr-whisper/README.md
Normal file
@ -0,0 +1,3 @@
|
||||
# quivr-whisper
|
||||
|
||||
Describe your project here.
|
65
examples/quivr-whisper/Readme.md
Normal file
65
examples/quivr-whisper/Readme.md
Normal file
@ -0,0 +1,65 @@
|
||||
# Quivr-Whisper
|
||||
|
||||
Quivr-Whisper is a web application that allows users to ask questions via audio input. It leverages OpenAI's Whisper model for speech transcription and synthesizes responses using OpenAI's text-to-speech capabilities. The application queries the Quivr API to get a response based on the transcribed audio input.
|
||||
|
||||
|
||||
|
||||
https://github.com/StanGirard/quivr-whisper/assets/19614572/9cc270c9-07e4-4ce1-bcff-380f195c9313
|
||||
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
- Audio input for asking questions
|
||||
- Speech transcription using OpenAI's Whisper model
|
||||
- Integration with Quivr API for intelligent responses
|
||||
- Speech synthesis of the response for audio playback
|
||||
|
||||
## Getting Started
|
||||
|
||||
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
What things you need to install the software and how to install them:
|
||||
|
||||
- Python 3.6+
|
||||
- pip for Python 3
|
||||
- Flask
|
||||
- OpenAI Python package
|
||||
- Requests package
|
||||
|
||||
### Installing
|
||||
|
||||
A step by step series of examples that tell you how to get a development environment running:
|
||||
|
||||
1. Clone the repository to your local machine.
|
||||
```bash
|
||||
git clone https://github.com/stangirard/quivr-whisper.git
|
||||
cd Quivr-talk
|
||||
```
|
||||
|
||||
2. Install the required packages.
|
||||
```bash
|
||||
pip install flask openai requests python-dotenv
|
||||
```
|
||||
|
||||
3. Create a `.env` file in the root directory of the project and add your API keys and other configuration variables.
|
||||
```env
|
||||
OPENAI_API_KEY='your_openai_api_key'
|
||||
QUIVR_API_KEY='your_quivr_api_key'
|
||||
QUIVR_CHAT_ID='your_quivr_chat_id'
|
||||
QUIVR_BRAIN_ID='your_quivr_brain_id'
|
||||
QUIVR_URL='https://api.quivr.app' # Optional, only if different from the default
|
||||
```
|
||||
|
||||
4. Run the Flask application.
|
||||
```bash
|
||||
flask run
|
||||
```
|
||||
|
||||
Your app should now be running on `http://localhost:5000`.
|
||||
|
||||
## Usage
|
||||
|
||||
To use Quivr-talk, navigate to `http://localhost:5000` in your web browser, click on "Ask a question to Quivr", and record your question. Wait for the transcription and response to be synthesized, and you will hear the response played back to you.
|
78
examples/quivr-whisper/app.py
Normal file
78
examples/quivr-whisper/app.py
Normal file
@ -0,0 +1,78 @@
|
||||
from flask import Flask, render_template, request, jsonify
|
||||
import openai
|
||||
import base64
|
||||
import os
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
from tempfile import NamedTemporaryFile
|
||||
|
||||
app = Flask(__name__)
|
||||
load_dotenv()
|
||||
openai.api_key = os.getenv("OPENAI_API_KEY")
|
||||
|
||||
quivr_token = os.getenv("QUIVR_API_KEY", "")
|
||||
quivr_chat_id = os.getenv("QUIVR_CHAT_ID", "")
|
||||
quivr_brain_id = os.getenv("QUIVR_BRAIN_ID", "")
|
||||
quivr_url = (
|
||||
os.getenv("QUIVR_URL", "https://api.quivr.app")
|
||||
+ f"/chat/{quivr_chat_id}/question?brain_id={quivr_brain_id}"
|
||||
)
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {quivr_token}",
|
||||
}
|
||||
|
||||
|
||||
@app.route("/")
|
||||
def index():
|
||||
return render_template("index.html")
|
||||
|
||||
|
||||
@app.route("/transcribe", methods=["POST"])
|
||||
def transcribe_audio():
|
||||
audio_file = request.files["audio_data"]
|
||||
transcript = transcribe_audio_file(audio_file)
|
||||
quivr_response = ask_quivr_question(transcript)
|
||||
audio_base64 = synthesize_speech(quivr_response)
|
||||
return jsonify({"audio_base64": audio_base64})
|
||||
|
||||
|
||||
def transcribe_audio_file(audio_file):
|
||||
with NamedTemporaryFile(suffix=".webm", delete=False) as temp_audio_file:
|
||||
audio_file.save(temp_audio_file)
|
||||
temp_audio_file_path = temp_audio_file.name
|
||||
|
||||
try:
|
||||
with open(temp_audio_file_path, "rb") as f:
|
||||
transcript_response = openai.audio.transcriptions.create(
|
||||
model="whisper-1", file=f
|
||||
)
|
||||
transcript = transcript_response.text
|
||||
finally:
|
||||
os.unlink(temp_audio_file_path)
|
||||
|
||||
return transcript
|
||||
|
||||
|
||||
def ask_quivr_question(transcript):
|
||||
response = requests.post(quivr_url, headers=headers, json={"question": transcript})
|
||||
if response.status_code == 200:
|
||||
quivr_response = response.json().get("assistant")
|
||||
return quivr_response
|
||||
else:
|
||||
print(f"Error from Quivr API: {response.status_code}, {response.text}")
|
||||
return "Sorry, I couldn't understand that."
|
||||
|
||||
|
||||
def synthesize_speech(text):
|
||||
speech_response = openai.audio.speech.create(
|
||||
model="tts-1", voice="nova", input=text
|
||||
)
|
||||
audio_content = speech_response.content
|
||||
audio_base64 = base64.b64encode(audio_content).decode("utf-8")
|
||||
return audio_base64
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
28
examples/quivr-whisper/pyproject.toml
Normal file
28
examples/quivr-whisper/pyproject.toml
Normal file
@ -0,0 +1,28 @@
|
||||
[project]
|
||||
name = "quivr-whisper"
|
||||
version = "0.1.0"
|
||||
description = "Add your description here"
|
||||
authors = [
|
||||
{ name = "Stan Girard", email = "stan@quivr.app" }
|
||||
]
|
||||
dependencies = [
|
||||
"flask>=3.1.0",
|
||||
"openai>=1.54.5",
|
||||
"quivr-core>=0.0.24",
|
||||
]
|
||||
readme = "README.md"
|
||||
requires-python = ">= 3.11"
|
||||
|
||||
[build-system]
|
||||
requires = ["hatchling"]
|
||||
build-backend = "hatchling.build"
|
||||
|
||||
[tool.rye]
|
||||
managed = true
|
||||
dev-dependencies = []
|
||||
|
||||
[tool.hatch.metadata]
|
||||
allow-direct-references = true
|
||||
|
||||
[tool.hatch.build.targets.wheel]
|
||||
packages = ["src/quivr_whisper"]
|
713
examples/quivr-whisper/requirements-dev.lock
Normal file
713
examples/quivr-whisper/requirements-dev.lock
Normal file
@ -0,0 +1,713 @@
|
||||
# generated by rye
|
||||
# use `rye lock` or `rye sync` to update this lockfile
|
||||
#
|
||||
# last locked with the following flags:
|
||||
# pre: false
|
||||
# features: []
|
||||
# all-features: false
|
||||
# with-sources: false
|
||||
# generate-hashes: false
|
||||
# universal: false
|
||||
|
||||
-e file:.
|
||||
aiofiles==24.1.0
|
||||
# via quivr-core
|
||||
aiohappyeyeballs==2.4.3
|
||||
# via aiohttp
|
||||
aiohttp==3.11.6
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
aiosignal==1.3.1
|
||||
# via aiohttp
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
anthropic==0.39.0
|
||||
# via langchain-anthropic
|
||||
antlr4-python3-runtime==4.9.3
|
||||
# via omegaconf
|
||||
anyio==4.6.2.post1
|
||||
# via anthropic
|
||||
# via httpx
|
||||
# via openai
|
||||
# via starlette
|
||||
attrs==24.2.0
|
||||
# via aiohttp
|
||||
backoff==2.2.1
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
beautifulsoup4==4.12.3
|
||||
# via llama-index-readers-file
|
||||
# via unstructured
|
||||
blinker==1.9.0
|
||||
# via flask
|
||||
cachetools==5.5.0
|
||||
# via google-auth
|
||||
certifi==2024.8.30
|
||||
# via httpcore
|
||||
# via httpx
|
||||
# via requests
|
||||
cffi==1.17.1
|
||||
# via cryptography
|
||||
chardet==5.2.0
|
||||
# via unstructured
|
||||
charset-normalizer==3.4.0
|
||||
# via pdfminer-six
|
||||
# via requests
|
||||
click==8.1.7
|
||||
# via flask
|
||||
# via llama-parse
|
||||
# via nltk
|
||||
# via python-oxmsg
|
||||
# via uvicorn
|
||||
cohere==5.11.4
|
||||
# via langchain-cohere
|
||||
coloredlogs==15.0.1
|
||||
# via onnxruntime
|
||||
contourpy==1.3.1
|
||||
# via matplotlib
|
||||
cryptography==43.0.3
|
||||
# via pdfminer-six
|
||||
# via unstructured-client
|
||||
cycler==0.12.1
|
||||
# via matplotlib
|
||||
dataclasses-json==0.6.7
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured
|
||||
defusedxml==0.7.1
|
||||
# via langchain-anthropic
|
||||
deprecated==1.2.15
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via pikepdf
|
||||
dirtyjson==1.0.8
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
distro==1.9.0
|
||||
# via anthropic
|
||||
# via openai
|
||||
effdet==0.4.1
|
||||
# via unstructured
|
||||
emoji==2.14.0
|
||||
# via unstructured
|
||||
et-xmlfile==2.0.0
|
||||
# via openpyxl
|
||||
eval-type-backport==0.2.0
|
||||
# via unstructured-client
|
||||
faiss-cpu==1.9.0.post1
|
||||
# via quivr-core
|
||||
fastapi==0.115.5
|
||||
# via megaparse
|
||||
fastavro==1.9.7
|
||||
# via cohere
|
||||
filelock==3.16.1
|
||||
# via huggingface-hub
|
||||
# via torch
|
||||
# via transformers
|
||||
# via triton
|
||||
filetype==1.2.0
|
||||
# via llama-index-core
|
||||
# via unstructured
|
||||
flask==3.1.0
|
||||
# via quivr-whisper
|
||||
flatbuffers==24.3.25
|
||||
# via onnxruntime
|
||||
fonttools==4.55.0
|
||||
# via matplotlib
|
||||
frozenlist==1.5.0
|
||||
# via aiohttp
|
||||
# via aiosignal
|
||||
fsspec==2024.10.0
|
||||
# via huggingface-hub
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via torch
|
||||
google-api-core==2.23.0
|
||||
# via google-cloud-vision
|
||||
google-auth==2.36.0
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
google-cloud-vision==3.8.1
|
||||
# via unstructured
|
||||
googleapis-common-protos==1.66.0
|
||||
# via google-api-core
|
||||
# via grpcio-status
|
||||
greenlet==3.1.1
|
||||
# via playwright
|
||||
# via sqlalchemy
|
||||
grpcio==1.68.0
|
||||
# via google-api-core
|
||||
# via grpcio-status
|
||||
grpcio-status==1.68.0
|
||||
# via google-api-core
|
||||
h11==0.14.0
|
||||
# via httpcore
|
||||
# via uvicorn
|
||||
httpcore==1.0.7
|
||||
# via httpx
|
||||
httpx==0.27.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via langgraph-sdk
|
||||
# via langsmith
|
||||
# via llama-cloud
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via openai
|
||||
# via quivr-core
|
||||
# via unstructured-client
|
||||
httpx-sse==0.4.0
|
||||
# via cohere
|
||||
# via langgraph-sdk
|
||||
huggingface-hub==0.26.2
|
||||
# via timm
|
||||
# via tokenizers
|
||||
# via transformers
|
||||
# via unstructured-inference
|
||||
humanfriendly==10.0
|
||||
# via coloredlogs
|
||||
idna==3.10
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via requests
|
||||
# via yarl
|
||||
iopath==0.1.10
|
||||
# via layoutparser
|
||||
itsdangerous==2.2.0
|
||||
# via flask
|
||||
jinja2==3.1.4
|
||||
# via flask
|
||||
# via torch
|
||||
jiter==0.7.1
|
||||
# via anthropic
|
||||
# via openai
|
||||
joblib==1.4.2
|
||||
# via nltk
|
||||
jsonpatch==1.33
|
||||
# via langchain-core
|
||||
jsonpath-python==1.0.6
|
||||
# via unstructured-client
|
||||
jsonpointer==3.0.0
|
||||
# via jsonpatch
|
||||
kiwisolver==1.4.7
|
||||
# via matplotlib
|
||||
langchain==0.2.17
|
||||
# via langchain-community
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-anthropic==0.1.23
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-cohere==0.2.4
|
||||
# via quivr-core
|
||||
langchain-community==0.2.19
|
||||
# via langchain-experimental
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-core==0.2.43
|
||||
# via langchain
|
||||
# via langchain-anthropic
|
||||
# via langchain-cohere
|
||||
# via langchain-community
|
||||
# via langchain-experimental
|
||||
# via langchain-openai
|
||||
# via langchain-text-splitters
|
||||
# via langgraph
|
||||
# via langgraph-checkpoint
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-experimental==0.0.65
|
||||
# via langchain-cohere
|
||||
langchain-openai==0.1.25
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-text-splitters==0.2.4
|
||||
# via langchain
|
||||
langdetect==1.0.9
|
||||
# via unstructured
|
||||
langgraph==0.2.52
|
||||
# via quivr-core
|
||||
langgraph-checkpoint==2.0.5
|
||||
# via langgraph
|
||||
langgraph-sdk==0.1.36
|
||||
# via langgraph
|
||||
langsmith==0.1.143
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
layoutparser==0.3.4
|
||||
# via unstructured-inference
|
||||
llama-cloud==0.1.5
|
||||
# via llama-index-indices-managed-llama-cloud
|
||||
llama-index==0.12.0
|
||||
# via megaparse
|
||||
llama-index-agent-openai==0.4.0
|
||||
# via llama-index
|
||||
# via llama-index-program-openai
|
||||
llama-index-cli==0.4.0
|
||||
# via llama-index
|
||||
llama-index-core==0.12.0
|
||||
# via llama-index
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-cli
|
||||
# via llama-index-embeddings-openai
|
||||
# via llama-index-indices-managed-llama-cloud
|
||||
# via llama-index-llms-openai
|
||||
# via llama-index-multi-modal-llms-openai
|
||||
# via llama-index-program-openai
|
||||
# via llama-index-question-gen-openai
|
||||
# via llama-index-readers-file
|
||||
# via llama-index-readers-llama-parse
|
||||
# via llama-parse
|
||||
llama-index-embeddings-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-cli
|
||||
llama-index-indices-managed-llama-cloud==0.6.2
|
||||
# via llama-index
|
||||
llama-index-legacy==0.9.48.post4
|
||||
# via llama-index
|
||||
llama-index-llms-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-cli
|
||||
# via llama-index-multi-modal-llms-openai
|
||||
# via llama-index-program-openai
|
||||
# via llama-index-question-gen-openai
|
||||
llama-index-multi-modal-llms-openai==0.3.0
|
||||
# via llama-index
|
||||
llama-index-program-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-question-gen-openai
|
||||
llama-index-question-gen-openai==0.3.0
|
||||
# via llama-index
|
||||
llama-index-readers-file==0.4.0
|
||||
# via llama-index
|
||||
llama-index-readers-llama-parse==0.4.0
|
||||
# via llama-index
|
||||
llama-parse==0.5.14
|
||||
# via llama-index-readers-llama-parse
|
||||
# via megaparse
|
||||
lxml==5.3.0
|
||||
# via pikepdf
|
||||
# via python-docx
|
||||
# via python-pptx
|
||||
# via unstructured
|
||||
markdown==3.7
|
||||
# via unstructured
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
markupsafe==3.0.2
|
||||
# via jinja2
|
||||
# via quivr-core
|
||||
# via werkzeug
|
||||
marshmallow==3.23.1
|
||||
# via dataclasses-json
|
||||
matplotlib==3.9.2
|
||||
# via pycocotools
|
||||
# via unstructured-inference
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
megaparse==0.0.43
|
||||
# via quivr-core
|
||||
mpmath==1.3.0
|
||||
# via sympy
|
||||
msgpack==1.1.0
|
||||
# via langgraph-checkpoint
|
||||
multidict==6.1.0
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
mypy-extensions==1.0.0
|
||||
# via typing-inspect
|
||||
nest-asyncio==1.6.0
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured-client
|
||||
networkx==3.4.2
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via torch
|
||||
# via unstructured
|
||||
nltk==3.9.1
|
||||
# via llama-index
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured
|
||||
numpy==1.26.4
|
||||
# via contourpy
|
||||
# via faiss-cpu
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via matplotlib
|
||||
# via megaparse
|
||||
# via onnx
|
||||
# via onnxruntime
|
||||
# via opencv-python
|
||||
# via pandas
|
||||
# via pycocotools
|
||||
# via scipy
|
||||
# via torchvision
|
||||
# via transformers
|
||||
# via unstructured
|
||||
nvidia-cublas-cu12==12.4.5.8
|
||||
# via nvidia-cudnn-cu12
|
||||
# via nvidia-cusolver-cu12
|
||||
# via torch
|
||||
nvidia-cuda-cupti-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cuda-nvrtc-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cuda-runtime-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cudnn-cu12==9.1.0.70
|
||||
# via torch
|
||||
nvidia-cufft-cu12==11.2.1.3
|
||||
# via torch
|
||||
nvidia-curand-cu12==10.3.5.147
|
||||
# via torch
|
||||
nvidia-cusolver-cu12==11.6.1.9
|
||||
# via torch
|
||||
nvidia-cusparse-cu12==12.3.1.170
|
||||
# via nvidia-cusolver-cu12
|
||||
# via torch
|
||||
nvidia-nccl-cu12==2.21.5
|
||||
# via torch
|
||||
nvidia-nvjitlink-cu12==12.4.127
|
||||
# via nvidia-cusolver-cu12
|
||||
# via nvidia-cusparse-cu12
|
||||
# via torch
|
||||
nvidia-nvtx-cu12==12.4.127
|
||||
# via torch
|
||||
olefile==0.47
|
||||
# via python-oxmsg
|
||||
omegaconf==2.3.0
|
||||
# via effdet
|
||||
onnx==1.17.0
|
||||
# via unstructured
|
||||
# via unstructured-inference
|
||||
onnxruntime==1.20.0
|
||||
# via unstructured-inference
|
||||
openai==1.54.5
|
||||
# via langchain-openai
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-embeddings-openai
|
||||
# via llama-index-legacy
|
||||
# via llama-index-llms-openai
|
||||
# via quivr-whisper
|
||||
opencv-python==4.10.0.84
|
||||
# via layoutparser
|
||||
# via unstructured-inference
|
||||
openpyxl==3.1.5
|
||||
# via unstructured
|
||||
orjson==3.10.11
|
||||
# via langgraph-sdk
|
||||
# via langsmith
|
||||
packaging==24.2
|
||||
# via faiss-cpu
|
||||
# via huggingface-hub
|
||||
# via langchain-core
|
||||
# via marshmallow
|
||||
# via matplotlib
|
||||
# via onnxruntime
|
||||
# via pikepdf
|
||||
# via pytesseract
|
||||
# via transformers
|
||||
# via unstructured-pytesseract
|
||||
pandas==2.2.3
|
||||
# via langchain-cohere
|
||||
# via layoutparser
|
||||
# via llama-index-legacy
|
||||
# via llama-index-readers-file
|
||||
# via unstructured
|
||||
parameterized==0.9.0
|
||||
# via cohere
|
||||
pdf2image==1.17.0
|
||||
# via layoutparser
|
||||
# via unstructured
|
||||
pdfminer-six==20231228
|
||||
# via pdfplumber
|
||||
# via unstructured
|
||||
pdfplumber==0.11.4
|
||||
# via layoutparser
|
||||
# via megaparse
|
||||
pikepdf==9.4.2
|
||||
# via unstructured
|
||||
pillow==11.0.0
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via matplotlib
|
||||
# via pdf2image
|
||||
# via pdfplumber
|
||||
# via pikepdf
|
||||
# via pillow-heif
|
||||
# via pytesseract
|
||||
# via python-pptx
|
||||
# via torchvision
|
||||
# via unstructured-pytesseract
|
||||
pillow-heif==0.20.0
|
||||
# via unstructured
|
||||
playwright==1.48.0
|
||||
# via megaparse
|
||||
portalocker==3.0.0
|
||||
# via iopath
|
||||
propcache==0.2.0
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
proto-plus==1.25.0
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
protobuf==5.28.3
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
# via googleapis-common-protos
|
||||
# via grpcio-status
|
||||
# via onnx
|
||||
# via onnxruntime
|
||||
# via proto-plus
|
||||
# via transformers
|
||||
psutil==6.1.0
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
pyasn1==0.6.1
|
||||
# via pyasn1-modules
|
||||
# via rsa
|
||||
pyasn1-modules==0.4.1
|
||||
# via google-auth
|
||||
pycocotools==2.0.8
|
||||
# via effdet
|
||||
pycparser==2.22
|
||||
# via cffi
|
||||
pycryptodome==3.21.0
|
||||
# via megaparse
|
||||
pydantic==2.9.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via fastapi
|
||||
# via langchain
|
||||
# via langchain-core
|
||||
# via langsmith
|
||||
# via llama-cloud
|
||||
# via llama-index-core
|
||||
# via openai
|
||||
# via pydantic-settings
|
||||
# via quivr-core
|
||||
# via unstructured-client
|
||||
pydantic-core==2.23.4
|
||||
# via cohere
|
||||
# via pydantic
|
||||
pydantic-settings==2.6.1
|
||||
# via megaparse
|
||||
pyee==12.0.0
|
||||
# via playwright
|
||||
pygments==2.18.0
|
||||
# via rich
|
||||
pypandoc==1.14
|
||||
# via unstructured
|
||||
pyparsing==3.2.0
|
||||
# via matplotlib
|
||||
pypdf==5.1.0
|
||||
# via llama-index-readers-file
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
# via unstructured-client
|
||||
pypdfium2==4.30.0
|
||||
# via pdfplumber
|
||||
pytesseract==0.3.13
|
||||
# via unstructured
|
||||
python-dateutil==2.8.2
|
||||
# via matplotlib
|
||||
# via pandas
|
||||
# via unstructured-client
|
||||
python-docx==1.1.2
|
||||
# via unstructured
|
||||
python-dotenv==1.0.1
|
||||
# via megaparse
|
||||
# via pydantic-settings
|
||||
python-iso639==2024.10.22
|
||||
# via unstructured
|
||||
python-magic==0.4.27
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
python-multipart==0.0.17
|
||||
# via unstructured-inference
|
||||
python-oxmsg==0.0.1
|
||||
# via unstructured
|
||||
python-pptx==0.6.23
|
||||
# via unstructured
|
||||
pytz==2024.2
|
||||
# via pandas
|
||||
pyyaml==6.0.2
|
||||
# via huggingface-hub
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via omegaconf
|
||||
# via timm
|
||||
# via transformers
|
||||
quivr-core==0.0.24
|
||||
# via quivr-whisper
|
||||
rapidfuzz==3.10.1
|
||||
# via quivr-core
|
||||
# via unstructured
|
||||
# via unstructured-inference
|
||||
ratelimit==2.2.1
|
||||
# via megaparse
|
||||
regex==2024.11.6
|
||||
# via nltk
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
requests==2.32.3
|
||||
# via cohere
|
||||
# via google-api-core
|
||||
# via huggingface-hub
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langsmith
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via megaparse
|
||||
# via requests-toolbelt
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
# via unstructured
|
||||
requests-toolbelt==1.0.0
|
||||
# via langsmith
|
||||
# via unstructured-client
|
||||
rich==13.9.4
|
||||
# via quivr-core
|
||||
rsa==4.9
|
||||
# via google-auth
|
||||
safetensors==0.4.5
|
||||
# via timm
|
||||
# via transformers
|
||||
scipy==1.14.1
|
||||
# via layoutparser
|
||||
sentencepiece==0.2.0
|
||||
# via transformers
|
||||
six==1.16.0
|
||||
# via langdetect
|
||||
# via python-dateutil
|
||||
sniffio==1.3.1
|
||||
# via anthropic
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via openai
|
||||
soupsieve==2.6
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.36
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
starlette==0.41.3
|
||||
# via fastapi
|
||||
striprtf==0.0.26
|
||||
# via llama-index-readers-file
|
||||
sympy==1.13.1
|
||||
# via onnxruntime
|
||||
# via torch
|
||||
tabulate==0.9.0
|
||||
# via langchain-cohere
|
||||
# via unstructured
|
||||
tenacity==8.5.0
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
tiktoken==0.8.0
|
||||
# via langchain-openai
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via quivr-core
|
||||
timm==1.0.11
|
||||
# via effdet
|
||||
# via unstructured-inference
|
||||
tokenizers==0.20.3
|
||||
# via cohere
|
||||
# via transformers
|
||||
torch==2.5.1
|
||||
# via effdet
|
||||
# via timm
|
||||
# via torchvision
|
||||
# via unstructured-inference
|
||||
torchvision==0.20.1
|
||||
# via effdet
|
||||
# via timm
|
||||
tqdm==4.67.0
|
||||
# via huggingface-hub
|
||||
# via iopath
|
||||
# via llama-index-core
|
||||
# via nltk
|
||||
# via openai
|
||||
# via transformers
|
||||
# via unstructured
|
||||
transformers==4.46.3
|
||||
# via quivr-core
|
||||
# via unstructured-inference
|
||||
triton==3.1.0
|
||||
# via torch
|
||||
types-pyyaml==6.0.12.20240917
|
||||
# via quivr-core
|
||||
types-requests==2.32.0.20241016
|
||||
# via cohere
|
||||
typing-extensions==4.12.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via fastapi
|
||||
# via huggingface-hub
|
||||
# via iopath
|
||||
# via langchain-core
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via openai
|
||||
# via pydantic
|
||||
# via pydantic-core
|
||||
# via pyee
|
||||
# via python-docx
|
||||
# via python-oxmsg
|
||||
# via sqlalchemy
|
||||
# via torch
|
||||
# via typing-inspect
|
||||
# via unstructured
|
||||
typing-inspect==0.9.0
|
||||
# via dataclasses-json
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured-client
|
||||
tzdata==2024.2
|
||||
# via pandas
|
||||
unstructured==0.15.0
|
||||
# via megaparse
|
||||
unstructured-client==0.27.0
|
||||
# via unstructured
|
||||
unstructured-inference==0.7.36
|
||||
# via unstructured
|
||||
unstructured-pytesseract==0.3.13
|
||||
# via unstructured
|
||||
urllib3==2.2.3
|
||||
# via requests
|
||||
# via types-requests
|
||||
uvicorn==0.32.0
|
||||
# via megaparse
|
||||
uvloop==0.21.0
|
||||
# via megaparse
|
||||
werkzeug==3.1.3
|
||||
# via flask
|
||||
wrapt==1.16.0
|
||||
# via deprecated
|
||||
# via llama-index-core
|
||||
# via unstructured
|
||||
xlrd==2.0.1
|
||||
# via unstructured
|
||||
xlsxwriter==3.2.0
|
||||
# via python-pptx
|
||||
yarl==1.17.2
|
||||
# via aiohttp
|
713
examples/quivr-whisper/requirements.lock
Normal file
713
examples/quivr-whisper/requirements.lock
Normal file
@ -0,0 +1,713 @@
|
||||
# generated by rye
|
||||
# use `rye lock` or `rye sync` to update this lockfile
|
||||
#
|
||||
# last locked with the following flags:
|
||||
# pre: false
|
||||
# features: []
|
||||
# all-features: false
|
||||
# with-sources: false
|
||||
# generate-hashes: false
|
||||
# universal: false
|
||||
|
||||
-e file:.
|
||||
aiofiles==24.1.0
|
||||
# via quivr-core
|
||||
aiohappyeyeballs==2.4.3
|
||||
# via aiohttp
|
||||
aiohttp==3.11.6
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
aiosignal==1.3.1
|
||||
# via aiohttp
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
anthropic==0.39.0
|
||||
# via langchain-anthropic
|
||||
antlr4-python3-runtime==4.9.3
|
||||
# via omegaconf
|
||||
anyio==4.6.2.post1
|
||||
# via anthropic
|
||||
# via httpx
|
||||
# via openai
|
||||
# via starlette
|
||||
attrs==24.2.0
|
||||
# via aiohttp
|
||||
backoff==2.2.1
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
beautifulsoup4==4.12.3
|
||||
# via llama-index-readers-file
|
||||
# via unstructured
|
||||
blinker==1.9.0
|
||||
# via flask
|
||||
cachetools==5.5.0
|
||||
# via google-auth
|
||||
certifi==2024.8.30
|
||||
# via httpcore
|
||||
# via httpx
|
||||
# via requests
|
||||
cffi==1.17.1
|
||||
# via cryptography
|
||||
chardet==5.2.0
|
||||
# via unstructured
|
||||
charset-normalizer==3.4.0
|
||||
# via pdfminer-six
|
||||
# via requests
|
||||
click==8.1.7
|
||||
# via flask
|
||||
# via llama-parse
|
||||
# via nltk
|
||||
# via python-oxmsg
|
||||
# via uvicorn
|
||||
cohere==5.11.4
|
||||
# via langchain-cohere
|
||||
coloredlogs==15.0.1
|
||||
# via onnxruntime
|
||||
contourpy==1.3.1
|
||||
# via matplotlib
|
||||
cryptography==43.0.3
|
||||
# via pdfminer-six
|
||||
# via unstructured-client
|
||||
cycler==0.12.1
|
||||
# via matplotlib
|
||||
dataclasses-json==0.6.7
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured
|
||||
defusedxml==0.7.1
|
||||
# via langchain-anthropic
|
||||
deprecated==1.2.15
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via pikepdf
|
||||
dirtyjson==1.0.8
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
distro==1.9.0
|
||||
# via anthropic
|
||||
# via openai
|
||||
effdet==0.4.1
|
||||
# via unstructured
|
||||
emoji==2.14.0
|
||||
# via unstructured
|
||||
et-xmlfile==2.0.0
|
||||
# via openpyxl
|
||||
eval-type-backport==0.2.0
|
||||
# via unstructured-client
|
||||
faiss-cpu==1.9.0.post1
|
||||
# via quivr-core
|
||||
fastapi==0.115.5
|
||||
# via megaparse
|
||||
fastavro==1.9.7
|
||||
# via cohere
|
||||
filelock==3.16.1
|
||||
# via huggingface-hub
|
||||
# via torch
|
||||
# via transformers
|
||||
# via triton
|
||||
filetype==1.2.0
|
||||
# via llama-index-core
|
||||
# via unstructured
|
||||
flask==3.1.0
|
||||
# via quivr-whisper
|
||||
flatbuffers==24.3.25
|
||||
# via onnxruntime
|
||||
fonttools==4.55.0
|
||||
# via matplotlib
|
||||
frozenlist==1.5.0
|
||||
# via aiohttp
|
||||
# via aiosignal
|
||||
fsspec==2024.10.0
|
||||
# via huggingface-hub
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via torch
|
||||
google-api-core==2.23.0
|
||||
# via google-cloud-vision
|
||||
google-auth==2.36.0
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
google-cloud-vision==3.8.1
|
||||
# via unstructured
|
||||
googleapis-common-protos==1.66.0
|
||||
# via google-api-core
|
||||
# via grpcio-status
|
||||
greenlet==3.1.1
|
||||
# via playwright
|
||||
# via sqlalchemy
|
||||
grpcio==1.68.0
|
||||
# via google-api-core
|
||||
# via grpcio-status
|
||||
grpcio-status==1.68.0
|
||||
# via google-api-core
|
||||
h11==0.14.0
|
||||
# via httpcore
|
||||
# via uvicorn
|
||||
httpcore==1.0.7
|
||||
# via httpx
|
||||
httpx==0.27.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via langgraph-sdk
|
||||
# via langsmith
|
||||
# via llama-cloud
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via openai
|
||||
# via quivr-core
|
||||
# via unstructured-client
|
||||
httpx-sse==0.4.0
|
||||
# via cohere
|
||||
# via langgraph-sdk
|
||||
huggingface-hub==0.26.2
|
||||
# via timm
|
||||
# via tokenizers
|
||||
# via transformers
|
||||
# via unstructured-inference
|
||||
humanfriendly==10.0
|
||||
# via coloredlogs
|
||||
idna==3.10
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via requests
|
||||
# via yarl
|
||||
iopath==0.1.10
|
||||
# via layoutparser
|
||||
itsdangerous==2.2.0
|
||||
# via flask
|
||||
jinja2==3.1.4
|
||||
# via flask
|
||||
# via torch
|
||||
jiter==0.7.1
|
||||
# via anthropic
|
||||
# via openai
|
||||
joblib==1.4.2
|
||||
# via nltk
|
||||
jsonpatch==1.33
|
||||
# via langchain-core
|
||||
jsonpath-python==1.0.6
|
||||
# via unstructured-client
|
||||
jsonpointer==3.0.0
|
||||
# via jsonpatch
|
||||
kiwisolver==1.4.7
|
||||
# via matplotlib
|
||||
langchain==0.2.17
|
||||
# via langchain-community
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-anthropic==0.1.23
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-cohere==0.2.4
|
||||
# via quivr-core
|
||||
langchain-community==0.2.19
|
||||
# via langchain-experimental
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-core==0.2.43
|
||||
# via langchain
|
||||
# via langchain-anthropic
|
||||
# via langchain-cohere
|
||||
# via langchain-community
|
||||
# via langchain-experimental
|
||||
# via langchain-openai
|
||||
# via langchain-text-splitters
|
||||
# via langgraph
|
||||
# via langgraph-checkpoint
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-experimental==0.0.65
|
||||
# via langchain-cohere
|
||||
langchain-openai==0.1.25
|
||||
# via megaparse
|
||||
# via quivr-core
|
||||
langchain-text-splitters==0.2.4
|
||||
# via langchain
|
||||
langdetect==1.0.9
|
||||
# via unstructured
|
||||
langgraph==0.2.52
|
||||
# via quivr-core
|
||||
langgraph-checkpoint==2.0.5
|
||||
# via langgraph
|
||||
langgraph-sdk==0.1.36
|
||||
# via langgraph
|
||||
langsmith==0.1.143
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
layoutparser==0.3.4
|
||||
# via unstructured-inference
|
||||
llama-cloud==0.1.5
|
||||
# via llama-index-indices-managed-llama-cloud
|
||||
llama-index==0.12.0
|
||||
# via megaparse
|
||||
llama-index-agent-openai==0.4.0
|
||||
# via llama-index
|
||||
# via llama-index-program-openai
|
||||
llama-index-cli==0.4.0
|
||||
# via llama-index
|
||||
llama-index-core==0.12.0
|
||||
# via llama-index
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-cli
|
||||
# via llama-index-embeddings-openai
|
||||
# via llama-index-indices-managed-llama-cloud
|
||||
# via llama-index-llms-openai
|
||||
# via llama-index-multi-modal-llms-openai
|
||||
# via llama-index-program-openai
|
||||
# via llama-index-question-gen-openai
|
||||
# via llama-index-readers-file
|
||||
# via llama-index-readers-llama-parse
|
||||
# via llama-parse
|
||||
llama-index-embeddings-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-cli
|
||||
llama-index-indices-managed-llama-cloud==0.6.2
|
||||
# via llama-index
|
||||
llama-index-legacy==0.9.48.post4
|
||||
# via llama-index
|
||||
llama-index-llms-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-cli
|
||||
# via llama-index-multi-modal-llms-openai
|
||||
# via llama-index-program-openai
|
||||
# via llama-index-question-gen-openai
|
||||
llama-index-multi-modal-llms-openai==0.3.0
|
||||
# via llama-index
|
||||
llama-index-program-openai==0.3.0
|
||||
# via llama-index
|
||||
# via llama-index-question-gen-openai
|
||||
llama-index-question-gen-openai==0.3.0
|
||||
# via llama-index
|
||||
llama-index-readers-file==0.4.0
|
||||
# via llama-index
|
||||
llama-index-readers-llama-parse==0.4.0
|
||||
# via llama-index
|
||||
llama-parse==0.5.14
|
||||
# via llama-index-readers-llama-parse
|
||||
# via megaparse
|
||||
lxml==5.3.0
|
||||
# via pikepdf
|
||||
# via python-docx
|
||||
# via python-pptx
|
||||
# via unstructured
|
||||
markdown==3.7
|
||||
# via unstructured
|
||||
markdown-it-py==3.0.0
|
||||
# via rich
|
||||
markupsafe==3.0.2
|
||||
# via jinja2
|
||||
# via quivr-core
|
||||
# via werkzeug
|
||||
marshmallow==3.23.1
|
||||
# via dataclasses-json
|
||||
matplotlib==3.9.2
|
||||
# via pycocotools
|
||||
# via unstructured-inference
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
megaparse==0.0.43
|
||||
# via quivr-core
|
||||
mpmath==1.3.0
|
||||
# via sympy
|
||||
msgpack==1.1.0
|
||||
# via langgraph-checkpoint
|
||||
multidict==6.1.0
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
mypy-extensions==1.0.0
|
||||
# via typing-inspect
|
||||
nest-asyncio==1.6.0
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured-client
|
||||
networkx==3.4.2
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via torch
|
||||
# via unstructured
|
||||
nltk==3.9.1
|
||||
# via llama-index
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured
|
||||
numpy==1.26.4
|
||||
# via contourpy
|
||||
# via faiss-cpu
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via matplotlib
|
||||
# via megaparse
|
||||
# via onnx
|
||||
# via onnxruntime
|
||||
# via opencv-python
|
||||
# via pandas
|
||||
# via pycocotools
|
||||
# via scipy
|
||||
# via torchvision
|
||||
# via transformers
|
||||
# via unstructured
|
||||
nvidia-cublas-cu12==12.4.5.8
|
||||
# via nvidia-cudnn-cu12
|
||||
# via nvidia-cusolver-cu12
|
||||
# via torch
|
||||
nvidia-cuda-cupti-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cuda-nvrtc-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cuda-runtime-cu12==12.4.127
|
||||
# via torch
|
||||
nvidia-cudnn-cu12==9.1.0.70
|
||||
# via torch
|
||||
nvidia-cufft-cu12==11.2.1.3
|
||||
# via torch
|
||||
nvidia-curand-cu12==10.3.5.147
|
||||
# via torch
|
||||
nvidia-cusolver-cu12==11.6.1.9
|
||||
# via torch
|
||||
nvidia-cusparse-cu12==12.3.1.170
|
||||
# via nvidia-cusolver-cu12
|
||||
# via torch
|
||||
nvidia-nccl-cu12==2.21.5
|
||||
# via torch
|
||||
nvidia-nvjitlink-cu12==12.4.127
|
||||
# via nvidia-cusolver-cu12
|
||||
# via nvidia-cusparse-cu12
|
||||
# via torch
|
||||
nvidia-nvtx-cu12==12.4.127
|
||||
# via torch
|
||||
olefile==0.47
|
||||
# via python-oxmsg
|
||||
omegaconf==2.3.0
|
||||
# via effdet
|
||||
onnx==1.17.0
|
||||
# via unstructured
|
||||
# via unstructured-inference
|
||||
onnxruntime==1.20.0
|
||||
# via unstructured-inference
|
||||
openai==1.54.5
|
||||
# via langchain-openai
|
||||
# via llama-index-agent-openai
|
||||
# via llama-index-embeddings-openai
|
||||
# via llama-index-legacy
|
||||
# via llama-index-llms-openai
|
||||
# via quivr-whisper
|
||||
opencv-python==4.10.0.84
|
||||
# via layoutparser
|
||||
# via unstructured-inference
|
||||
openpyxl==3.1.5
|
||||
# via unstructured
|
||||
orjson==3.10.11
|
||||
# via langgraph-sdk
|
||||
# via langsmith
|
||||
packaging==24.2
|
||||
# via faiss-cpu
|
||||
# via huggingface-hub
|
||||
# via langchain-core
|
||||
# via marshmallow
|
||||
# via matplotlib
|
||||
# via onnxruntime
|
||||
# via pikepdf
|
||||
# via pytesseract
|
||||
# via transformers
|
||||
# via unstructured-pytesseract
|
||||
pandas==2.2.3
|
||||
# via langchain-cohere
|
||||
# via layoutparser
|
||||
# via llama-index-legacy
|
||||
# via llama-index-readers-file
|
||||
# via unstructured
|
||||
parameterized==0.9.0
|
||||
# via cohere
|
||||
pdf2image==1.17.0
|
||||
# via layoutparser
|
||||
# via unstructured
|
||||
pdfminer-six==20231228
|
||||
# via pdfplumber
|
||||
# via unstructured
|
||||
pdfplumber==0.11.4
|
||||
# via layoutparser
|
||||
# via megaparse
|
||||
pikepdf==9.4.2
|
||||
# via unstructured
|
||||
pillow==11.0.0
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via matplotlib
|
||||
# via pdf2image
|
||||
# via pdfplumber
|
||||
# via pikepdf
|
||||
# via pillow-heif
|
||||
# via pytesseract
|
||||
# via python-pptx
|
||||
# via torchvision
|
||||
# via unstructured-pytesseract
|
||||
pillow-heif==0.20.0
|
||||
# via unstructured
|
||||
playwright==1.48.0
|
||||
# via megaparse
|
||||
portalocker==3.0.0
|
||||
# via iopath
|
||||
propcache==0.2.0
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
proto-plus==1.25.0
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
protobuf==5.28.3
|
||||
# via google-api-core
|
||||
# via google-cloud-vision
|
||||
# via googleapis-common-protos
|
||||
# via grpcio-status
|
||||
# via onnx
|
||||
# via onnxruntime
|
||||
# via proto-plus
|
||||
# via transformers
|
||||
psutil==6.1.0
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
pyasn1==0.6.1
|
||||
# via pyasn1-modules
|
||||
# via rsa
|
||||
pyasn1-modules==0.4.1
|
||||
# via google-auth
|
||||
pycocotools==2.0.8
|
||||
# via effdet
|
||||
pycparser==2.22
|
||||
# via cffi
|
||||
pycryptodome==3.21.0
|
||||
# via megaparse
|
||||
pydantic==2.9.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via fastapi
|
||||
# via langchain
|
||||
# via langchain-core
|
||||
# via langsmith
|
||||
# via llama-cloud
|
||||
# via llama-index-core
|
||||
# via openai
|
||||
# via pydantic-settings
|
||||
# via quivr-core
|
||||
# via unstructured-client
|
||||
pydantic-core==2.23.4
|
||||
# via cohere
|
||||
# via pydantic
|
||||
pydantic-settings==2.6.1
|
||||
# via megaparse
|
||||
pyee==12.0.0
|
||||
# via playwright
|
||||
pygments==2.18.0
|
||||
# via rich
|
||||
pypandoc==1.14
|
||||
# via unstructured
|
||||
pyparsing==3.2.0
|
||||
# via matplotlib
|
||||
pypdf==5.1.0
|
||||
# via llama-index-readers-file
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
# via unstructured-client
|
||||
pypdfium2==4.30.0
|
||||
# via pdfplumber
|
||||
pytesseract==0.3.13
|
||||
# via unstructured
|
||||
python-dateutil==2.8.2
|
||||
# via matplotlib
|
||||
# via pandas
|
||||
# via unstructured-client
|
||||
python-docx==1.1.2
|
||||
# via unstructured
|
||||
python-dotenv==1.0.1
|
||||
# via megaparse
|
||||
# via pydantic-settings
|
||||
python-iso639==2024.10.22
|
||||
# via unstructured
|
||||
python-magic==0.4.27
|
||||
# via megaparse
|
||||
# via unstructured
|
||||
python-multipart==0.0.17
|
||||
# via unstructured-inference
|
||||
python-oxmsg==0.0.1
|
||||
# via unstructured
|
||||
python-pptx==0.6.23
|
||||
# via unstructured
|
||||
pytz==2024.2
|
||||
# via pandas
|
||||
pyyaml==6.0.2
|
||||
# via huggingface-hub
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via layoutparser
|
||||
# via llama-index-core
|
||||
# via omegaconf
|
||||
# via timm
|
||||
# via transformers
|
||||
quivr-core==0.0.24
|
||||
# via quivr-whisper
|
||||
rapidfuzz==3.10.1
|
||||
# via quivr-core
|
||||
# via unstructured
|
||||
# via unstructured-inference
|
||||
ratelimit==2.2.1
|
||||
# via megaparse
|
||||
regex==2024.11.6
|
||||
# via nltk
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
requests==2.32.3
|
||||
# via cohere
|
||||
# via google-api-core
|
||||
# via huggingface-hub
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langsmith
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via megaparse
|
||||
# via requests-toolbelt
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
# via unstructured
|
||||
requests-toolbelt==1.0.0
|
||||
# via langsmith
|
||||
# via unstructured-client
|
||||
rich==13.9.4
|
||||
# via quivr-core
|
||||
rsa==4.9
|
||||
# via google-auth
|
||||
safetensors==0.4.5
|
||||
# via timm
|
||||
# via transformers
|
||||
scipy==1.14.1
|
||||
# via layoutparser
|
||||
sentencepiece==0.2.0
|
||||
# via transformers
|
||||
six==1.16.0
|
||||
# via langdetect
|
||||
# via python-dateutil
|
||||
sniffio==1.3.1
|
||||
# via anthropic
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via openai
|
||||
soupsieve==2.6
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.36
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
starlette==0.41.3
|
||||
# via fastapi
|
||||
striprtf==0.0.26
|
||||
# via llama-index-readers-file
|
||||
sympy==1.13.1
|
||||
# via onnxruntime
|
||||
# via torch
|
||||
tabulate==0.9.0
|
||||
# via langchain-cohere
|
||||
# via unstructured
|
||||
tenacity==8.5.0
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
tiktoken==0.8.0
|
||||
# via langchain-openai
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via quivr-core
|
||||
timm==1.0.11
|
||||
# via effdet
|
||||
# via unstructured-inference
|
||||
tokenizers==0.20.3
|
||||
# via cohere
|
||||
# via transformers
|
||||
torch==2.5.1
|
||||
# via effdet
|
||||
# via timm
|
||||
# via torchvision
|
||||
# via unstructured-inference
|
||||
torchvision==0.20.1
|
||||
# via effdet
|
||||
# via timm
|
||||
tqdm==4.67.0
|
||||
# via huggingface-hub
|
||||
# via iopath
|
||||
# via llama-index-core
|
||||
# via nltk
|
||||
# via openai
|
||||
# via transformers
|
||||
# via unstructured
|
||||
transformers==4.46.3
|
||||
# via quivr-core
|
||||
# via unstructured-inference
|
||||
triton==3.1.0
|
||||
# via torch
|
||||
types-pyyaml==6.0.12.20240917
|
||||
# via quivr-core
|
||||
types-requests==2.32.0.20241016
|
||||
# via cohere
|
||||
typing-extensions==4.12.2
|
||||
# via anthropic
|
||||
# via cohere
|
||||
# via fastapi
|
||||
# via huggingface-hub
|
||||
# via iopath
|
||||
# via langchain-core
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via openai
|
||||
# via pydantic
|
||||
# via pydantic-core
|
||||
# via pyee
|
||||
# via python-docx
|
||||
# via python-oxmsg
|
||||
# via sqlalchemy
|
||||
# via torch
|
||||
# via typing-inspect
|
||||
# via unstructured
|
||||
typing-inspect==0.9.0
|
||||
# via dataclasses-json
|
||||
# via llama-index-core
|
||||
# via llama-index-legacy
|
||||
# via unstructured-client
|
||||
tzdata==2024.2
|
||||
# via pandas
|
||||
unstructured==0.15.0
|
||||
# via megaparse
|
||||
unstructured-client==0.27.0
|
||||
# via unstructured
|
||||
unstructured-inference==0.7.36
|
||||
# via unstructured
|
||||
unstructured-pytesseract==0.3.13
|
||||
# via unstructured
|
||||
urllib3==2.2.3
|
||||
# via requests
|
||||
# via types-requests
|
||||
uvicorn==0.32.0
|
||||
# via megaparse
|
||||
uvloop==0.21.0
|
||||
# via megaparse
|
||||
werkzeug==3.1.3
|
||||
# via flask
|
||||
wrapt==1.16.0
|
||||
# via deprecated
|
||||
# via llama-index-core
|
||||
# via unstructured
|
||||
xlrd==2.0.1
|
||||
# via unstructured
|
||||
xlsxwriter==3.2.0
|
||||
# via python-pptx
|
||||
yarl==1.17.2
|
||||
# via aiohttp
|
209
examples/quivr-whisper/static/app.js
Normal file
209
examples/quivr-whisper/static/app.js
Normal file
@ -0,0 +1,209 @@
|
||||
const recordBtn = document.getElementById('record-btn');
|
||||
const audioVisualizer = document.getElementById('audio-visualizer');
|
||||
const audioPlayback = document.getElementById('audio-playback');
|
||||
const canvasCtx = audioVisualizer.getContext('2d');
|
||||
|
||||
let isRecording = false;
|
||||
let mediaRecorder;
|
||||
let audioChunks = [];
|
||||
let audioContext;
|
||||
let analyser;
|
||||
let dataArray;
|
||||
let bufferLength;
|
||||
let lastAudioLevel = 0;
|
||||
let silenceTimer;
|
||||
|
||||
recordBtn.addEventListener('click', toggleRecording);
|
||||
|
||||
function toggleRecording() {
|
||||
if (!isRecording) {
|
||||
recordBtn.classList.add('hidden');
|
||||
audioVisualizer.classList.remove('hidden');
|
||||
startRecording();
|
||||
} else {
|
||||
audioVisualizer.classList.add('hidden');
|
||||
stopRecording();
|
||||
}
|
||||
}
|
||||
|
||||
function drawWaveform() {
|
||||
if (!analyser) return;
|
||||
|
||||
requestAnimationFrame(drawWaveform);
|
||||
|
||||
analyser.getByteTimeDomainData(dataArray);
|
||||
|
||||
canvasCtx.fillStyle = 'rgb(255, 255, 255)';
|
||||
canvasCtx.fillRect(0, 0, audioVisualizer.width, audioVisualizer.height);
|
||||
|
||||
canvasCtx.lineWidth = 2;
|
||||
canvasCtx.strokeStyle = 'rgb(0, 0, 0)';
|
||||
|
||||
canvasCtx.beginPath();
|
||||
|
||||
let sliceWidth = audioVisualizer.width * 1.0 / bufferLength;
|
||||
let x = 0;
|
||||
|
||||
let sum = 0;
|
||||
|
||||
for (let i = 0; i < bufferLength; i++) {
|
||||
let v = dataArray[i] / 128.0;
|
||||
let y = v * audioVisualizer.height / 2;
|
||||
|
||||
sum += v;
|
||||
|
||||
if (i === 0) {
|
||||
canvasCtx.moveTo(x, y);
|
||||
} else {
|
||||
canvasCtx.lineTo(x, y);
|
||||
}
|
||||
|
||||
x += sliceWidth;
|
||||
}
|
||||
|
||||
canvasCtx.lineTo(audioVisualizer.width, audioVisualizer.height / 2);
|
||||
canvasCtx.stroke();
|
||||
|
||||
let currentAudioLevel = sum / bufferLength;
|
||||
|
||||
if (isRecording && Math.abs(currentAudioLevel - lastAudioLevel) < 0.01) {
|
||||
if (!silenceTimer) {
|
||||
silenceTimer = setTimeout(stopRecording, 1000);
|
||||
}
|
||||
} else {
|
||||
clearTimeout(silenceTimer);
|
||||
silenceTimer = null;
|
||||
}
|
||||
|
||||
lastAudioLevel = currentAudioLevel;
|
||||
}
|
||||
|
||||
async function startRecording() {
|
||||
audioChunks = [];
|
||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||
mediaRecorder = new MediaRecorder(stream);
|
||||
mediaRecorder.ondataavailable = event => {
|
||||
audioChunks.push(event.data);
|
||||
};
|
||||
mediaRecorder.start();
|
||||
isRecording = true;
|
||||
|
||||
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
||||
analyser = audioContext.createAnalyser();
|
||||
const source = audioContext.createMediaStreamSource(stream);
|
||||
|
||||
source.connect(analyser);
|
||||
analyser.fftSize = 2048;
|
||||
bufferLength = analyser.frequencyBinCount;
|
||||
dataArray = new Uint8Array(bufferLength);
|
||||
|
||||
drawWaveform();
|
||||
}
|
||||
|
||||
function stopRecording() {
|
||||
mediaRecorder.stop();
|
||||
mediaRecorder.onstop = async () => {
|
||||
// The mediaRecorder has stopped; now we can process the chunks
|
||||
const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
|
||||
const formData = new FormData();
|
||||
formData.append('audio_data', audioBlob);
|
||||
|
||||
// Now we're sending the audio to the server and waiting for a response
|
||||
try {
|
||||
const response = await fetch('/transcribe', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
const data = await response.json();
|
||||
|
||||
// Once we have the response, we can source the playback element and play it
|
||||
audioPlayback.src = 'data:audio/wav;base64,' + data.audio_base64;
|
||||
audioPlayback.classList.remove('hidden');
|
||||
audioVisualizer.classList.add('hidden'); // hide the visualizer while playing back the response
|
||||
setupAIResponseVisualization();
|
||||
audioPlayback.onloadedmetadata = () => {
|
||||
// When metadata is loaded, start playback
|
||||
audioPlayback.play();
|
||||
visualizeAIResponse();
|
||||
};
|
||||
|
||||
// We only reset the UI after the audio has finished playing
|
||||
// audioPlayback.onended = () => {
|
||||
// resetUI();
|
||||
// };
|
||||
} catch (error) {
|
||||
console.error('Error during fetch/transcription:', error);
|
||||
resetUI();
|
||||
} finally {
|
||||
if (analyser) {
|
||||
analyser.disconnect();
|
||||
analyser = null;
|
||||
}
|
||||
isRecording = false;
|
||||
}
|
||||
};
|
||||
}
|
||||
function resetUI() {
|
||||
document.getElementById('record-btn').classList.remove('hidden');
|
||||
document.getElementById('audio-visualizer').classList.add('hidden');
|
||||
document.getElementById('audio-playback').classList.add('hidden');
|
||||
// Reset any other UI elements as necessary
|
||||
}
|
||||
|
||||
function setupAIResponseVisualization() {
|
||||
try {
|
||||
// Create a new audio context for playback if it doesn't exist
|
||||
if (!audioContext) {
|
||||
audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
||||
}
|
||||
// Resume the audio context in case it's in a suspended state
|
||||
audioContext.resume().then(() => {
|
||||
analyser = audioContext.createAnalyser();
|
||||
const source = audioContext.createMediaElementSource(audioPlayback);
|
||||
source.connect(analyser);
|
||||
analyser.connect(audioContext.destination);
|
||||
analyser.fftSize = 2048;
|
||||
bufferLength = analyser.frequencyBinCount;
|
||||
dataArray = new Uint8Array(bufferLength);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error setting up AI response visualization:', error);
|
||||
}
|
||||
}
|
||||
|
||||
function visualizeAIResponse() {
|
||||
const draw = () => {
|
||||
requestAnimationFrame(draw);
|
||||
|
||||
analyser.getByteTimeDomainData(dataArray);
|
||||
|
||||
canvasCtx.fillStyle = 'rgb(255, 255, 255)';
|
||||
canvasCtx.fillRect(0, 0, audioVisualizer.width, audioVisualizer.height);
|
||||
|
||||
canvasCtx.lineWidth = 2;
|
||||
canvasCtx.strokeStyle = 'rgb(0, 0, 0)';
|
||||
|
||||
canvasCtx.beginPath();
|
||||
|
||||
let sliceWidth = audioVisualizer.width * 1.0 / bufferLength;
|
||||
let x = 0;
|
||||
|
||||
for (let i = 0; i < bufferLength; i++) {
|
||||
let v = dataArray[i] / 128.0;
|
||||
let y = v * audioVisualizer.height / 2;
|
||||
|
||||
if (i === 0) {
|
||||
canvasCtx.moveTo(x, y);
|
||||
} else {
|
||||
canvasCtx.lineTo(x, y);
|
||||
}
|
||||
|
||||
x += sliceWidth;
|
||||
}
|
||||
|
||||
canvasCtx.lineTo(audioVisualizer.width, audioVisualizer.height / 2);
|
||||
canvasCtx.stroke();
|
||||
};
|
||||
|
||||
draw();
|
||||
}
|
36
examples/quivr-whisper/static/styles.css
Normal file
36
examples/quivr-whisper/static/styles.css
Normal file
@ -0,0 +1,36 @@
|
||||
.loader {
|
||||
border: 4px solid #f3f3f3;
|
||||
border-radius: 50%;
|
||||
border-top: 4px solid #3498db;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
-webkit-animation: spin 2s linear infinite;
|
||||
animation: spin 2s linear infinite;
|
||||
position: absolute;
|
||||
/* Center the loader in the viewport */
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
display: none;
|
||||
/* Hide it by default */
|
||||
}
|
||||
|
||||
@-webkit-keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
26
examples/quivr-whisper/templates/index.html
Normal file
26
examples/quivr-whisper/templates/index.html
Normal file
@ -0,0 +1,26 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Audio Interaction WebApp</title>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
|
||||
</head>
|
||||
|
||||
<body class="bg-gray-100 flex flex-col items-center justify-center h-screen">
|
||||
<h1 class="text-6xl font-bold mb-8">Quivr.app</h1>
|
||||
<div id="app" class="text-center">
|
||||
<button id="record-btn"
|
||||
class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full cursor-pointer">
|
||||
Ask a question to Quivr
|
||||
</button>
|
||||
<canvas id="audio-visualizer" width="640" height="100"
|
||||
class="hidden bg-white rounded-lg cursor-pointer"></canvas>
|
||||
<audio id="audio-playback" controls class="hidden mt-4"></audio>
|
||||
</div>
|
||||
<script src="{{ url_for('static', filename='app.js') }}"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user