Spaces:
Sleeping
Sleeping
Upload folder using huggingface_hub
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- .gitattributes +44 -35
- .gitignore +2 -0
- .gradioignore +2 -0
- README.md +5 -4
- app.py +320 -0
- data/audio/swarams/c_ak_da1.mp3 +3 -0
- data/audio/swarams/c_ak_da1_higher.mp3 +3 -0
- data/audio/swarams/c_ak_da1_lower.mp3 +3 -0
- data/audio/swarams/c_ak_da2.mp3 +3 -0
- data/audio/swarams/c_ak_da2_lower.mp3 +3 -0
- data/audio/swarams/c_ak_da3.mp3 +3 -0
- data/audio/swarams/c_ak_da3_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ga1.mp3 +3 -0
- data/audio/swarams/c_ak_ga1_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ga2.mp3 +3 -0
- data/audio/swarams/c_ak_ga2_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ga3.mp3 +3 -0
- data/audio/swarams/c_ak_ga3_higher.mp3 +3 -0
- data/audio/swarams/c_ak_gamakam_ga3_pa.mp3 +3 -0
- data/audio/swarams/c_ak_gamakam_pa_da2.mp3 +3 -0
- data/audio/swarams/c_ak_gamakam_sa_higher_da2.mp3 +3 -0
- data/audio/swarams/c_ak_gamakam_sa_ri2.mp3 +3 -0
- data/audio/swarams/c_ak_ma1.mp3 +3 -0
- data/audio/swarams/c_ak_ma1_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ma1_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ma2.mp3 +3 -0
- data/audio/swarams/c_ak_ma2_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ma2_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ni1.mp3 +3 -0
- data/audio/swarams/c_ak_ni1_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ni2.mp3 +3 -0
- data/audio/swarams/c_ak_ni2_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ni3.mp3 +3 -0
- data/audio/swarams/c_ak_ni3_lower.mp3 +3 -0
- data/audio/swarams/c_ak_pa.mp3 +3 -0
- data/audio/swarams/c_ak_pa_higher.mp3 +3 -0
- data/audio/swarams/c_ak_pa_lower.mp3 +3 -0
- data/audio/swarams/c_ak_ri1.mp3 +3 -0
- data/audio/swarams/c_ak_ri1_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ri2.mp3 +3 -0
- data/audio/swarams/c_ak_ri2_higher.mp3 +3 -0
- data/audio/swarams/c_ak_ri3.mp3 +3 -0
- data/audio/swarams/c_ak_ri3_higher.mp3 +3 -0
- data/audio/swarams/c_ak_sa.mp3 +3 -0
- data/audio/swarams/c_ak_sa_higher.mp3 +3 -0
- data/audio/swarams/c_ak_silence.mp3 +0 -0
- data/audio/swarams/c_ak_tanpura.mp3 +3 -0
- data/audio/swarams/c_ak_tanpura_ma1.mp3 +3 -0
- data/audio/swarams/c_ak_tanpura_ma2.mp3 +3 -0
- data/audio/swarams/c_sw_da1.mp3 +3 -0
.gitattributes
CHANGED
@@ -1,35 +1,44 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
-
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
-
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
*.mp3 filter=lfs diff=lfs merge=lfs -text
|
37 |
+
*.gitignore filter=lfs diff=lfs merge=lfs -text
|
38 |
+
*.gradioignore filter=lfs diff=lfs merge=lfs -text
|
39 |
+
*.md filter=lfs diff=lfs merge=lfs -text
|
40 |
+
*.py filter=lfs diff=lfs merge=lfs -text
|
41 |
+
*.json filter=lfs diff=lfs merge=lfs -text
|
42 |
+
*.toml filter=lfs diff=lfs merge=lfs -text
|
43 |
+
*.txt filter=lfs diff=lfs merge=lfs -text
|
44 |
+
*.lock filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
.env
|
2 |
+
.venv/
|
.gradioignore
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
.env
|
2 |
+
.venv/
|
README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
|
4 |
-
|
5 |
-
|
|
|
6 |
sdk: gradio
|
7 |
sdk_version: 5.35.0
|
8 |
app_file: app.py
|
|
|
1 |
---
|
2 |
+
title: carnatic-music-ai
|
3 |
+
python_version: 3.12
|
4 |
+
emoji: 🚀
|
5 |
+
colorFrom: purple
|
6 |
+
colorTo: pink
|
7 |
sdk: gradio
|
8 |
sdk_version: 5.35.0
|
9 |
app_file: app.py
|
app.py
ADDED
@@ -0,0 +1,320 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
import os
|
3 |
+
import gradio as gr
|
4 |
+
from dotenv import load_dotenv
|
5 |
+
from openai import OpenAI
|
6 |
+
import operator
|
7 |
+
from typing import Callable, Iterable, List, Mapping, Any
|
8 |
+
|
9 |
+
# ----------------------------------------------------------------------
|
10 |
+
# Shared operator registry and resolver
|
11 |
+
# ----------------------------------------------------------------------
|
12 |
+
_OPS: dict[str, Callable[[Any, Any], bool]] = {
|
13 |
+
"==": operator.eq,
|
14 |
+
"!=": operator.ne,
|
15 |
+
"<": operator.lt,
|
16 |
+
"<=": operator.le,
|
17 |
+
">": operator.gt,
|
18 |
+
">=": operator.ge,
|
19 |
+
"in": lambda lhs, rhs: lhs in rhs,
|
20 |
+
"contains": lambda lhs, rhs: (
|
21 |
+
all(item in lhs for item in rhs)
|
22 |
+
if isinstance(rhs, (list, tuple, set, frozenset))
|
23 |
+
else rhs in lhs
|
24 |
+
),
|
25 |
+
}
|
26 |
+
|
27 |
+
def _resolve(op: str | Callable[[Any, Any], bool]) -> Callable[[Any, Any], bool]:
|
28 |
+
if callable(op):
|
29 |
+
return op
|
30 |
+
try:
|
31 |
+
return _OPS[op]
|
32 |
+
except KeyError:
|
33 |
+
raise ValueError(f"Unsupported operator: {op!r}") from None
|
34 |
+
|
35 |
+
# ----------------------------------------------------------------------
|
36 |
+
# Helper: fetch a value no matter where it is nested
|
37 |
+
# ----------------------------------------------------------------------
|
38 |
+
def _get_nested_value(obj: Any, field: str) -> Any:
|
39 |
+
"""
|
40 |
+
• Supports dotted paths like "signature.aarohanam".
|
41 |
+
• If no dots are given, searches *recursively* for a key
|
42 |
+
with that name and returns the first match.
|
43 |
+
• Returns [] (empty list) when the key can’t be found
|
44 |
+
so that “contains” still works safely.
|
45 |
+
"""
|
46 |
+
# 1) dotted‑path lookup ------------------------------------------
|
47 |
+
if "." in field:
|
48 |
+
for part in field.split("."):
|
49 |
+
if isinstance(obj, Mapping) and part in obj:
|
50 |
+
obj = obj[part]
|
51 |
+
else:
|
52 |
+
return [] # path breaks ⇒ treat as “nothing here”
|
53 |
+
return obj
|
54 |
+
|
55 |
+
# 2) recursive scan (simple key) ---------------------------------
|
56 |
+
if isinstance(obj, Mapping):
|
57 |
+
if field in obj:
|
58 |
+
return obj[field]
|
59 |
+
for v in obj.values():
|
60 |
+
got = _get_nested_value(v, field)
|
61 |
+
if got != []:
|
62 |
+
return got
|
63 |
+
elif isinstance(obj, (list, tuple, set, frozenset)):
|
64 |
+
for v in obj:
|
65 |
+
got = _get_nested_value(v, field)
|
66 |
+
if got != []:
|
67 |
+
return got
|
68 |
+
return [] # not found anywhere
|
69 |
+
|
70 |
+
# ----------------------------------------------------------------------
|
71 |
+
# 1‑filter version (unchanged, for reference)
|
72 |
+
# ----------------------------------------------------------------------
|
73 |
+
def query_collection(collectionName: str,
|
74 |
+
field: str | None = None,
|
75 |
+
op: str | Callable[[Any, Any], bool] | None = None,
|
76 |
+
value: Any | None = None):
|
77 |
+
collection: Iterable[Mapping[str, Any]] = read_file_as_json_array(
|
78 |
+
collectionName, f"data/{collectionName}.json")
|
79 |
+
|
80 |
+
if not op:
|
81 |
+
return collection[:20]
|
82 |
+
|
83 |
+
cmp = _resolve(op)
|
84 |
+
return [
|
85 |
+
item
|
86 |
+
for item in collection
|
87 |
+
if cmp(_get_nested_value(item, field), value)
|
88 |
+
]
|
89 |
+
|
90 |
+
|
91 |
+
# ----------------------------------------------------------------------
|
92 |
+
# NEW: multi‑filter counter
|
93 |
+
# ----------------------------------------------------------------------
|
94 |
+
def count_documents(collectionName: str,
|
95 |
+
filters: List[Mapping[str, Any] | None] = None) -> int:
|
96 |
+
"""
|
97 |
+
*filters* is a list/tuple of dict‑like objects with keys:
|
98 |
+
• field – str
|
99 |
+
• op – str key in _OPS **or** a custom 2‑arg callable
|
100 |
+
• value – value to compare against
|
101 |
+
|
102 |
+
All filters are AND‑ed together (an item must satisfy every filter).
|
103 |
+
"""
|
104 |
+
collection: Iterable[Mapping[str, Any]] = read_file_as_json_array(
|
105 |
+
collectionName, f"data/{collectionName}.json")
|
106 |
+
|
107 |
+
# Pre‑compute each filter as (field, cmp‑function, value)
|
108 |
+
compiled = [(f["field"], _resolve(f["op"]), f["value"])
|
109 |
+
for f in filters] if filters else []
|
110 |
+
|
111 |
+
def matches(item):
|
112 |
+
return all(cmp(item[field] if field in item else None, value) for field, cmp, value in compiled)
|
113 |
+
|
114 |
+
return sum(1 for item in collection if matches(item))
|
115 |
+
|
116 |
+
|
117 |
+
def read_file_as_json_array(label, fileName):
|
118 |
+
with open(fileName, "r", encoding="utf-8") as f:
|
119 |
+
some_str = f.read()
|
120 |
+
|
121 |
+
json_array = json.loads(some_str)
|
122 |
+
print(f"Number of {label} loaded = ")
|
123 |
+
print(len(json_array))
|
124 |
+
return json_array
|
125 |
+
|
126 |
+
|
127 |
+
def get_audio_update(swaram):
|
128 |
+
print("play_swaram called for " + swaram)
|
129 |
+
results = query_collection("swarams", "name", "==", swaram.upper())
|
130 |
+
|
131 |
+
if len(results) > 0:
|
132 |
+
swaramInfo = results[0]
|
133 |
+
print(swaramInfo)
|
134 |
+
audioFilePath = f"data/audio/swarams/c_sw_{swaramInfo['fileName']}.mp3"
|
135 |
+
audio_update = gr.update(value=audioFilePath, visible=True)
|
136 |
+
# return f"Playing swaram {swaram} using audio file {audioFilePath}"
|
137 |
+
return audio_update
|
138 |
+
else:
|
139 |
+
audio_update = gr.update(visible=False)
|
140 |
+
# return f"Unknown swaram {swaram}"
|
141 |
+
return audio_update
|
142 |
+
|
143 |
+
|
144 |
+
def play_swaram(swaram):
|
145 |
+
# play the swaram using audio library
|
146 |
+
return get_audio_update(swaram)
|
147 |
+
|
148 |
+
|
149 |
+
load_dotenv(override=True)
|
150 |
+
|
151 |
+
tool_specs = [
|
152 |
+
{
|
153 |
+
"type": "function",
|
154 |
+
"function": {
|
155 |
+
"name": "query_collection",
|
156 |
+
"description": "Run a structured filter over Firestore",
|
157 |
+
"parameters": {
|
158 |
+
"type": "object",
|
159 |
+
"properties": {
|
160 |
+
"collectionName": {"type": "string"},
|
161 |
+
"field": {"type": "string"},
|
162 |
+
"op": {"type": "string", "enum": ["==", "<", "<=", ">", ">="]},
|
163 |
+
"value": {"type": "string"}
|
164 |
+
},
|
165 |
+
"required": ["collection"]
|
166 |
+
}
|
167 |
+
},
|
168 |
+
},
|
169 |
+
{
|
170 |
+
"type": "function",
|
171 |
+
"function": {
|
172 |
+
"name": "vector_search",
|
173 |
+
"description": "Semantic search over a collection using embeddings",
|
174 |
+
"parameters": {
|
175 |
+
"type": "object",
|
176 |
+
"properties": {
|
177 |
+
"collectionName": {"type": "string"},
|
178 |
+
"query": {"type": "string"},
|
179 |
+
"top_k": {"type": "integer", "default": 5}
|
180 |
+
},
|
181 |
+
"required": ["collectionName", "query"]
|
182 |
+
}
|
183 |
+
},
|
184 |
+
},
|
185 |
+
{
|
186 |
+
"type": "function",
|
187 |
+
"function": {
|
188 |
+
"name": "count_documents",
|
189 |
+
"description": "Return how many documents satisfy optional filters",
|
190 |
+
"parameters": {
|
191 |
+
"type": "object",
|
192 |
+
"properties": {
|
193 |
+
"collectionName": {"type": "string",
|
194 |
+
"description": "Firestore collection name"},
|
195 |
+
"filters": {
|
196 |
+
"type": "array",
|
197 |
+
"items": {
|
198 |
+
"type": "object",
|
199 |
+
"properties": {
|
200 |
+
"field": {"type": "string"},
|
201 |
+
"op": {"type": "string",
|
202 |
+
"enum": ["==", "<", "<=", ">", ">=", "!="]},
|
203 |
+
"value": {}
|
204 |
+
},
|
205 |
+
"required": ["field", "op", "value"]
|
206 |
+
},
|
207 |
+
"description": "Optional list of field comparisons"
|
208 |
+
}
|
209 |
+
},
|
210 |
+
"required": ["collectionName"]
|
211 |
+
}
|
212 |
+
}
|
213 |
+
},
|
214 |
+
{
|
215 |
+
"type": "function",
|
216 |
+
"function": {
|
217 |
+
"name": "play_swaram",
|
218 |
+
"description": "Play a swaram",
|
219 |
+
"parameters": {
|
220 |
+
"type": "object",
|
221 |
+
"properties": {
|
222 |
+
"swaram": {"type": "string"},
|
223 |
+
},
|
224 |
+
"required": ["swaram"]
|
225 |
+
}
|
226 |
+
},
|
227 |
+
},
|
228 |
+
|
229 |
+
]
|
230 |
+
|
231 |
+
|
232 |
+
openai = OpenAI()
|
233 |
+
system_prompt = f"""You are an encyclopedia of carnatic music. Users will query you asking questions about various aspects of carnatic music.
|
234 |
+
if the user asks about ragams or ragas, use the ragams collection from the database instead of ragas. If you already fetched the data earlier, don't again query from the database.
|
235 |
+
If the user asks for a count, total, number of X, etc call count_documents.
|
236 |
+
if user asks for ragams containing some swarams X,Y,Z in aarohanam or avarohanam, use operator contains and pass an array of swarams to it as value.
|
237 |
+
Using ONLY the tools query_collection, count_documents and vector_search as your datasources, please answer the questions. If you don't know the answer to a question, please say so.
|
238 |
+
"""
|
239 |
+
|
240 |
+
|
241 |
+
def handle_tool_calls(tool_calls):
|
242 |
+
results = []
|
243 |
+
for tool_call in tool_calls:
|
244 |
+
tool_name = tool_call.function.name
|
245 |
+
tool = globals().get(tool_name)
|
246 |
+
arguments = json.loads(tool_call.function.arguments)
|
247 |
+
print(arguments)
|
248 |
+
result = tool(**arguments)
|
249 |
+
results.append(
|
250 |
+
{"role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result)})
|
251 |
+
return results
|
252 |
+
|
253 |
+
|
254 |
+
def chat(message, history):
|
255 |
+
chat_history = history + [{"role": "user", "content": message}]
|
256 |
+
# print("history = " + json.dumps(history))
|
257 |
+
messages = [{"role": "system", "content": system_prompt}]
|
258 |
+
|
259 |
+
# for user_msg, assistant_msg in history:
|
260 |
+
# if user_msg is not None:
|
261 |
+
# messages.append({"role": "user", "content": user_msg})
|
262 |
+
# if assistant_msg is not None:
|
263 |
+
# messages.append({"role": "assistant", "content": assistant_msg})
|
264 |
+
|
265 |
+
messages += history
|
266 |
+
|
267 |
+
messages.append({"role": "user", "content": message})
|
268 |
+
|
269 |
+
print("messages = " + json.dumps(messages))
|
270 |
+
response = openai.chat.completions.create(
|
271 |
+
model="gpt-4o-mini", messages=messages, tools=tool_specs, tool_choice="auto")
|
272 |
+
|
273 |
+
response_message = response.choices[0].message
|
274 |
+
if response.choices[0].finish_reason == "tool_calls":
|
275 |
+
tool_calls = response.choices[0].message.tool_calls
|
276 |
+
tool_responses = handle_tool_calls(tool_calls)
|
277 |
+
messages.append(response_message)
|
278 |
+
messages.extend(tool_responses)
|
279 |
+
followup_response = openai.chat.completions.create(
|
280 |
+
model="gpt-4o-mini", messages=messages, tools=tool_specs, tool_choice="auto")
|
281 |
+
chat_history.append(
|
282 |
+
{"role": "assistant", "content": followup_response.choices[0].message.content})
|
283 |
+
play_audio_tool = [
|
284 |
+
tool_call for tool_call in tool_calls if tool_call.function.name == "play_swaram"]
|
285 |
+
# print(play_audio_tool)
|
286 |
+
if (len(play_audio_tool) > 0):
|
287 |
+
args = json.loads(play_audio_tool[0].function.arguments)
|
288 |
+
return "", chat_history, get_audio_update(**args)
|
289 |
+
else:
|
290 |
+
return "", chat_history, gr.update(visible=False)
|
291 |
+
else:
|
292 |
+
print("message.content = " + message)
|
293 |
+
print("response.choices[0].message.content" +
|
294 |
+
response.choices[0].message.content)
|
295 |
+
chat_history.append({"role": "assistant",
|
296 |
+
"content": response.choices[0].message.content})
|
297 |
+
return "", chat_history, gr.update(visible=False)
|
298 |
+
|
299 |
+
|
300 |
+
# demo = gr.ChatInterface(chat, type="messages")
|
301 |
+
|
302 |
+
# demo.launch()
|
303 |
+
|
304 |
+
# ----------------------------------
|
305 |
+
# Interface
|
306 |
+
# ----------------------------------
|
307 |
+
with gr.Blocks(title="Chat + Player") as demo:
|
308 |
+
chatbot = gr.Chatbot(height=400, type="messages")
|
309 |
+
# hidden until needed
|
310 |
+
audio_out = gr.Audio(interactive=False, visible=False, autoplay=True)
|
311 |
+
textbox = gr.Textbox(placeholder="Type here and hit Enter")
|
312 |
+
|
313 |
+
# wire textbox -> respond()
|
314 |
+
textbox.submit(
|
315 |
+
chat,
|
316 |
+
inputs=[textbox, chatbot],
|
317 |
+
outputs=[textbox, chatbot, audio_out],
|
318 |
+
)
|
319 |
+
|
320 |
+
demo.launch()
|
data/audio/swarams/c_ak_da1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3c8c59f56872cd1ced8f5ad6ff5552df906fb066d5b9980de36600e63b8e2e7e
|
3 |
+
size 182760
|
data/audio/swarams/c_ak_da1_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d1677ce898106ace7bad03a02be3484136915791f22c4e1c4e4433719dc5b6da
|
3 |
+
size 185763
|
data/audio/swarams/c_ak_da1_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:04a272b19898c1d837c4dbcab5c07f1e9f60d6d15f0c949c5346482ca65e1ec0
|
3 |
+
size 147148
|
data/audio/swarams/c_ak_da2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3b99a7d1bae1842f70477b3336df201446eeee63221b7681309f6558762c6709
|
3 |
+
size 168934
|
data/audio/swarams/c_ak_da2_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f3b485286bad1eb325192c0baeed4ca34c6b691c217fa574e1ab9e983e596ffa
|
3 |
+
size 117670
|
data/audio/swarams/c_ak_da3.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:bc4c8b18efb26d4a66993ff36a7f6cea2b29ba040187f1a087d441f7419e480e
|
3 |
+
size 179520
|
data/audio/swarams/c_ak_da3_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:497706fc4bfb44298422699ac6754bffbf0679d968dec56dabe3b8b0129b2b73
|
3 |
+
size 219533
|
data/audio/swarams/c_ak_ga1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b668b200f0eda100fd35148d46ff15616be7dae3fd564ae8862ba4a46f1aac1b
|
3 |
+
size 207047
|
data/audio/swarams/c_ak_ga1_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:00b0902f3613ce8b579eb266ce21ff737c0f1ccb064e5fa180bbb3555cf21d92
|
3 |
+
size 131214
|
data/audio/swarams/c_ak_ga2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c99ed885d02e23a14eacba1560318fd0f439d7cff3d970286c0e8f72472bf07a
|
3 |
+
size 193990
|
data/audio/swarams/c_ak_ga2_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7f4542da10e06347348d86b4565cd48861504fc0fd0f6d6706c6946d60d7297f
|
3 |
+
size 189574
|
data/audio/swarams/c_ak_ga3.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cd1b8ba80ed796344ecbe9a94a542ece8acd24ab3603c6b9efeb878add5066a9
|
3 |
+
size 209350
|
data/audio/swarams/c_ak_ga3_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:71973cf59760eedc57f5f2e8c666942e3d25f0c4fd7a466aae7eb0209bb81634
|
3 |
+
size 175229
|
data/audio/swarams/c_ak_gamakam_ga3_pa.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c094de550d2f877b58f02a34eb9fbe5405e03681c2e560a5d629a374106519e3
|
3 |
+
size 164612
|
data/audio/swarams/c_ak_gamakam_pa_da2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:d2bb3e00c394354d340fa9e0fbca60fc2a5a6ba1cb5f10f0b81d8143f1993ddf
|
3 |
+
size 159798
|
data/audio/swarams/c_ak_gamakam_sa_higher_da2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b2ff0de7d62931936ca17d2fa29bc1b992deade3676d91dc60182c06ee3ad528
|
3 |
+
size 166528
|
data/audio/swarams/c_ak_gamakam_sa_ri2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:118a26e77c1a44e2aaf75dc664323dae9efbf14641e6da5f3d8fddf20c07f9b5
|
3 |
+
size 157879
|
data/audio/swarams/c_ak_ma1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:18b55c1a6efe5942f012d3f8e9a059f98fe5f5b3dc95ce57002bd49d8a587e66
|
3 |
+
size 132480
|
data/audio/swarams/c_ak_ma1_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:77fc40b4c980cf6ff58d04abac0712a07b88760fad525b0bf9a540f8b2c16ceb
|
3 |
+
size 162893
|
data/audio/swarams/c_ak_ma1_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7e0a072b1ded10d1fdfbbbae010949f54616213f2813931fc1cc17e76f2b3d96
|
3 |
+
size 282509
|
data/audio/swarams/c_ak_ma2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1059239094da13d5c7be6f7801380aa7070e4f62df4060d8311edff6ba77c9e5
|
3 |
+
size 194759
|
data/audio/swarams/c_ak_ma2_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:4808150f923a76d3a36a76f03bfec32e6c7e33e70bfa231f24dc41c456215531
|
3 |
+
size 192455
|
data/audio/swarams/c_ak_ma2_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:ab3352e939fa75d8f010505bdd1b56607323abd681a46d239ba3eea3b11dc0f6
|
3 |
+
size 288269
|
data/audio/swarams/c_ak_ni1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:3b99a7d1bae1842f70477b3336df201446eeee63221b7681309f6558762c6709
|
3 |
+
size 168934
|
data/audio/swarams/c_ak_ni1_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:f3b485286bad1eb325192c0baeed4ca34c6b691c217fa574e1ab9e983e596ffa
|
3 |
+
size 117670
|
data/audio/swarams/c_ak_ni2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:bc4c8b18efb26d4a66993ff36a7f6cea2b29ba040187f1a087d441f7419e480e
|
3 |
+
size 179520
|
data/audio/swarams/c_ak_ni2_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:497706fc4bfb44298422699ac6754bffbf0679d968dec56dabe3b8b0129b2b73
|
3 |
+
size 219533
|
data/audio/swarams/c_ak_ni3.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:22dde43d9ea173da6646596b7744562e6851c4502d0830127bb86e65fdbff94b
|
3 |
+
size 181440
|
data/audio/swarams/c_ak_ni3_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:6c62d5223e80f4a09ee48661ce4ecd7b5e1998a458863d072d22c7cc98102d08
|
3 |
+
size 311597
|
data/audio/swarams/c_ak_pa.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5d66b988139a64d32fb4a5bce90b51d1c7cee3d655480cdc4eb4555df8285663
|
3 |
+
size 163200
|
data/audio/swarams/c_ak_pa_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:56766b44e2bccad015dfb5a236803fb9c9f6b5dc08b26617ba2037c59d2ad5d0
|
3 |
+
size 186893
|
data/audio/swarams/c_ak_pa_lower.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:41be7ba427e71a85d7727dd257aee8c5e11ba6e846aa526f338a3bef973bf95b
|
3 |
+
size 301420
|
data/audio/swarams/c_ak_ri1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cd80e7895a4a223e0ab2318dfdfebda3dc9839d187cfe447f9852dd58885554b
|
3 |
+
size 171840
|
data/audio/swarams/c_ak_ri1_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:5ee6ea2d89a7976d86a40b6bdf561a87f9c067d7fe9bb5b41678c67fcb6b8bf6
|
3 |
+
size 112014
|
data/audio/swarams/c_ak_ri2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:b668b200f0eda100fd35148d46ff15616be7dae3fd564ae8862ba4a46f1aac1b
|
3 |
+
size 207047
|
data/audio/swarams/c_ak_ri2_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:00b0902f3613ce8b579eb266ce21ff737c0f1ccb064e5fa180bbb3555cf21d92
|
3 |
+
size 131214
|
data/audio/swarams/c_ak_ri3.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:c99ed885d02e23a14eacba1560318fd0f439d7cff3d970286c0e8f72472bf07a
|
3 |
+
size 193990
|
data/audio/swarams/c_ak_ri3_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:7f4542da10e06347348d86b4565cd48861504fc0fd0f6d6706c6946d60d7297f
|
3 |
+
size 189574
|
data/audio/swarams/c_ak_sa.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:27155e8166ae8102e69af485182130fa01572377c9b9131e81ee54bcf3f54e7d
|
3 |
+
size 208198
|
data/audio/swarams/c_ak_sa_higher.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0ef20076f09cee0481c852ac517247b0159177973a05baac1030ccc923b1ac56
|
3 |
+
size 130560
|
data/audio/swarams/c_ak_silence.mp3
ADDED
Binary file (41.2 kB). View file
|
|
data/audio/swarams/c_ak_tanpura.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:cbb267917b6a5f51bd03856bb8e47ddf6fb8852dcbccb7b8bb8387938dcb9a22
|
3 |
+
size 240817
|
data/audio/swarams/c_ak_tanpura_ma1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:09c32116f9aa65d69a9e2ef4a2a7d9883d8b208ba958ab761e2124e6cecc71bd
|
3 |
+
size 236544
|
data/audio/swarams/c_ak_tanpura_ma2.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:8594d15d418d1ab7ff452ea79fdd721725fbc425c38ea683966e0b0bd6e53b0e
|
3 |
+
size 265056
|
data/audio/swarams/c_sw_da1.mp3
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:1142a4c534f4df1249b6aacefdc5285c2e9db8e46842ae5160658462c9e9c7ed
|
3 |
+
size 144530
|