mseep-txtai 9.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. mseep_txtai-9.1.1.dist-info/METADATA +262 -0
  2. mseep_txtai-9.1.1.dist-info/RECORD +251 -0
  3. mseep_txtai-9.1.1.dist-info/WHEEL +5 -0
  4. mseep_txtai-9.1.1.dist-info/licenses/LICENSE +190 -0
  5. mseep_txtai-9.1.1.dist-info/top_level.txt +1 -0
  6. txtai/__init__.py +16 -0
  7. txtai/agent/__init__.py +12 -0
  8. txtai/agent/base.py +54 -0
  9. txtai/agent/factory.py +39 -0
  10. txtai/agent/model.py +107 -0
  11. txtai/agent/placeholder.py +16 -0
  12. txtai/agent/tool/__init__.py +7 -0
  13. txtai/agent/tool/embeddings.py +69 -0
  14. txtai/agent/tool/factory.py +130 -0
  15. txtai/agent/tool/function.py +49 -0
  16. txtai/ann/__init__.py +7 -0
  17. txtai/ann/base.py +153 -0
  18. txtai/ann/dense/__init__.py +11 -0
  19. txtai/ann/dense/annoy.py +72 -0
  20. txtai/ann/dense/factory.py +76 -0
  21. txtai/ann/dense/faiss.py +233 -0
  22. txtai/ann/dense/hnsw.py +104 -0
  23. txtai/ann/dense/numpy.py +164 -0
  24. txtai/ann/dense/pgvector.py +323 -0
  25. txtai/ann/dense/sqlite.py +303 -0
  26. txtai/ann/dense/torch.py +38 -0
  27. txtai/ann/sparse/__init__.py +7 -0
  28. txtai/ann/sparse/factory.py +61 -0
  29. txtai/ann/sparse/ivfsparse.py +377 -0
  30. txtai/ann/sparse/pgsparse.py +56 -0
  31. txtai/api/__init__.py +18 -0
  32. txtai/api/application.py +134 -0
  33. txtai/api/authorization.py +53 -0
  34. txtai/api/base.py +159 -0
  35. txtai/api/cluster.py +295 -0
  36. txtai/api/extension.py +19 -0
  37. txtai/api/factory.py +40 -0
  38. txtai/api/responses/__init__.py +7 -0
  39. txtai/api/responses/factory.py +30 -0
  40. txtai/api/responses/json.py +56 -0
  41. txtai/api/responses/messagepack.py +51 -0
  42. txtai/api/route.py +41 -0
  43. txtai/api/routers/__init__.py +25 -0
  44. txtai/api/routers/agent.py +38 -0
  45. txtai/api/routers/caption.py +42 -0
  46. txtai/api/routers/embeddings.py +280 -0
  47. txtai/api/routers/entity.py +42 -0
  48. txtai/api/routers/extractor.py +28 -0
  49. txtai/api/routers/labels.py +47 -0
  50. txtai/api/routers/llm.py +61 -0
  51. txtai/api/routers/objects.py +42 -0
  52. txtai/api/routers/openai.py +191 -0
  53. txtai/api/routers/rag.py +61 -0
  54. txtai/api/routers/reranker.py +46 -0
  55. txtai/api/routers/segmentation.py +42 -0
  56. txtai/api/routers/similarity.py +48 -0
  57. txtai/api/routers/summary.py +46 -0
  58. txtai/api/routers/tabular.py +42 -0
  59. txtai/api/routers/textractor.py +42 -0
  60. txtai/api/routers/texttospeech.py +33 -0
  61. txtai/api/routers/transcription.py +42 -0
  62. txtai/api/routers/translation.py +46 -0
  63. txtai/api/routers/upload.py +36 -0
  64. txtai/api/routers/workflow.py +28 -0
  65. txtai/app/__init__.py +5 -0
  66. txtai/app/base.py +821 -0
  67. txtai/archive/__init__.py +9 -0
  68. txtai/archive/base.py +104 -0
  69. txtai/archive/compress.py +51 -0
  70. txtai/archive/factory.py +25 -0
  71. txtai/archive/tar.py +49 -0
  72. txtai/archive/zip.py +35 -0
  73. txtai/cloud/__init__.py +8 -0
  74. txtai/cloud/base.py +106 -0
  75. txtai/cloud/factory.py +70 -0
  76. txtai/cloud/hub.py +101 -0
  77. txtai/cloud/storage.py +125 -0
  78. txtai/console/__init__.py +5 -0
  79. txtai/console/__main__.py +22 -0
  80. txtai/console/base.py +264 -0
  81. txtai/data/__init__.py +10 -0
  82. txtai/data/base.py +138 -0
  83. txtai/data/labels.py +42 -0
  84. txtai/data/questions.py +135 -0
  85. txtai/data/sequences.py +48 -0
  86. txtai/data/texts.py +68 -0
  87. txtai/data/tokens.py +28 -0
  88. txtai/database/__init__.py +14 -0
  89. txtai/database/base.py +342 -0
  90. txtai/database/client.py +227 -0
  91. txtai/database/duckdb.py +150 -0
  92. txtai/database/embedded.py +76 -0
  93. txtai/database/encoder/__init__.py +8 -0
  94. txtai/database/encoder/base.py +37 -0
  95. txtai/database/encoder/factory.py +56 -0
  96. txtai/database/encoder/image.py +43 -0
  97. txtai/database/encoder/serialize.py +28 -0
  98. txtai/database/factory.py +77 -0
  99. txtai/database/rdbms.py +569 -0
  100. txtai/database/schema/__init__.py +6 -0
  101. txtai/database/schema/orm.py +99 -0
  102. txtai/database/schema/statement.py +98 -0
  103. txtai/database/sql/__init__.py +8 -0
  104. txtai/database/sql/aggregate.py +178 -0
  105. txtai/database/sql/base.py +189 -0
  106. txtai/database/sql/expression.py +404 -0
  107. txtai/database/sql/token.py +342 -0
  108. txtai/database/sqlite.py +57 -0
  109. txtai/embeddings/__init__.py +7 -0
  110. txtai/embeddings/base.py +1107 -0
  111. txtai/embeddings/index/__init__.py +14 -0
  112. txtai/embeddings/index/action.py +15 -0
  113. txtai/embeddings/index/autoid.py +92 -0
  114. txtai/embeddings/index/configuration.py +71 -0
  115. txtai/embeddings/index/documents.py +86 -0
  116. txtai/embeddings/index/functions.py +155 -0
  117. txtai/embeddings/index/indexes.py +199 -0
  118. txtai/embeddings/index/indexids.py +60 -0
  119. txtai/embeddings/index/reducer.py +104 -0
  120. txtai/embeddings/index/stream.py +67 -0
  121. txtai/embeddings/index/transform.py +205 -0
  122. txtai/embeddings/search/__init__.py +11 -0
  123. txtai/embeddings/search/base.py +344 -0
  124. txtai/embeddings/search/errors.py +9 -0
  125. txtai/embeddings/search/explain.py +120 -0
  126. txtai/embeddings/search/ids.py +61 -0
  127. txtai/embeddings/search/query.py +69 -0
  128. txtai/embeddings/search/scan.py +196 -0
  129. txtai/embeddings/search/terms.py +46 -0
  130. txtai/graph/__init__.py +10 -0
  131. txtai/graph/base.py +769 -0
  132. txtai/graph/factory.py +61 -0
  133. txtai/graph/networkx.py +275 -0
  134. txtai/graph/query.py +181 -0
  135. txtai/graph/rdbms.py +113 -0
  136. txtai/graph/topics.py +166 -0
  137. txtai/models/__init__.py +9 -0
  138. txtai/models/models.py +268 -0
  139. txtai/models/onnx.py +133 -0
  140. txtai/models/pooling/__init__.py +9 -0
  141. txtai/models/pooling/base.py +141 -0
  142. txtai/models/pooling/cls.py +28 -0
  143. txtai/models/pooling/factory.py +144 -0
  144. txtai/models/pooling/late.py +173 -0
  145. txtai/models/pooling/mean.py +33 -0
  146. txtai/models/pooling/muvera.py +164 -0
  147. txtai/models/registry.py +37 -0
  148. txtai/models/tokendetection.py +122 -0
  149. txtai/pipeline/__init__.py +17 -0
  150. txtai/pipeline/audio/__init__.py +11 -0
  151. txtai/pipeline/audio/audiomixer.py +58 -0
  152. txtai/pipeline/audio/audiostream.py +94 -0
  153. txtai/pipeline/audio/microphone.py +244 -0
  154. txtai/pipeline/audio/signal.py +186 -0
  155. txtai/pipeline/audio/texttoaudio.py +60 -0
  156. txtai/pipeline/audio/texttospeech.py +553 -0
  157. txtai/pipeline/audio/transcription.py +212 -0
  158. txtai/pipeline/base.py +23 -0
  159. txtai/pipeline/data/__init__.py +10 -0
  160. txtai/pipeline/data/filetohtml.py +206 -0
  161. txtai/pipeline/data/htmltomd.py +414 -0
  162. txtai/pipeline/data/segmentation.py +178 -0
  163. txtai/pipeline/data/tabular.py +155 -0
  164. txtai/pipeline/data/textractor.py +139 -0
  165. txtai/pipeline/data/tokenizer.py +112 -0
  166. txtai/pipeline/factory.py +77 -0
  167. txtai/pipeline/hfmodel.py +111 -0
  168. txtai/pipeline/hfpipeline.py +96 -0
  169. txtai/pipeline/image/__init__.py +7 -0
  170. txtai/pipeline/image/caption.py +55 -0
  171. txtai/pipeline/image/imagehash.py +90 -0
  172. txtai/pipeline/image/objects.py +80 -0
  173. txtai/pipeline/llm/__init__.py +11 -0
  174. txtai/pipeline/llm/factory.py +86 -0
  175. txtai/pipeline/llm/generation.py +173 -0
  176. txtai/pipeline/llm/huggingface.py +218 -0
  177. txtai/pipeline/llm/litellm.py +90 -0
  178. txtai/pipeline/llm/llama.py +152 -0
  179. txtai/pipeline/llm/llm.py +75 -0
  180. txtai/pipeline/llm/rag.py +477 -0
  181. txtai/pipeline/nop.py +14 -0
  182. txtai/pipeline/tensors.py +52 -0
  183. txtai/pipeline/text/__init__.py +13 -0
  184. txtai/pipeline/text/crossencoder.py +70 -0
  185. txtai/pipeline/text/entity.py +140 -0
  186. txtai/pipeline/text/labels.py +137 -0
  187. txtai/pipeline/text/lateencoder.py +103 -0
  188. txtai/pipeline/text/questions.py +48 -0
  189. txtai/pipeline/text/reranker.py +57 -0
  190. txtai/pipeline/text/similarity.py +83 -0
  191. txtai/pipeline/text/summary.py +98 -0
  192. txtai/pipeline/text/translation.py +298 -0
  193. txtai/pipeline/train/__init__.py +7 -0
  194. txtai/pipeline/train/hfonnx.py +196 -0
  195. txtai/pipeline/train/hftrainer.py +398 -0
  196. txtai/pipeline/train/mlonnx.py +63 -0
  197. txtai/scoring/__init__.py +12 -0
  198. txtai/scoring/base.py +188 -0
  199. txtai/scoring/bm25.py +29 -0
  200. txtai/scoring/factory.py +95 -0
  201. txtai/scoring/pgtext.py +181 -0
  202. txtai/scoring/sif.py +32 -0
  203. txtai/scoring/sparse.py +218 -0
  204. txtai/scoring/terms.py +499 -0
  205. txtai/scoring/tfidf.py +358 -0
  206. txtai/serialize/__init__.py +10 -0
  207. txtai/serialize/base.py +85 -0
  208. txtai/serialize/errors.py +9 -0
  209. txtai/serialize/factory.py +29 -0
  210. txtai/serialize/messagepack.py +42 -0
  211. txtai/serialize/pickle.py +98 -0
  212. txtai/serialize/serializer.py +46 -0
  213. txtai/util/__init__.py +7 -0
  214. txtai/util/resolver.py +32 -0
  215. txtai/util/sparsearray.py +62 -0
  216. txtai/util/template.py +16 -0
  217. txtai/vectors/__init__.py +8 -0
  218. txtai/vectors/base.py +476 -0
  219. txtai/vectors/dense/__init__.py +12 -0
  220. txtai/vectors/dense/external.py +55 -0
  221. txtai/vectors/dense/factory.py +121 -0
  222. txtai/vectors/dense/huggingface.py +44 -0
  223. txtai/vectors/dense/litellm.py +86 -0
  224. txtai/vectors/dense/llama.py +84 -0
  225. txtai/vectors/dense/m2v.py +67 -0
  226. txtai/vectors/dense/sbert.py +92 -0
  227. txtai/vectors/dense/words.py +211 -0
  228. txtai/vectors/recovery.py +57 -0
  229. txtai/vectors/sparse/__init__.py +7 -0
  230. txtai/vectors/sparse/base.py +90 -0
  231. txtai/vectors/sparse/factory.py +55 -0
  232. txtai/vectors/sparse/sbert.py +34 -0
  233. txtai/version.py +6 -0
  234. txtai/workflow/__init__.py +8 -0
  235. txtai/workflow/base.py +184 -0
  236. txtai/workflow/execute.py +99 -0
  237. txtai/workflow/factory.py +42 -0
  238. txtai/workflow/task/__init__.py +18 -0
  239. txtai/workflow/task/base.py +490 -0
  240. txtai/workflow/task/console.py +24 -0
  241. txtai/workflow/task/export.py +64 -0
  242. txtai/workflow/task/factory.py +89 -0
  243. txtai/workflow/task/file.py +28 -0
  244. txtai/workflow/task/image.py +36 -0
  245. txtai/workflow/task/retrieve.py +61 -0
  246. txtai/workflow/task/service.py +102 -0
  247. txtai/workflow/task/storage.py +110 -0
  248. txtai/workflow/task/stream.py +33 -0
  249. txtai/workflow/task/template.py +116 -0
  250. txtai/workflow/task/url.py +20 -0
  251. txtai/workflow/task/workflow.py +14 -0
@@ -0,0 +1,186 @@
1
+ """
2
+ Signal module
3
+ """
4
+
5
+ import numpy as np
6
+
7
+ # Conditional import
8
+ try:
9
+ from scipy import signal
10
+ from scipy.fft import rfft, rfftfreq
11
+
12
+ SCIPY = True
13
+ except ImportError:
14
+ SCIPY = False
15
+
16
+
17
+ class Signal:
18
+ """
19
+ Utility methods for audio signal processing.
20
+ """
21
+
22
+ @staticmethod
23
+ def mono(audio):
24
+ """
25
+ Convert stereo to mono audio.
26
+
27
+ Args:
28
+ audio: audio data
29
+
30
+ Returns:
31
+ audio data with a single channel
32
+ """
33
+
34
+ return audio.mean(axis=1) if len(audio.shape) > 1 else audio
35
+
36
+ @staticmethod
37
+ def resample(audio, rate, target):
38
+ """
39
+ Resample audio if the sample rate doesn't match the target sample rate.
40
+
41
+ Args:
42
+ audio: audio data
43
+ rate: current sample rate
44
+ target: target sample rate
45
+
46
+ Returns:
47
+ audio resampled if necessary or original audio
48
+ """
49
+
50
+ if rate != target:
51
+ # Transpose audio
52
+ audio = audio.T
53
+
54
+ # Resample audio and tranpose back
55
+ samples = round(len(audio) * float(target) / rate)
56
+ audio = signal.resample(audio, samples).T
57
+
58
+ return audio
59
+
60
+ @staticmethod
61
+ def float32(audio):
62
+ """
63
+ Converts an input NumPy array with 16-bit ints to 32-bit floats.
64
+
65
+ Args:
66
+ audio: input audio array as 16-bit ints
67
+
68
+ Returns:
69
+ audio array as 32-bit floats
70
+ """
71
+
72
+ i = np.iinfo(audio.dtype)
73
+ abs_max = 2 ** (i.bits - 1)
74
+ offset = i.min + abs_max
75
+ return (audio.astype(np.float32) - offset) / abs_max
76
+
77
+ @staticmethod
78
+ def int16(audio):
79
+ """
80
+ Converts an input NumPy array with 32-bit floats to 16-bit ints.
81
+
82
+ Args:
83
+ audio: input audio array as 32-bit floats
84
+
85
+ Returns:
86
+ audio array as 16-bit ints
87
+ """
88
+
89
+ i = np.iinfo(np.int16)
90
+ absmax = 2 ** (i.bits - 1)
91
+ offset = i.min + absmax
92
+ return (audio * absmax + offset).clip(i.min, i.max).astype(np.int16)
93
+
94
+ @staticmethod
95
+ def mix(audio1, audio2, scale1=1, scale2=1):
96
+ """
97
+ Mixes audio1 and audio 2 into a single output audio segment.
98
+
99
+ Args:
100
+ audio1: audio segment 1
101
+ audio2: audio segment 2
102
+ scale1: scale factor for audio segment 1
103
+ scale2: scale factor for audio segment 2
104
+ """
105
+
106
+ # Reshape audio, as necessary
107
+ audio1 = audio1.reshape(1, -1) if len(audio1.shape) <= 1 else audio1
108
+ audio2 = audio2.reshape(1, -1) if len(audio2.shape) <= 1 else audio2
109
+
110
+ # Scale audio
111
+ audio1 = audio1 * scale1
112
+ audio2 = audio2 * scale2
113
+
114
+ # Make audio files the same length
115
+ large, small = (audio1, audio2) if audio1.shape[1] > audio2.shape[1] else (audio2, audio1)
116
+ small = np.tile(small, (large.shape[1] // small.shape[1]) + 1).take(axis=1, indices=range(0, large.shape[1]))
117
+
118
+ # Mix audio together
119
+ return small + large
120
+
121
+ @staticmethod
122
+ def energy(audio, rate):
123
+ """
124
+ Calculates the signal energy for the input audio. Energy is defined as:
125
+
126
+ Energy = 2 * Signal Amplitude
127
+
128
+ Args:
129
+ audio: audio data
130
+ rate: sample rate
131
+
132
+ Returns:
133
+ {frequency: energy at that frequency}
134
+ """
135
+
136
+ # Calculate signal frequency
137
+ frequency = rfftfreq(len(audio), 1.0 / rate)
138
+ frequency = frequency[1:]
139
+
140
+ # Calculate signal energy using amplitude
141
+ energy = np.abs(rfft(audio))
142
+ energy = energy[1:]
143
+ energy = energy**2
144
+
145
+ # Get energy for each frequency
146
+ energyfreq = {}
147
+ for x, freq in enumerate(frequency):
148
+ if abs(freq) not in energyfreq:
149
+ energyfreq[abs(freq)] = energy[x] * 2
150
+
151
+ return energyfreq
152
+
153
+ @staticmethod
154
+ def trim(audio, rate, threshold=1, leading=True, trailing=True):
155
+ """
156
+ Removes leading and trailing silence from audio data.
157
+
158
+ Args:
159
+ audio: audio data
160
+ rate: sample rate
161
+ threshold: energy below this level will be considered silence, defaults to 1.0
162
+ leading: trim leading silence, defaults to True
163
+ trailing: trim trailing silence, defauls to True
164
+
165
+ Returns:
166
+ audio with silence removed
167
+ """
168
+
169
+ # Process in 20ms chunks
170
+ n, offset = int(rate * (20 / 1000.0) * 2), 0
171
+
172
+ chunks = []
173
+ while offset + n <= len(audio):
174
+ # Calculate energy for chunk and detection result
175
+ chunk = audio[offset : offset + n]
176
+ energyfreq = Signal.energy(chunk, rate)
177
+ chunks.append((chunk, sum(energyfreq.values()) >= threshold))
178
+
179
+ offset += n
180
+
181
+ # Find first and last active chunks
182
+ start = next((i for i, (_, active) in enumerate(chunks) if active), 0) if leading else 0
183
+ end = (len(chunks) - next((i for i, (_, active) in enumerate(chunks[::-1]) if active), 0)) if trailing else len(chunks)
184
+
185
+ # Concatenate active audio
186
+ return np.concatenate([chunk for chunk, _ in chunks[start:end]])
@@ -0,0 +1,60 @@
1
+ """
2
+ TextToAudio module
3
+ """
4
+
5
+ from ..hfpipeline import HFPipeline
6
+ from .signal import Signal, SCIPY
7
+
8
+
9
+ class TextToAudio(HFPipeline):
10
+ """
11
+ Generates audio from text.
12
+ """
13
+
14
+ def __init__(self, path=None, quantize=False, gpu=True, model=None, rate=None, **kwargs):
15
+ if not SCIPY:
16
+ raise ImportError('TextToAudio pipeline is not available - install "pipeline" extra to enable.')
17
+
18
+ # Call parent constructor
19
+ super().__init__("text-to-audio", path, quantize, gpu, model, **kwargs)
20
+
21
+ # Target sample rate, defaults to model sample rate
22
+ self.rate = rate
23
+
24
+ def __call__(self, text, maxlength=512):
25
+ """
26
+ Generates audio from text.
27
+
28
+ This method supports text as a string or a list. If the input is a string,
29
+ the return type is a single audio output. If text is a list, the return type is a list.
30
+
31
+ Args:
32
+ text: text|list
33
+ maxlength: maximum audio length to generate
34
+
35
+ Returns:
36
+ list of (audio, sample rate)
37
+ """
38
+
39
+ # Format inputs
40
+ texts = [text] if isinstance(text, str) else text
41
+
42
+ # Run pipeline
43
+ results = [self.convert(x) for x in self.pipeline(texts, forward_params={"max_new_tokens": maxlength})]
44
+
45
+ # Extract results
46
+ return results[0] if isinstance(text, str) else results
47
+
48
+ def convert(self, result):
49
+ """
50
+ Converts audio result to target sample rate for this pipeline, if set.
51
+
52
+ Args:
53
+ result: dict with audio samples and sample rate
54
+
55
+ Returns:
56
+ (audio, sample rate)
57
+ """
58
+
59
+ audio, rate = result["audio"].squeeze(), result["sampling_rate"]
60
+ return (Signal.resample(audio, rate, self.rate), self.rate) if self.rate else (audio, rate)