lattifai 1.0.1__py3-none-any.whl → 1.0.2__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.
@@ -30,28 +30,42 @@ class Lattice1Worker:
30
30
  sess_options.execution_mode = ort.ExecutionMode.ORT_PARALLEL
31
31
  sess_options.add_session_config_entry("session.intra_op.allow_spinning", "0")
32
32
 
33
+ acoustic_model_path = f"{model_path}/acoustic_opt.onnx"
34
+
33
35
  providers = []
34
- if device.startswith("cuda") and ort.get_all_providers().count("CUDAExecutionProvider") > 0:
36
+ all_providers = ort.get_all_providers()
37
+ if device.startswith("cuda") and all_providers.count("CUDAExecutionProvider") > 0:
35
38
  providers.append("CUDAExecutionProvider")
36
- elif device.startswith("mps") and ort.get_all_providers().count("MPSExecutionProvider") > 0:
39
+ if "MPSExecutionProvider" in all_providers:
37
40
  providers.append("MPSExecutionProvider")
41
+ if "CoreMLExecutionProvider" in all_providers:
42
+ if "quant" in acoustic_model_path:
43
+ # NOTE: CPUExecutionProvider is faster for quantized models
44
+ pass
45
+ else:
46
+ providers.append("CoreMLExecutionProvider")
38
47
 
39
48
  try:
40
49
  self.acoustic_ort = ort.InferenceSession(
41
- f"{model_path}/acoustic_opt.onnx",
50
+ acoustic_model_path,
42
51
  sess_options,
43
- providers=providers + ["CPUExecutionProvider", "CoreMLExecutionProvider"],
52
+ providers=providers + ["CPUExecutionProvider"],
44
53
  )
45
54
  except Exception as e:
46
55
  raise ModelLoadError(f"acoustic model from {model_path}", original_error=e)
47
56
 
48
- try:
49
- config = FbankConfig(num_mel_bins=80, device=device, snip_edges=False)
50
- config_dict = config.to_dict()
51
- config_dict.pop("device")
52
- self.extractor = Wav2LogFilterBank(**config_dict).to(device).eval()
53
- except Exception as e:
54
- raise ModelLoadError(f"feature extractor for device {device}", original_error=e)
57
+ # get input_names
58
+ input_names = [inp.name for inp in self.acoustic_ort.get_inputs()]
59
+ if "audios" not in input_names:
60
+ try:
61
+ config = FbankConfig(num_mel_bins=80, device=device, snip_edges=False)
62
+ config_dict = config.to_dict()
63
+ config_dict.pop("device")
64
+ self.extractor = Wav2LogFilterBank(**config_dict).to(device).eval()
65
+ except Exception as e:
66
+ raise ModelLoadError(f"feature extractor for device {device}", original_error=e)
67
+ else:
68
+ self.extractor = None # ONNX model includes feature extractor
55
69
 
56
70
  self.device = torch.device(device)
57
71
  self.timings = defaultdict(lambda: 0.0)
@@ -63,28 +77,57 @@ class Lattice1Worker:
63
77
  @torch.inference_mode()
64
78
  def emission(self, audio: torch.Tensor) -> torch.Tensor:
65
79
  _start = time.time()
66
- # audio -> features -> emission
67
- features = self.extractor(audio) # (1, T, D)
68
- if features.shape[1] > 6000:
69
- features_list = torch.split(features, 6000, dim=1)
70
- emissions = []
71
- for features in features_list:
80
+ if self.extractor is not None:
81
+ # audio -> features -> emission
82
+ features = self.extractor(audio) # (1, T, D)
83
+ if features.shape[1] > 6000:
84
+ features_list = torch.split(features, 6000, dim=1)
85
+ emissions = []
86
+ for features in features_list:
87
+ ort_inputs = {
88
+ "features": features.cpu().numpy(),
89
+ "feature_lengths": np.array([features.size(1)], dtype=np.int64),
90
+ }
91
+ emission = self.acoustic_ort.run(None, ort_inputs)[0] # (1, T, vocab_size) numpy
92
+ emissions.append(emission)
93
+ emission = torch.cat(
94
+ [torch.from_numpy(emission).to(self.device) for emission in emissions], dim=1
95
+ ) # (1, T, vocab_size)
96
+ else:
72
97
  ort_inputs = {
73
98
  "features": features.cpu().numpy(),
74
99
  "feature_lengths": np.array([features.size(1)], dtype=np.int64),
75
100
  }
76
101
  emission = self.acoustic_ort.run(None, ort_inputs)[0] # (1, T, vocab_size) numpy
77
- emissions.append(emission)
78
- emission = torch.cat(
79
- [torch.from_numpy(emission).to(self.device) for emission in emissions], dim=1
80
- ) # (1, T, vocab_size)
102
+ emission = torch.from_numpy(emission).to(self.device)
81
103
  else:
82
- ort_inputs = {
83
- "features": features.cpu().numpy(),
84
- "feature_lengths": np.array([features.size(1)], dtype=np.int64),
85
- }
86
- emission = self.acoustic_ort.run(None, ort_inputs)[0] # (1, T, vocab_size) numpy
87
- emission = torch.from_numpy(emission).to(self.device)
104
+ CHUNK_SIZE = 60 * 16000 # 60 seconds
105
+ if audio.shape[1] > CHUNK_SIZE:
106
+ audio_list = torch.split(audio, CHUNK_SIZE, dim=1)
107
+ emissions = []
108
+ for audios in audio_list:
109
+ emission = self.acoustic_ort.run(
110
+ None,
111
+ {
112
+ "audios": audios.cpu().numpy(),
113
+ },
114
+ )[
115
+ 0
116
+ ] # (1, T, vocab_size) numpy
117
+ emissions.append(emission)
118
+ emission = torch.cat(
119
+ [torch.from_numpy(emission).to(self.device) for emission in emissions], dim=1
120
+ ) # (1, T, vocab_size)
121
+ else:
122
+ emission = self.acoustic_ort.run(
123
+ None,
124
+ {
125
+ "audios": audio.cpu().numpy(),
126
+ },
127
+ )[
128
+ 0
129
+ ] # (1, T, vocab_size) numpy
130
+ emission = torch.from_numpy(emission).to(self.device)
88
131
 
89
132
  self.timings["emission"] += time.time() - _start
90
133
  return emission # (1, T, vocab_size) torch
@@ -0,0 +1,140 @@
1
+ """CLI tool to install lai-app (frontend web application)."""
2
+
3
+ import platform
4
+ import subprocess
5
+ import sys
6
+ from pathlib import Path
7
+
8
+
9
+ def check_command_exists(cmd: str) -> bool:
10
+ """Check if a command exists in PATH."""
11
+ try:
12
+ subprocess.run([cmd, "--version"], check=True, capture_output=True, text=True)
13
+ return True
14
+ except (subprocess.CalledProcessError, FileNotFoundError):
15
+ return False
16
+
17
+
18
+ def install_nodejs():
19
+ """Install Node.js based on the operating system."""
20
+ system = platform.system().lower()
21
+
22
+ print("📦 Node.js not found. Installing Node.js...\n")
23
+
24
+ try:
25
+ if system == "darwin": # macOS
26
+ # Check if Homebrew is installed
27
+ if check_command_exists("brew"):
28
+ print("🍺 Using Homebrew to install Node.js...")
29
+ subprocess.run(["brew", "install", "node"], check=True)
30
+ print("✓ Node.js installed via Homebrew\n")
31
+ else:
32
+ print("❌ Homebrew not found.")
33
+ print(" Please install Homebrew first:")
34
+ print(
35
+ ' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
36
+ )
37
+ print("\n Or install Node.js manually from: https://nodejs.org/")
38
+ sys.exit(1)
39
+
40
+ elif system == "linux":
41
+ # Try common package managers
42
+ if check_command_exists("apt"):
43
+ print("🐧 Using apt to install Node.js...")
44
+ subprocess.run(["sudo", "apt", "update"], check=True)
45
+ subprocess.run(["sudo", "apt", "install", "-y", "nodejs", "npm"], check=True)
46
+ print("✓ Node.js installed via apt\n")
47
+ elif check_command_exists("yum"):
48
+ print("🐧 Using yum to install Node.js...")
49
+ subprocess.run(["sudo", "yum", "install", "-y", "nodejs", "npm"], check=True)
50
+ print("✓ Node.js installed via yum\n")
51
+ elif check_command_exists("dnf"):
52
+ print("🐧 Using dnf to install Node.js...")
53
+ subprocess.run(["sudo", "dnf", "install", "-y", "nodejs", "npm"], check=True)
54
+ print("✓ Node.js installed via dnf\n")
55
+ elif check_command_exists("pacman"):
56
+ print("🐧 Using pacman to install Node.js...")
57
+ subprocess.run(["sudo", "pacman", "-S", "--noconfirm", "nodejs", "npm"], check=True)
58
+ print("✓ Node.js installed via pacman\n")
59
+ else:
60
+ print("❌ No supported package manager found (apt/yum/dnf/pacman).")
61
+ print(" Please install Node.js manually from: https://nodejs.org/")
62
+ sys.exit(1)
63
+
64
+ elif system == "windows":
65
+ print("❌ Automatic installation on Windows is not supported.")
66
+ print(" Please download and install Node.js from: https://nodejs.org/")
67
+ print(" Then run this command again.")
68
+ sys.exit(1)
69
+
70
+ else:
71
+ print(f"❌ Unsupported operating system: {system}")
72
+ print(" Please install Node.js manually from: https://nodejs.org/")
73
+ sys.exit(1)
74
+
75
+ # Verify installation
76
+ if not check_command_exists("npm"):
77
+ print("❌ Node.js installation verification failed.")
78
+ print(" Please restart your terminal and try again.")
79
+ sys.exit(1)
80
+
81
+ except subprocess.CalledProcessError as e:
82
+ print(f"\n❌ Error during Node.js installation: {e}")
83
+ print(" Please install Node.js manually from: https://nodejs.org/")
84
+ sys.exit(1)
85
+
86
+
87
+ def main():
88
+ """Install lai-app Node.js application."""
89
+ # Get the app directory relative to this package
90
+ app_dir = Path(__file__).parent.parent.parent.parent / "app"
91
+
92
+ if not app_dir.exists():
93
+ print(f"❌ Error: app directory not found at {app_dir}")
94
+ print(" Make sure you're in the lattifai-python repository.")
95
+ sys.exit(1)
96
+
97
+ print("🚀 Installing lai-app (LattifAI Web Application)...\n")
98
+
99
+ # Check if npm is installed, if not, install Node.js
100
+ if not check_command_exists("npm"):
101
+ install_nodejs()
102
+ else:
103
+ npm_version = subprocess.run(["npm", "--version"], capture_output=True, text=True, check=True).stdout.strip()
104
+ print(f"✓ npm is already installed (v{npm_version})\n")
105
+
106
+ # Change to app directory and run installation
107
+ try:
108
+ print(f"📁 Working directory: {app_dir}\n")
109
+
110
+ # Install dependencies
111
+ print("📦 Installing dependencies...")
112
+ subprocess.run(["npm", "install"], cwd=app_dir, check=True)
113
+ print("✓ Dependencies installed\n")
114
+
115
+ # Build the application
116
+ print("🔨 Building application...")
117
+ subprocess.run(["npm", "run", "build"], cwd=app_dir, check=True)
118
+ print("✓ Application built\n")
119
+
120
+ # Link globally
121
+ print("🔗 Linking lai-app command globally...")
122
+ subprocess.run(["npm", "link"], cwd=app_dir, check=True)
123
+ print("✓ lai-app command linked globally\n")
124
+
125
+ print("=" * 60)
126
+ print("✅ lai-app installed successfully!")
127
+ print("=" * 60)
128
+ print("\n🎉 You can now run:")
129
+ print(" lai-app # Start the web application")
130
+ print(" lai-app --help # Show help")
131
+ print(" lai-app --port 8080 # Use custom port")
132
+ print("\n📖 For more information, see app/CLI_USAGE.md\n")
133
+
134
+ except subprocess.CalledProcessError as e:
135
+ print(f"\n❌ Error during installation: {e}")
136
+ sys.exit(1)
137
+
138
+
139
+ if __name__ == "__main__":
140
+ main()
lattifai/cli/server.py CHANGED
@@ -1,3 +1,4 @@
1
+ import argparse
1
2
  import os
2
3
 
3
4
  import colorful
@@ -6,13 +7,35 @@ import uvicorn
6
7
 
7
8
  def main():
8
9
  """Launch the LattifAI Web Interface."""
9
- print(colorful.bold_green("🚀 Launching LattifAI Web Interface..."))
10
- print(colorful.cyan("See http://localhost:8001"))
10
+ parser = argparse.ArgumentParser(description="LattifAI Backend Server")
11
+ parser.add_argument(
12
+ "-p",
13
+ "--port",
14
+ type=int,
15
+ default=8001,
16
+ help="Port to run the server on (default: 8001)",
17
+ )
18
+ parser.add_argument(
19
+ "--host",
20
+ type=str,
21
+ default="0.0.0.0",
22
+ help="Host to bind the server to (default: 0.0.0.0)",
23
+ )
24
+ parser.add_argument(
25
+ "--no-reload",
26
+ action="store_true",
27
+ help="Disable auto-reload on code changes",
28
+ )
11
29
 
12
- # Ensure the directory contains the app
13
- # We might need to adjust python path or just rely on installed package
30
+ args = parser.parse_args()
14
31
 
15
- uvicorn.run("lattifai.server.app:app", host="0.0.0.0", port=8001, reload=True, log_level="info")
32
+ print(colorful.bold_green("🚀 Launching LattifAI Backend Server..."))
33
+ print(colorful.cyan(f"Server running at http://localhost:{args.port}"))
34
+ print(colorful.yellow(f"Host: {args.host}"))
35
+ print(colorful.yellow(f"Auto-reload: {'disabled' if args.no_reload else 'enabled'}"))
36
+ print()
37
+
38
+ uvicorn.run("lattifai.server.app:app", host=args.host, port=args.port, reload=not args.no_reload, log_level="info")
16
39
 
17
40
 
18
41
  if __name__ == "__main__":
lattifai/server/app.py CHANGED
@@ -58,6 +58,12 @@ app.add_middleware(
58
58
  )
59
59
 
60
60
 
61
+ @app.get("/health")
62
+ async def health_check():
63
+ """Health check endpoint for server status monitoring."""
64
+ return {"status": "ok", "message": "LattifAI backend server is running"}
65
+
66
+
61
67
  def mask_api_key(key: str) -> str:
62
68
  """Mask API key for display, showing only first 6 and last 4 characters."""
63
69
  if len(key) <= 10:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lattifai
3
- Version: 1.0.1
3
+ Version: 1.0.2
4
4
  Summary: Lattifai Python SDK: Seamless Integration with Lattifai's Speech and Video AI Services
5
5
  Author-email: Lattifai Technologies <tech@lattifai.com>
6
6
  Maintainer-email: Lattice <tech@lattifai.com>
@@ -155,7 +155,7 @@ Advanced forced alignment and subtitle generation powered by [ 🤗 Lattice-1](h
155
155
  pip install install-k2
156
156
  install-k2 --torch-version 2.9.1 # if not set will auto-detect PyTorch version and install compatible k2
157
157
 
158
- pip install lattifai==1.0.0
158
+ pip install lattifai==1.0.2
159
159
  ```
160
160
 
161
161
  **Using uv (Recommended - 10-100x faster):**
@@ -173,8 +173,8 @@ uv pip install install-k2
173
173
  uv pip install pip
174
174
  uv run install-k2 --torch-version 2.9.1
175
175
 
176
- # Install LattifAI (v1.0.0)
177
- uv pip install lattifai==1.0.0
176
+ # Install LattifAI (v1.0.2)
177
+ uv pip install lattifai==1.0.2
178
178
  ```
179
179
 
180
180
  > **Note**: `install-k2` automatically detects your PyTorch version (up to 2.9) and installs the compatible k2 wheel.
@@ -257,19 +257,69 @@ That's it! Your aligned subtitles are saved to `aligned.srt`.
257
257
 
258
258
  ### Web Interface
259
259
 
260
- 1. **Start the backend server:**
260
+ ![web Demo](assets/web.png)
261
+
262
+ 1. **Install the web application (one-time setup):**
263
+ ```bash
264
+ lai-app-install
265
+ ```
266
+
267
+ This command will:
268
+ - Check if Node.js/npm is installed (and install if needed)
269
+ - Install frontend dependencies
270
+ - Build the application
271
+ - Setup the `lai-app` command globally
272
+
273
+ 2. **Start the backend server:**
261
274
  ```bash
262
275
  lai-server
276
+
277
+ # Custom port (default: 8001)
278
+ lai-server --port 9000
279
+
280
+ # Custom host
281
+ lai-server --host 127.0.0.1 --port 9000
282
+
283
+ # Production mode (disable auto-reload)
284
+ lai-server --no-reload
263
285
  ```
264
286
 
265
- 2. **Start the frontend (in a new terminal):**
287
+ **Backend Server Options:**
288
+ - `-p, --port` - Server port (default: 8001)
289
+ - `--host` - Host address (default: 0.0.0.0)
290
+ - `--no-reload` - Disable auto-reload for production
291
+ - `-h, --help` - Show help message
292
+
293
+ 3. **Start the frontend application:**
266
294
  ```bash
267
- cd app
268
- npm install
269
- npm run dev
295
+ lai-app
296
+
297
+ # Custom port (default: 5173)
298
+ lai-app --port 8080
299
+
300
+ # Custom backend URL
301
+ lai-app --backend http://localhost:9000
302
+
303
+ # Don't auto-open browser
304
+ lai-app --no-open
270
305
  ```
271
306
 
272
- Visit `http://localhost:5173` to open the web interface.
307
+ **Frontend Application Options:**
308
+ - `-p, --port` - Frontend server port (default: 5173)
309
+ - `--backend` - Backend API URL (default: http://localhost:8001)
310
+ - `--no-open` - Don't automatically open browser
311
+ - `-h, --help` - Show help message
312
+
313
+ The web interface will automatically open in your browser at `http://localhost:5173`.
314
+
315
+ **Features:**
316
+ - ✅ Automatic backend server status detection
317
+ - ✅ Visual file upload with drag-and-drop
318
+ - ✅ Real-time alignment progress
319
+ - ✅ Multiple subtitle format support
320
+ - ✅ Built-in transcription with multiple models
321
+ - ✅ API key management interface
322
+ - ✅ Download aligned subtitles in various formats
273
323
 
274
324
  ---
275
325
 
@@ -8,7 +8,7 @@ lattifai/types.py,sha256=SjYBfwrCBOXlICvH04niFQJ7OzTx7oTaa_npfRkB67U,659
8
8
  lattifai/utils.py,sha256=TqOPrd_Et7KxrbfI_JbBNIGZ5-oGJY8ZUyJMPDTih1I,3848
9
9
  lattifai/alignment/__init__.py,sha256=ehpkKfjNIYUx7_M-RWD_8Efcrzd9bE-NSm0QgMMVLW0,178
10
10
  lattifai/alignment/lattice1_aligner.py,sha256=soBRZ98jRIju-wN5eqYUmQfF56KiEUxVGw0UvtRcx4A,4464
11
- lattifai/alignment/lattice1_worker.py,sha256=U3izvaBCnrRmr2jBnaEcHLJLGHbZlHNb1qroFxTH8oQ,7440
11
+ lattifai/alignment/lattice1_worker.py,sha256=XGICEzLygspqC7SMj5s45M7VNSj-l2zemkawdKKjssw,9233
12
12
  lattifai/alignment/phonemizer.py,sha256=fbhN2DOl39lW4nQWKzyUUTMUabg7v61lB1kj8SKK-Sw,1761
13
13
  lattifai/alignment/segmenter.py,sha256=-FKtIwv9Z4fU9Fs08jhL9VyREVSYcfcwuTqb8jxCiuo,6228
14
14
  lattifai/alignment/tokenizer.py,sha256=WilqU9Ecdkl_cW86IkB1mh_PFlHN-35Jsreiyse2r-8,22355
@@ -20,8 +20,9 @@ lattifai/caption/supervision.py,sha256=DRrM8lfKU_x9aVBcLG6xnT0xIJrnc8jzHpzcSwQOg
20
20
  lattifai/caption/text_parser.py,sha256=XDb8KTt031uJ1hg6dpbINglGOTX-6pBcghbg3DULM1I,4633
21
21
  lattifai/cli/__init__.py,sha256=dIUmrpN-OwR4h6BqMhXp87_5ZwgO41ShPru_iZGnpQs,463
22
22
  lattifai/cli/alignment.py,sha256=uKMTE95_JMikfbyCcwLbQxms-EQmZXEj7oYugiupk9I,5890
23
+ lattifai/cli/app_installer.py,sha256=0xBQnJZKhyx4JT_PkHXkZ0XlAWxCGz9o0Jjq99poKew,5680
23
24
  lattifai/cli/caption.py,sha256=ucgYxJ43ab71nGpZBAiVn8QA0DAVht2QMZFE5IdgxP0,6853
24
- lattifai/cli/server.py,sha256=k3kuQsZ2JNHZD_eMDxGSn5OFHiUrC2ybHN_xQQlLEgU,493
25
+ lattifai/cli/server.py,sha256=Vo6_ANgwu7WtC5h4BebQLmhqLNpqzPoYrPQPANpP7rw,1142
25
26
  lattifai/cli/transcribe.py,sha256=6uJfvtB1o_u1uQwxt4fje_koyfN93mGaFLlskmjqx2c,7406
26
27
  lattifai/cli/youtube.py,sha256=9_erdIkhX8pCiy7BRzNstEiO9saM-VKZ1WVqvbXbmrc,5267
27
28
  lattifai/config/__init__.py,sha256=Z8OudvS6fgfLNLu_2fvoXartQiYCECOnNfzDt-PfCN4,543
@@ -33,7 +34,7 @@ lattifai/config/media.py,sha256=5JOPjifXDM2WWQERySDZen4-7YfgQNcYM2NkkKp0LjQ,1361
33
34
  lattifai/config/transcription.py,sha256=bzghOGgcNWzTnDYd_cqCOB7GT8OnzHDiyam7LSixqxM,2901
34
35
  lattifai/diarization/__init__.py,sha256=MgBDQ1ehL2qDnZprEp8KqON7CmbG-qaP37gzBsV0jzk,119
35
36
  lattifai/diarization/lattifai.py,sha256=SE2BpIZ3_deKyhXdBqe77bsDLXIUV9AQV34gfINv7_s,2657
36
- lattifai/server/app.py,sha256=ndMBC_FuAFZGs9bvrgHUMtgDDDeYGhCkW0Lx49SEh7k,15193
37
+ lattifai/server/app.py,sha256=UpHsKJHtK1-sdp5mtDPBSxEl8xYTbe7cVO8dLp9Xiuo,15380
37
38
  lattifai/transcription/__init__.py,sha256=mEoMTbs5jAgtXQn1jTjlFY_GUr-S0WmPn8uZ6WZCkU0,2643
38
39
  lattifai/transcription/base.py,sha256=59b4nQHFMyTRyyzBJTM8ZpEuUy1KjwA2o6rNfrNluKY,3911
39
40
  lattifai/transcription/gemini.py,sha256=1VNi9gl-Kpkw3ljZcOZG5oq_OY8fMC9Xv4kOwyQpI0Q,7992
@@ -47,9 +48,9 @@ lattifai/workflow/agents.py,sha256=yEOnxnhcTvr1iOhCorNvp8B76P6nQsLRXJCu_rCYFfM,3
47
48
  lattifai/workflow/base.py,sha256=8QoVIBZwJfr5mppJbtUFafHv5QR9lL-XrULjTWD0oBg,6257
48
49
  lattifai/workflow/file_manager.py,sha256=d106KHLY8A9amLy5h1vR32e4od8mmJGqMD-iDyiRPLI,32917
49
50
  lattifai/workflow/youtube.py,sha256=n8L1c6tl8FuYzAzKZ-B76zf5yZsvVggZEJ9mPdbEWGQ,22989
50
- lattifai-1.0.1.dist-info/licenses/LICENSE,sha256=_IkHdwOWLAWcE1M_tIpDoRWdNSJwFdtIqI-XSkK3yPU,1066
51
- lattifai-1.0.1.dist-info/METADATA,sha256=3w5o4QmSENLp9PDaqwmnXJnv2l57q1oKEae_3QeUooI,23109
52
- lattifai-1.0.1.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
53
- lattifai-1.0.1.dist-info/entry_points.txt,sha256=Ay-Rxb214lYSuJIXO_wuNlUu1LbvOXtMJ-G-PcvGZFw,424
54
- lattifai-1.0.1.dist-info/top_level.txt,sha256=tHSoXF26r-IGfbIP_JoYATqbmf14h5NrnNJGH4j5reI,9
55
- lattifai-1.0.1.dist-info/RECORD,,
51
+ lattifai-1.0.2.dist-info/licenses/LICENSE,sha256=_IkHdwOWLAWcE1M_tIpDoRWdNSJwFdtIqI-XSkK3yPU,1066
52
+ lattifai-1.0.2.dist-info/METADATA,sha256=Ew2BnhBAeZyUBCKJtvl4qJz1IomUsPL2-3COXZc0fqw,24571
53
+ lattifai-1.0.2.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
54
+ lattifai-1.0.2.dist-info/entry_points.txt,sha256=F8Akof3VtKtrbnYSav1umgoo9Xbv34rUcKn-ioRfeGQ,474
55
+ lattifai-1.0.2.dist-info/top_level.txt,sha256=tHSoXF26r-IGfbIP_JoYATqbmf14h5NrnNJGH4j5reI,9
56
+ lattifai-1.0.2.dist-info/RECORD,,
@@ -1,5 +1,6 @@
1
1
  [console_scripts]
2
2
  lai-align = lattifai.cli.alignment:main
3
+ lai-app-install = lattifai.cli.app_installer:main
3
4
  lai-server = lattifai.cli.server:main
4
5
  lai-transcribe = lattifai.cli.transcribe:main
5
6
  lai-youtube = lattifai.cli.youtube:main