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.
- mseep_txtai-9.1.1.dist-info/METADATA +262 -0
- mseep_txtai-9.1.1.dist-info/RECORD +251 -0
- mseep_txtai-9.1.1.dist-info/WHEEL +5 -0
- mseep_txtai-9.1.1.dist-info/licenses/LICENSE +190 -0
- mseep_txtai-9.1.1.dist-info/top_level.txt +1 -0
- txtai/__init__.py +16 -0
- txtai/agent/__init__.py +12 -0
- txtai/agent/base.py +54 -0
- txtai/agent/factory.py +39 -0
- txtai/agent/model.py +107 -0
- txtai/agent/placeholder.py +16 -0
- txtai/agent/tool/__init__.py +7 -0
- txtai/agent/tool/embeddings.py +69 -0
- txtai/agent/tool/factory.py +130 -0
- txtai/agent/tool/function.py +49 -0
- txtai/ann/__init__.py +7 -0
- txtai/ann/base.py +153 -0
- txtai/ann/dense/__init__.py +11 -0
- txtai/ann/dense/annoy.py +72 -0
- txtai/ann/dense/factory.py +76 -0
- txtai/ann/dense/faiss.py +233 -0
- txtai/ann/dense/hnsw.py +104 -0
- txtai/ann/dense/numpy.py +164 -0
- txtai/ann/dense/pgvector.py +323 -0
- txtai/ann/dense/sqlite.py +303 -0
- txtai/ann/dense/torch.py +38 -0
- txtai/ann/sparse/__init__.py +7 -0
- txtai/ann/sparse/factory.py +61 -0
- txtai/ann/sparse/ivfsparse.py +377 -0
- txtai/ann/sparse/pgsparse.py +56 -0
- txtai/api/__init__.py +18 -0
- txtai/api/application.py +134 -0
- txtai/api/authorization.py +53 -0
- txtai/api/base.py +159 -0
- txtai/api/cluster.py +295 -0
- txtai/api/extension.py +19 -0
- txtai/api/factory.py +40 -0
- txtai/api/responses/__init__.py +7 -0
- txtai/api/responses/factory.py +30 -0
- txtai/api/responses/json.py +56 -0
- txtai/api/responses/messagepack.py +51 -0
- txtai/api/route.py +41 -0
- txtai/api/routers/__init__.py +25 -0
- txtai/api/routers/agent.py +38 -0
- txtai/api/routers/caption.py +42 -0
- txtai/api/routers/embeddings.py +280 -0
- txtai/api/routers/entity.py +42 -0
- txtai/api/routers/extractor.py +28 -0
- txtai/api/routers/labels.py +47 -0
- txtai/api/routers/llm.py +61 -0
- txtai/api/routers/objects.py +42 -0
- txtai/api/routers/openai.py +191 -0
- txtai/api/routers/rag.py +61 -0
- txtai/api/routers/reranker.py +46 -0
- txtai/api/routers/segmentation.py +42 -0
- txtai/api/routers/similarity.py +48 -0
- txtai/api/routers/summary.py +46 -0
- txtai/api/routers/tabular.py +42 -0
- txtai/api/routers/textractor.py +42 -0
- txtai/api/routers/texttospeech.py +33 -0
- txtai/api/routers/transcription.py +42 -0
- txtai/api/routers/translation.py +46 -0
- txtai/api/routers/upload.py +36 -0
- txtai/api/routers/workflow.py +28 -0
- txtai/app/__init__.py +5 -0
- txtai/app/base.py +821 -0
- txtai/archive/__init__.py +9 -0
- txtai/archive/base.py +104 -0
- txtai/archive/compress.py +51 -0
- txtai/archive/factory.py +25 -0
- txtai/archive/tar.py +49 -0
- txtai/archive/zip.py +35 -0
- txtai/cloud/__init__.py +8 -0
- txtai/cloud/base.py +106 -0
- txtai/cloud/factory.py +70 -0
- txtai/cloud/hub.py +101 -0
- txtai/cloud/storage.py +125 -0
- txtai/console/__init__.py +5 -0
- txtai/console/__main__.py +22 -0
- txtai/console/base.py +264 -0
- txtai/data/__init__.py +10 -0
- txtai/data/base.py +138 -0
- txtai/data/labels.py +42 -0
- txtai/data/questions.py +135 -0
- txtai/data/sequences.py +48 -0
- txtai/data/texts.py +68 -0
- txtai/data/tokens.py +28 -0
- txtai/database/__init__.py +14 -0
- txtai/database/base.py +342 -0
- txtai/database/client.py +227 -0
- txtai/database/duckdb.py +150 -0
- txtai/database/embedded.py +76 -0
- txtai/database/encoder/__init__.py +8 -0
- txtai/database/encoder/base.py +37 -0
- txtai/database/encoder/factory.py +56 -0
- txtai/database/encoder/image.py +43 -0
- txtai/database/encoder/serialize.py +28 -0
- txtai/database/factory.py +77 -0
- txtai/database/rdbms.py +569 -0
- txtai/database/schema/__init__.py +6 -0
- txtai/database/schema/orm.py +99 -0
- txtai/database/schema/statement.py +98 -0
- txtai/database/sql/__init__.py +8 -0
- txtai/database/sql/aggregate.py +178 -0
- txtai/database/sql/base.py +189 -0
- txtai/database/sql/expression.py +404 -0
- txtai/database/sql/token.py +342 -0
- txtai/database/sqlite.py +57 -0
- txtai/embeddings/__init__.py +7 -0
- txtai/embeddings/base.py +1107 -0
- txtai/embeddings/index/__init__.py +14 -0
- txtai/embeddings/index/action.py +15 -0
- txtai/embeddings/index/autoid.py +92 -0
- txtai/embeddings/index/configuration.py +71 -0
- txtai/embeddings/index/documents.py +86 -0
- txtai/embeddings/index/functions.py +155 -0
- txtai/embeddings/index/indexes.py +199 -0
- txtai/embeddings/index/indexids.py +60 -0
- txtai/embeddings/index/reducer.py +104 -0
- txtai/embeddings/index/stream.py +67 -0
- txtai/embeddings/index/transform.py +205 -0
- txtai/embeddings/search/__init__.py +11 -0
- txtai/embeddings/search/base.py +344 -0
- txtai/embeddings/search/errors.py +9 -0
- txtai/embeddings/search/explain.py +120 -0
- txtai/embeddings/search/ids.py +61 -0
- txtai/embeddings/search/query.py +69 -0
- txtai/embeddings/search/scan.py +196 -0
- txtai/embeddings/search/terms.py +46 -0
- txtai/graph/__init__.py +10 -0
- txtai/graph/base.py +769 -0
- txtai/graph/factory.py +61 -0
- txtai/graph/networkx.py +275 -0
- txtai/graph/query.py +181 -0
- txtai/graph/rdbms.py +113 -0
- txtai/graph/topics.py +166 -0
- txtai/models/__init__.py +9 -0
- txtai/models/models.py +268 -0
- txtai/models/onnx.py +133 -0
- txtai/models/pooling/__init__.py +9 -0
- txtai/models/pooling/base.py +141 -0
- txtai/models/pooling/cls.py +28 -0
- txtai/models/pooling/factory.py +144 -0
- txtai/models/pooling/late.py +173 -0
- txtai/models/pooling/mean.py +33 -0
- txtai/models/pooling/muvera.py +164 -0
- txtai/models/registry.py +37 -0
- txtai/models/tokendetection.py +122 -0
- txtai/pipeline/__init__.py +17 -0
- txtai/pipeline/audio/__init__.py +11 -0
- txtai/pipeline/audio/audiomixer.py +58 -0
- txtai/pipeline/audio/audiostream.py +94 -0
- txtai/pipeline/audio/microphone.py +244 -0
- txtai/pipeline/audio/signal.py +186 -0
- txtai/pipeline/audio/texttoaudio.py +60 -0
- txtai/pipeline/audio/texttospeech.py +553 -0
- txtai/pipeline/audio/transcription.py +212 -0
- txtai/pipeline/base.py +23 -0
- txtai/pipeline/data/__init__.py +10 -0
- txtai/pipeline/data/filetohtml.py +206 -0
- txtai/pipeline/data/htmltomd.py +414 -0
- txtai/pipeline/data/segmentation.py +178 -0
- txtai/pipeline/data/tabular.py +155 -0
- txtai/pipeline/data/textractor.py +139 -0
- txtai/pipeline/data/tokenizer.py +112 -0
- txtai/pipeline/factory.py +77 -0
- txtai/pipeline/hfmodel.py +111 -0
- txtai/pipeline/hfpipeline.py +96 -0
- txtai/pipeline/image/__init__.py +7 -0
- txtai/pipeline/image/caption.py +55 -0
- txtai/pipeline/image/imagehash.py +90 -0
- txtai/pipeline/image/objects.py +80 -0
- txtai/pipeline/llm/__init__.py +11 -0
- txtai/pipeline/llm/factory.py +86 -0
- txtai/pipeline/llm/generation.py +173 -0
- txtai/pipeline/llm/huggingface.py +218 -0
- txtai/pipeline/llm/litellm.py +90 -0
- txtai/pipeline/llm/llama.py +152 -0
- txtai/pipeline/llm/llm.py +75 -0
- txtai/pipeline/llm/rag.py +477 -0
- txtai/pipeline/nop.py +14 -0
- txtai/pipeline/tensors.py +52 -0
- txtai/pipeline/text/__init__.py +13 -0
- txtai/pipeline/text/crossencoder.py +70 -0
- txtai/pipeline/text/entity.py +140 -0
- txtai/pipeline/text/labels.py +137 -0
- txtai/pipeline/text/lateencoder.py +103 -0
- txtai/pipeline/text/questions.py +48 -0
- txtai/pipeline/text/reranker.py +57 -0
- txtai/pipeline/text/similarity.py +83 -0
- txtai/pipeline/text/summary.py +98 -0
- txtai/pipeline/text/translation.py +298 -0
- txtai/pipeline/train/__init__.py +7 -0
- txtai/pipeline/train/hfonnx.py +196 -0
- txtai/pipeline/train/hftrainer.py +398 -0
- txtai/pipeline/train/mlonnx.py +63 -0
- txtai/scoring/__init__.py +12 -0
- txtai/scoring/base.py +188 -0
- txtai/scoring/bm25.py +29 -0
- txtai/scoring/factory.py +95 -0
- txtai/scoring/pgtext.py +181 -0
- txtai/scoring/sif.py +32 -0
- txtai/scoring/sparse.py +218 -0
- txtai/scoring/terms.py +499 -0
- txtai/scoring/tfidf.py +358 -0
- txtai/serialize/__init__.py +10 -0
- txtai/serialize/base.py +85 -0
- txtai/serialize/errors.py +9 -0
- txtai/serialize/factory.py +29 -0
- txtai/serialize/messagepack.py +42 -0
- txtai/serialize/pickle.py +98 -0
- txtai/serialize/serializer.py +46 -0
- txtai/util/__init__.py +7 -0
- txtai/util/resolver.py +32 -0
- txtai/util/sparsearray.py +62 -0
- txtai/util/template.py +16 -0
- txtai/vectors/__init__.py +8 -0
- txtai/vectors/base.py +476 -0
- txtai/vectors/dense/__init__.py +12 -0
- txtai/vectors/dense/external.py +55 -0
- txtai/vectors/dense/factory.py +121 -0
- txtai/vectors/dense/huggingface.py +44 -0
- txtai/vectors/dense/litellm.py +86 -0
- txtai/vectors/dense/llama.py +84 -0
- txtai/vectors/dense/m2v.py +67 -0
- txtai/vectors/dense/sbert.py +92 -0
- txtai/vectors/dense/words.py +211 -0
- txtai/vectors/recovery.py +57 -0
- txtai/vectors/sparse/__init__.py +7 -0
- txtai/vectors/sparse/base.py +90 -0
- txtai/vectors/sparse/factory.py +55 -0
- txtai/vectors/sparse/sbert.py +34 -0
- txtai/version.py +6 -0
- txtai/workflow/__init__.py +8 -0
- txtai/workflow/base.py +184 -0
- txtai/workflow/execute.py +99 -0
- txtai/workflow/factory.py +42 -0
- txtai/workflow/task/__init__.py +18 -0
- txtai/workflow/task/base.py +490 -0
- txtai/workflow/task/console.py +24 -0
- txtai/workflow/task/export.py +64 -0
- txtai/workflow/task/factory.py +89 -0
- txtai/workflow/task/file.py +28 -0
- txtai/workflow/task/image.py +36 -0
- txtai/workflow/task/retrieve.py +61 -0
- txtai/workflow/task/service.py +102 -0
- txtai/workflow/task/storage.py +110 -0
- txtai/workflow/task/stream.py +33 -0
- txtai/workflow/task/template.py +116 -0
- txtai/workflow/task/url.py +20 -0
- 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)
|