| 24 | |
| 25 | # Generate text and segmented video embeddings for a product |
| 26 | def generate_embedding(product_info): |
| 27 | try: |
| 28 | st.write("Starting embedding generation process...") |
| 29 | st.write(f"Processing product: {product_info['title']}") |
| 30 | |
| 31 | twelvelabs_client = TwelveLabs(api_key=TWELVELABS_API_KEY) |
| 32 | st.write("TwelveLabs client initialized successfully") |
| 33 | |
| 34 | st.write("Attempting to generate text embedding...") |
| 35 | |
| 36 | text = f"product type: {product_info['title']}. " \ |
| 37 | f"product description: {product_info['desc']}. " \ |
| 38 | f"product category: fashion apparel." |
| 39 | |
| 40 | st.write(f"Generating embedding for text: {text}") |
| 41 | |
| 42 | text_embedding = twelvelabs_client.embed.create( |
| 43 | model_name="Marengo-retrieval-2.7", |
| 44 | text=text |
| 45 | ).text_embedding.segments[0].embeddings_float |
| 46 | st.write("Text embedding generated successfully") |
| 47 | |
| 48 | |
| 49 | # Create and wait for video embedding task |
| 50 | st.write("Creating video embedding task...") |
| 51 | video_task = twelvelabs_client.embed.task.create( |
| 52 | model_name="Marengo-retrieval-2.7", |
| 53 | video_url=product_info['video_url'], |
| 54 | video_clip_length=6 |
| 55 | ) |
| 56 | |
| 57 | def on_task_update(task): |
| 58 | st.write(f"Video processing status: {task.status}") |
| 59 | |
| 60 | st.write("Waiting for video processing to complete...") |
| 61 | video_task.wait_for_done(sleep_interval=2, callback=on_task_update) |
| 62 | |
| 63 | # Retrieve segmented video embeddings |
| 64 | video_task = video_task.retrieve() |
| 65 | if not video_task.video_embedding or not video_task.video_embedding.segments: |
| 66 | raise Exception("Failed to retrieve video embeddings") |
| 67 | |
| 68 | video_segments = video_task.video_embedding.segments |
| 69 | st.write(f"Retrieved {len(video_segments)} video segments") |
| 70 | |
| 71 | video_embeddings = [] |
| 72 | for segment in video_segments: |
| 73 | video_embeddings.append({ |
| 74 | 'embedding': segment.embeddings_float, |
| 75 | 'metadata': { |
| 76 | 'scope': 'clip', |
| 77 | 'start_time': segment.start_offset_sec, |
| 78 | 'end_time': segment.end_offset_sec, |
| 79 | 'video_url': product_info['video_url'] |
| 80 | } |
| 81 | }) |
| 82 | |
| 83 | return { |