From e1d165670faac152a84e1fd7d16bade153869fb6 Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Mon, 7 Jul 2025 14:09:35 +0200 Subject: [PATCH 01/10] first draft of transcription tutorial --- assets/tutorials/transcriptions/app.png | Bin 0 -> 78206 bytes docs/source/tutorials/transcription.mdx | 422 ++++++++++++++++++++++++ 2 files changed, 422 insertions(+) create mode 100644 assets/tutorials/transcriptions/app.png create mode 100644 docs/source/tutorials/transcription.mdx diff --git a/assets/tutorials/transcriptions/app.png b/assets/tutorials/transcriptions/app.png new file mode 100644 index 0000000000000000000000000000000000000000..14589f9633fd89387b38b6e0c0ebab8b331cb2f0 GIT binary patch literal 78206 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 literal 0 HcmV?d00001 diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx new file mode 100644 index 00000000..d0ab4813 --- /dev/null +++ b/docs/source/tutorials/transcription.mdx @@ -0,0 +1,422 @@ +# Create your own transcription app + +This tutorial will guide you through building a complete transcription application using Hugging Face Inference Endpoints. We'll create an app that can transcribe audio files and generate intelligent summaries with action items - perfect for meeting notes, interviews, or any audio content. + + + +This tutorial uses Python and Gradio, but you can adapt the approach to any language that can make HTTP requests. The models deployed on Inference Endpoints use standard APIs, so you can integrate them into web applications, mobile apps, or any other system. + + + +## Create your transcription endpoint + +First, we need to create an Inference Endpoint for audio transcription. We'll use OpenAI's Whisper model for high-quality speech recognition. + +Start by navigating to the Inference Endpoints UI, and once you have logged in you should see a button for creating a new Inference Endpoint. Click the "New" button. + +![new-button](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/1-new-button.png) + +From there you'll be directed to the catalog. Search for "whisper" to find transcription models, or you can create a custom endpoint with [openai/whisper-large-v3](https://huggingface.co/openai/whisper-large-v3). + +![catalog](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/2-catalog.png) + +For transcription models, we recommend: +- **GPU**: NVIDIA L4 or A10G for good performance with audio processing +- **Instance Size**: x1 (sufficient for most transcription workloads) +- **Auto-scaling**: Enable scale-to-zero to save costs when not in use +- **Timeout**: Set to 15 minutes to handle longer audio files + +Click "Create Endpoint" to deploy your transcription service. + +![config](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/4-config.png) + +Your endpoint will take about 5 minutes to initialize. + +## Create your text generation endpoint + +For generating summaries and action items, we'll create a second endpoint with a text generation model. This time we'll use the [Qwen/Qwen3-1.7B](https://huggingface.co/Qwen/Qwen3-1.7B) model. + +Start by navigating to the Inference Endpoints UI, and once you have logged in you should see a button for creating a new Inference +Endpoint, and a small greeting prompting you to create your first endpoint. Click the "New" button. + +![new-button](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/1-new-button.png) + +From there you'll be directed to the catalog. The Model Catalog consists of popular models which have tuned configurations to work just as one-click +deploys. You can filter by name, task, price of the hardware and much more. + +![catalog](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/2-catalog.png) + +In this example let's deploy the [Qwen/Qwen3-1.7B](https://huggingface.co/Qwen/Qwen3-1.7B) model. You can find +it by searching for `qwen3 1.7b` in the search field and deploy it by clicking the card. + +![qwen](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/qwen-search.png) + +Next we'll choose which hardware and deployment settings we'll go for. Since this is a catalog model, all of the pre-selected options are very good +defaults. So in this case we don't need to change anything. In case you want a deeper dive on what the different settings mean you can check out +the [configuration guide](./guides/configuration). + +For this model the Nvidia L4 is the recommended choice. It will be perfect for our testing. Performant but still reasonably priced. Also note that by +default the endpoint will scale down to zero, meaning it will become idle after 1h of inactivity. + +Now all you need to do is click click "Create Endpoint" 🚀 + +![config](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/config.png) + +Now our Inference Endpoint is initializing, which usually takes about 3-5 minutes. If you want to can allow browser notifications which will give you a +ping once the endpoint reaches a running state. + +![init](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/init.png) + + +## Test your endpoints + +Once your endpoints are running, you can test them in the playground. The transcription endpoint will accept audio files and return text transcripts. + +![playground](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/chatbot-tutorial/assets/tutorials/chatbot/playground.png) + +Test with a short audio sample to verify the transcription quality. + +## Get your endpoint details + +You'll need the endpoint details from your [endpoints page](https://endpoints.huggingface.co/): + +- **Base URL**: `https://.endpoints.huggingface.cloud/v1/` +- **Model name**: The name of your endpoint +- **Token**: Your HF token from [settings](https://huggingface.co/settings/tokens) + +![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/chatbot-tutorial/assets/tutorials/chatbot/endpoint-page.png) + +## Building the transcription app + +Now let's build a transcription application step by step. We'll break it down into logical blocks to create a complete solution that can transcribe audio and generate intelligent summaries. + +### Step 1: Set up dependencies and imports + +We'll use the `requests` library to connect to both endpoints and `gradio` to create the interface. Let's install the required packages: + +```bash +pip install gradio requests +``` + +Then, set up your imports in a new Python file: + +```python +import os + +import gradio as gr +import requests +``` + +### Step 2: Configure your endpoint connections + +Set up the configuration to connect to both your transcription and summarization endpoints based on the details you collected in the previous steps. + +```python +# Configuration for both endpoints +TRANSCRIPTION_ENDPOINT = "https://your-whisper-endpoint.endpoints.huggingface.cloud/api/v1/audio/transcriptions" +SUMMARIZATION_ENDPOINT = "https://your-qwen-endpoint.endpoints.huggingface.cloud/v1/chat/completions" +HF_TOKEN = os.getenv("HF_TOKEN") # Your Hugging Face Hub token + +# Headers for authentication +headers = { + "Authorization": f"Bearer {HF_TOKEN}" +} +``` + +Your endpoints are now configured to handle both audio transcription and text summarization. + + + +You might also want to use `os.getenv` for your endpoint details. + + + + +### Step 3: Create the transcription function + +Next, we'll create a function to handle audio file uploads and transcription: + +```python +def transcribe_audio(audio_file_path): + """Transcribe audio using direct requests to the endpoint""" + + # Read audio file and prepare for upload + with open(audio_file_path, "rb") as audio_file: + # Read the audio file as binary data and represent it as a file object + files = {"file": audio_file.read()} + + # Make the request to the transcription endpoint + response = requests.post(TRANSCRIPTION_ENDPOINT, headers=headers, files=files) + + # Check if the request was successful + if response.status_code == 200: + result = response.json() + return result.get("text", "No transcription available") + else: + return f"Error: {response.status_code} - {response.text}" +``` + + + +The transcription endpoint expects a file upload in the `files` parameter. Make sure to read the audio file as binary data and pass it correctly to the API. + + + +### Step 4: Create the summarization function + +Now we'll create a function to generate summaries from the transcribed text. We'll do some simple prompt engineering to get the best results. + +```python +def generate_summary(transcript): + """Generate summary using requests to the chat completions endpoint""" + + # define a nice prompt to get the best results for our use case + prompt = f""" + Analyze this meeting transcript and provide: + 1. A concise summary of key points + 2. Action items with responsible parties + 3. Important decisions made + + Transcript: {transcript} + + Format with clear sections: + ## Summary + ## Action Items + ## Decisions Made + """ + + # Prepare the payload using the Messages API format + payload = { + "model": "your-qwen-endpoint-name", # Use the name of your endpoint + "messages": [{"role": "user", "content": prompt}], + "max_tokens": 1000, # we can also set a max_tokens parameter to limit the length of the response + "temperature": 0.7, # we might want to set lower temperature for more deterministic results + "stream": False # we don't need streaming for this use case + } + + # Headers for chat completions + chat_headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {HF_TOKEN}" + } + + # Make the request + response = requests.post(SUMMARIZATION_ENDPOINT, headers=chat_headers, json=payload) + response.raise_for_status() + + # Parse the response + result = response.json() + return result["choices"][0]["message"]["content"] +``` + +### Step 5: Wrap it all together + +Now let's build our Gradio interface. We'll use the `gr.Interface` class to create a simple interface that allows us to upload an audio file and see the transcript and summary. + +First, we'll create a main processing function that handles the complete workflow. + +```python +def process_meeting_audio(audio_file): + """Main processing function that handles the complete workflow""" + if audio_file is None: + return "Please upload an audio file.", "" + + try: + # Step 1: Transcribe the audio + transcript = transcribe_audio(audio_file) + + # Step 2: Generate summary from transcript + summary = generate_summary(transcript) + + return transcript, summary + + except Exception as e: + return f"Error processing audio: {str(e)}", "" +``` + +Then, we can run that function in a Gradio interface. We'll add some descriptions and a title to make it more user-friendly. + +```python +# Create Gradio interface +app = gr.Interface( + fn=process_meeting_audio, + inputs=gr.Audio(label="Upload Meeting Audio", type="filepath"), + outputs=[ + gr.Textbox(label="Full Transcript", lines=10), + gr.Textbox(label="Meeting Summary", lines=8), + ], + title="🎤 AI Meeting Notes", + description="Upload audio to get instant transcripts and summaries.", +) +``` + +That's it! You can now run the app locally with `python app.py` and test it out. + +
+Click to view the complete script + +```python +import gradio as gr +import os +import requests + +# Configuration for both endpoints +TRANSCRIPTION_ENDPOINT = "https://your-whisper-endpoint.endpoints.huggingface.cloud/api/v1/audio/transcriptions" +SUMMARIZATION_ENDPOINT = "https://your-qwen-endpoint.endpoints.huggingface.cloud/v1/chat/completions" +HF_TOKEN = os.getenv("HF_TOKEN") # Your Hugging Face Hub token + +# Headers for authentication +headers = { + "Authorization": f"Bearer {HF_TOKEN}" +} + +def transcribe_audio(audio_file_path): + """Transcribe audio using direct requests to the endpoint""" + + # Read audio file and prepare for upload + with open(audio_file_path, "rb") as audio_file: + files = {"file": audio_file.read()} + + # Make the request to the transcription endpoint + response = requests.post(TRANSCRIPTION_ENDPOINT, headers=headers, files=files) + + if response.status_code == 200: + result = response.json() + return result.get("text", "No transcription available") + else: + return f"Error: {response.status_code} - {response.text}" + + +def generate_summary(transcript): + """Generate summary using requests to the chat completions endpoint""" + + prompt = f""" + Analyze this meeting transcript and provide: + 1. A concise summary of key points + 2. Action items with responsible parties + 3. Important decisions made + + Transcript: {transcript} + + Format with clear sections: + ## Summary + ## Action Items + ## Decisions Made + """ + + # Prepare the payload using the Messages API format + payload = { + "model": "your-qwen-endpoint-name", # Use the name of your endpoint + "messages": [{"role": "user", "content": prompt}], + "max_tokens": 1000, + "temperature": 0.7, + "stream": False + } + + # Headers for chat completions + chat_headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {HF_TOKEN}" + } + + # Make the request + response = requests.post(SUMMARIZATION_ENDPOINT, headers=chat_headers, json=payload) + response.raise_for_status() + + # Parse the response + result = response.json() + return result["choices"][0]["message"]["content"] + + +def process_meeting_audio(audio_file): + """Main processing function that handles the complete workflow""" + if audio_file is None: + return "Please upload an audio file.", "" + + try: + # Step 1: Transcribe the audio + transcript = transcribe_audio(audio_file) + + # Step 2: Generate summary from transcript + summary = generate_summary(transcript) + + return transcript, summary + + except Exception as e: + return f"Error processing audio: {str(e)}", "" + + +# Create Gradio interface +app = gr.Interface( + fn=process_meeting_audio, + inputs=gr.Audio(label="Upload Meeting Audio", type="filepath"), + outputs=[ + gr.Textbox(label="Full Transcript", lines=10), + gr.Textbox(label="Meeting Summary", lines=8), + ], + title="🎤 AI Meeting Notes", + description="Upload audio to get instant transcripts and summaries.", +) + +if __name__ == "__main__": + app.launch() +``` + +
+ +![app](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/transcription-tutorial/assets/tutorials/transcriptions/app.png) + +## Deploy your transcription app + +Now, let's deploy it to Hugging Face Spaces so everyone can use it! + +1. **Create a new Space**: Go to [huggingface.co/new-space](https://huggingface.co/new-space) +2. **Choose Gradio SDK** and make it public +3. **Upload your files**: Upload `app.py` and any requirements +4. **Add your token**: In Space settings, add `HF_TOKEN` as a secret +5. **Configure hardware**: Consider GPU for faster processing +6. **Launch**: Your app will be live at `https://huggingface.co/spaces/your-username/your-space-name` + +Your transcription app is now ready to handle meeting notes, interviews, podcasts, and any other audio content that needs to be transcribed and summarized! + +## Bonus: Secure your app with AWS PrivateLink + +For production transcription applications, especially those handling sensitive audio data like confidential meetings, legal proceedings, or medical consultations, security is paramount. AWS PrivateLink allows you to access your Inference Endpoints from within your AWS VPC without exposing traffic to the public internet. + +### Step 1: Create Private Endpoints + +When creating your Whisper and Qwen endpoints, select **"Private"** as the security level: + +![private-type](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/main/assets/6_private_type.png) + +### Step 2: Configure VPC Interface Endpoint + +After your endpoints are created, you'll receive VPC Service Names. Use these to create VPC Interface Endpoints in your [AWS VPC Console](https://console.aws.amazon.com/vpc/home?#Endpoints). + +![add-private-link](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/main/assets/6_4_add_private_link.png) + +#### Step 3: Update your application + +Modify your endpoint URLs to use the private VPC endpoints: + +```python +# Use your private VPC endpoint URLs +TRANSCRIPTION_ENDPOINT = "https://your-private-vpc-endpoint.vpc-endpoint.region.vpce.amazonaws.com/api/v1/audio/transcriptions" +SUMMARIZATION_ENDPOINT = "https://your-private-vpc-endpoint.vpc-endpoint.region.vpce.amazonaws.com/v1/chat/completions" +``` + +For complete setup instructions, see our [Private Link guide](/docs/inference-endpoints/guides/private_link). + +## Next steps + +Great work! You've now built a complete transcription application with intelligent summarization. + +Here are some ways to extend your transcription app: + +- **Multi-language support**: Add language detection and support for multiple languages +- **Speaker identification**: Use a model from the hub with speaker diarization capabilities. +- **Custom prompts**: Allow users to customize the summary format and style +- **Implement Text-to-Speech**: Use a model from the hub to convert your summary to another audio file! + From 14d1bdf18d3e5c4b50dbdd87d2ae30d7427bfb4f Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Mon, 7 Jul 2025 14:15:27 +0200 Subject: [PATCH 02/10] fix image links --- docs/source/tutorials/transcription.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx index d0ab4813..97f60b21 100644 --- a/docs/source/tutorials/transcription.mdx +++ b/docs/source/tutorials/transcription.mdx @@ -72,7 +72,7 @@ ping once the endpoint reaches a running state. Once your endpoints are running, you can test them in the playground. The transcription endpoint will accept audio files and return text transcripts. -![playground](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/chatbot-tutorial/assets/tutorials/chatbot/playground.png) +![playground](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/transcription-tutorial/assets/tutorials/transcriptions/playground.png) Test with a short audio sample to verify the transcription quality. @@ -84,7 +84,7 @@ You'll need the endpoint details from your [endpoints page](https://endpoints.hu - **Model name**: The name of your endpoint - **Token**: Your HF token from [settings](https://huggingface.co/settings/tokens) -![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/chatbot-tutorial/assets/tutorials/chatbot/endpoint-page.png) +![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/transcription-tutorial/assets/tutorials/transcriptions/endpoint-page.png) ## Building the transcription app From f46b7ca88df709d32f7bc186251a0c2cc233d865 Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Mon, 7 Jul 2025 14:20:26 +0200 Subject: [PATCH 03/10] condense second endpoint creation guide --- docs/source/tutorials/transcription.mdx | 45 +++++++------------------ 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx index 97f60b21..d806cff4 100644 --- a/docs/source/tutorials/transcription.mdx +++ b/docs/source/tutorials/transcription.mdx @@ -16,10 +16,12 @@ Start by navigating to the Inference Endpoints UI, and once you have logged in y ![new-button](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/1-new-button.png) -From there you'll be directed to the catalog. Search for "whisper" to find transcription models, or you can create a custom endpoint with [openai/whisper-large-v3](https://huggingface.co/openai/whisper-large-v3). +From there you'll be directed to the catalog. The Model Catalog consists of popular models which have tuned configurations to work as one-click deploys. You can filter by name, task, price of the hardware and much more. ![catalog](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/2-catalog.png) +Search for "whisper" to find transcription models, or you can create a custom endpoint with [openai/whisper-large-v3](https://huggingface.co/openai/whisper-large-v3). This model provides excellent transcription quality for multiple languages and handles various audio formats. + For transcription models, we recommend: - **GPU**: NVIDIA L4 or A10G for good performance with audio processing - **Instance Size**: x1 (sufficient for most transcription workloads) @@ -30,43 +32,20 @@ Click "Create Endpoint" to deploy your transcription service. ![config](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/4-config.png) -Your endpoint will take about 5 minutes to initialize. +Your endpoint will take about 5 minutes to initialize. Once it's ready, you'll see it in the "Running" state. ## Create your text generation endpoint -For generating summaries and action items, we'll create a second endpoint with a text generation model. This time we'll use the [Qwen/Qwen3-1.7B](https://huggingface.co/Qwen/Qwen3-1.7B) model. - -Start by navigating to the Inference Endpoints UI, and once you have logged in you should see a button for creating a new Inference -Endpoint, and a small greeting prompting you to create your first endpoint. Click the "New" button. - -![new-button](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/1-new-button.png) - -From there you'll be directed to the catalog. The Model Catalog consists of popular models which have tuned configurations to work just as one-click -deploys. You can filter by name, task, price of the hardware and much more. - -![catalog](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/quick_start/2-catalog.png) - -In this example let's deploy the [Qwen/Qwen3-1.7B](https://huggingface.co/Qwen/Qwen3-1.7B) model. You can find -it by searching for `qwen3 1.7b` in the search field and deploy it by clicking the card. - -![qwen](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/qwen-search.png) - -Next we'll choose which hardware and deployment settings we'll go for. Since this is a catalog model, all of the pre-selected options are very good -defaults. So in this case we don't need to change anything. In case you want a deeper dive on what the different settings mean you can check out -the [configuration guide](./guides/configuration). - -For this model the Nvidia L4 is the recommended choice. It will be perfect for our testing. Performant but still reasonably priced. Also note that by -default the endpoint will scale down to zero, meaning it will become idle after 1h of inactivity. - -Now all you need to do is click click "Create Endpoint" 🚀 - -![config](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/config.png) - -Now our Inference Endpoint is initializing, which usually takes about 3-5 minutes. If you want to can allow browser notifications which will give you a -ping once the endpoint reaches a running state. +Now let's do the same again but now for a text generation model. For generating summaries and action items, we'll create a second endpoint using the [Qwen/Qwen3-1.7B](https://huggingface.co/Qwen/Qwen3-1.7B) model. -![init](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/init.png) +Follow the same process: +1. Click "New" button in the Inference Endpoints UI +2. Search for `qwen3 1.7b` in the catalog +3. The NVIDIA L4 with x1 instance size is recommended for this model +4. Keep the default settings (scale-to-zero enabled, 1-hour timeout) +5. Click "Create Endpoint" +This model is optimized for text generation tasks and will provide excellent summarization capabilities. Both endpoints will take about 3-5 minutes to initialize. ## Test your endpoints From 53d1c352162249a7f3aad6176b67e0a79695cbe0 Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Mon, 7 Jul 2025 14:34:43 +0200 Subject: [PATCH 04/10] use images from chatbot tutorial --- docs/source/tutorials/transcription.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx index d806cff4..05e34acc 100644 --- a/docs/source/tutorials/transcription.mdx +++ b/docs/source/tutorials/transcription.mdx @@ -51,7 +51,7 @@ This model is optimized for text generation tasks and will provide excellent sum Once your endpoints are running, you can test them in the playground. The transcription endpoint will accept audio files and return text transcripts. -![playground](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/transcription-tutorial/assets/tutorials/transcriptions/playground.png) +![playground](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/playground.png) Test with a short audio sample to verify the transcription quality. @@ -63,7 +63,7 @@ You'll need the endpoint details from your [endpoints page](https://endpoints.hu - **Model name**: The name of your endpoint - **Token**: Your HF token from [settings](https://huggingface.co/settings/tokens) -![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/transcription-tutorial/assets/tutorials/transcriptions/endpoint-page.png) +![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/endpoint-page.png) ## Building the transcription app From 7197ddcf4079afb9ddb3e0024cb05cef907e9cdc Mon Sep 17 00:00:00 2001 From: erikkaum Date: Thu, 17 Jul 2025 13:14:43 +0200 Subject: [PATCH 05/10] reorg and fixes --- .gitignore | 3 ++- docs/source/_toctree.yml | 5 +++++ docs/source/about.mdx | 6 +++--- docs/source/support/support.mdx | 19 +++++++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 docs/source/support/support.mdx diff --git a/.gitignore b/.gitignore index d1638636..61127725 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -build/ \ No newline at end of file +build/ +TODO.md \ No newline at end of file diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml index e370ffc4..82f02cc6 100644 --- a/docs/source/_toctree.yml +++ b/docs/source/_toctree.yml @@ -5,6 +5,9 @@ title: Inference Endpoints - local: quick_start title: Quick Start + - local: about + title: About Inference Endpoints + title: Quick Start - local: about title: About Inference Endpoints - local: api_reference @@ -19,6 +22,8 @@ - sections: - local: support/pricing title: Pricing + - local: support/support + title: Help & Support - local: support/faq title: FAQ title: Support diff --git a/docs/source/about.mdx b/docs/source/about.mdx index da8409ad..e93867ce 100644 --- a/docs/source/about.mdx +++ b/docs/source/about.mdx @@ -18,7 +18,7 @@ Inference Endpoints brings all these pieces together into a single managed servi inference engine, and Inference Endpoints takes care of the rest—provisioning infrastructure, deploying your model, and making it accessible via a simple API. This lets you focus on building your application, while we handle the complexity of production AI deployment. -![about](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/main/assets/about.png) +![about](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/about.png) ## Inference Enginges @@ -34,7 +34,7 @@ Currently we have native support for: For the natively supported engines we try to set sensible defaults, expose the most relevant configuration settings and collaborate closely with the teams maintaing the Inference Enginges to make sure they are optimized for production performance. -If you don't find your favourite engine here, please reach out to us at [api-enterprise@huggingface.co](api-enterprise@huggingface.co). +If you don't find yout favourie engine here, please reach out at [api-enterprise@huggingface.co](api-enterprise@huggingface.co). ## Under the Hood @@ -46,7 +46,7 @@ We manage the full lifecycle of these containers: starting, stopping, scaling (i and monitoring them for health and performance. This orchestration is completely managed for you, so you don't have to worry about the complexities of containerization, networking, or cloud resource management. -## Enterprise or Team Subscription +## Enterprise Hub or Team Subscription For more features consider subscribing to [Team or Enterprise](https://huggingface.co/enterprise). diff --git a/docs/source/support/support.mdx b/docs/source/support/support.mdx new file mode 100644 index 00000000..a0ba6038 --- /dev/null +++ b/docs/source/support/support.mdx @@ -0,0 +1,19 @@ +# Help & Support + +We have a variety of Inference Endpoints blog posts to help you at https://huggingface.co/blog: + +* [Getting Started with Hugging Face Inference Endpoints](https://huggingface.co/blog/inference-endpoints) +* [Why we're switching to Hugging Face Inference Endpoints, and maybe you should too](https://huggingface.co/blog/mantis-case-study) +* [Deploy LLMs with Hugging Face Inference Endpoints](https://huggingface.co/blog/inference-endpoints-llm) +* [🤗 LLM suggestions in Argilla with HuggingFace Inference Endpoints](https://huggingface.co/blog/alvarobartt/argilla-suggestions-via-inference-endpoints) +* [Deploy MusicGen in no time with Inference Endpoints](https://huggingface.co/blog/run-musicgen-as-an-api) +* [Programmatically manage Inference Endpoints](https://www.philschmid.de/inference-endpoints-iac) +* [TGI Multi-LoRA: Deploy Once, Serve 30 models](https://huggingface.co/blog/multi-lora-serving) +* [Deploy open LLMs with vLLM on Inference Endpoints](https://www.philschmid.de/vllm-inference-endpoints) +* [Llama 3.1 - 405B, 70B & 8B with multilinguality and long context](https://huggingface.co/blog/llama31#hugging-face-inference-endpoints) +* NEW! [Investing in Performance: Fine-tune small models with LLM insights - a CFM case study](https://huggingface.co/blog/cfm-case-study) + + +Need more help? + +Feel free to ask questions on the forum so the community can also benefit from the answers: https://discuss.huggingface.co/. If you have any other questions or issues, please contact us at . From f2f17ba994113a4d562fa580f741ac0ab67ced39 Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Thu, 17 Jul 2025 14:08:50 +0200 Subject: [PATCH 06/10] re-add to ToC --- docs/source/_toctree.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml index 82f02cc6..a5c28ad1 100644 --- a/docs/source/_toctree.yml +++ b/docs/source/_toctree.yml @@ -18,6 +18,8 @@ title: Deploy your own chat application - local: tutorials/embedding title: Build an embedding pipeline + - local: tutorials/transcription + title: Create your own transcription app title: Tutorials - sections: - local: support/pricing From fbacc77072fa178683cf134adc9ceb56b87d92c1 Mon Sep 17 00:00:00 2001 From: burtenshaw Date: Thu, 17 Jul 2025 14:15:47 +0200 Subject: [PATCH 07/10] and testing snippet --- docs/source/tutorials/transcription.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx index 05e34acc..08c8f20d 100644 --- a/docs/source/tutorials/transcription.mdx +++ b/docs/source/tutorials/transcription.mdx @@ -65,6 +65,16 @@ You'll need the endpoint details from your [endpoints page](https://endpoints.hu ![endpoint-details](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/chatbot-tutorial/assets/tutorials/chatbot/endpoint-page.png) +You can validate your details by testing your endpoint out in the command line with curl. + +```sh +curl "" \ +-X POST \ +--data-binary '@' \ +-H "Accept: application/json" \ +-H "Content-Type: audio/flac" \ +``` + ## Building the transcription app Now let's build a transcription application step by step. We'll break it down into logical blocks to create a complete solution that can transcribe audio and generate intelligent summaries. From e841416f31625116e2421440ed991d1753edd3bb Mon Sep 17 00:00:00 2001 From: erikkaum Date: Fri, 18 Jul 2025 12:45:53 +0200 Subject: [PATCH 08/10] support should be deleted --- docs/source/support/support.mdx | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 docs/source/support/support.mdx diff --git a/docs/source/support/support.mdx b/docs/source/support/support.mdx deleted file mode 100644 index a0ba6038..00000000 --- a/docs/source/support/support.mdx +++ /dev/null @@ -1,19 +0,0 @@ -# Help & Support - -We have a variety of Inference Endpoints blog posts to help you at https://huggingface.co/blog: - -* [Getting Started with Hugging Face Inference Endpoints](https://huggingface.co/blog/inference-endpoints) -* [Why we're switching to Hugging Face Inference Endpoints, and maybe you should too](https://huggingface.co/blog/mantis-case-study) -* [Deploy LLMs with Hugging Face Inference Endpoints](https://huggingface.co/blog/inference-endpoints-llm) -* [🤗 LLM suggestions in Argilla with HuggingFace Inference Endpoints](https://huggingface.co/blog/alvarobartt/argilla-suggestions-via-inference-endpoints) -* [Deploy MusicGen in no time with Inference Endpoints](https://huggingface.co/blog/run-musicgen-as-an-api) -* [Programmatically manage Inference Endpoints](https://www.philschmid.de/inference-endpoints-iac) -* [TGI Multi-LoRA: Deploy Once, Serve 30 models](https://huggingface.co/blog/multi-lora-serving) -* [Deploy open LLMs with vLLM on Inference Endpoints](https://www.philschmid.de/vllm-inference-endpoints) -* [Llama 3.1 - 405B, 70B & 8B with multilinguality and long context](https://huggingface.co/blog/llama31#hugging-face-inference-endpoints) -* NEW! [Investing in Performance: Fine-tune small models with LLM insights - a CFM case study](https://huggingface.co/blog/cfm-case-study) - - -Need more help? - -Feel free to ask questions on the forum so the community can also benefit from the answers: https://discuss.huggingface.co/. If you have any other questions or issues, please contact us at . From e9952623206691cf56836d168fc69839a69c0dcc Mon Sep 17 00:00:00 2001 From: erikkaum Date: Fri, 18 Jul 2025 12:48:57 +0200 Subject: [PATCH 09/10] fix wrong source in rebase --- docs/source/_toctree.yml | 5 ----- docs/source/about.mdx | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/source/_toctree.yml b/docs/source/_toctree.yml index a5c28ad1..4848bea5 100644 --- a/docs/source/_toctree.yml +++ b/docs/source/_toctree.yml @@ -5,9 +5,6 @@ title: Inference Endpoints - local: quick_start title: Quick Start - - local: about - title: About Inference Endpoints - title: Quick Start - local: about title: About Inference Endpoints - local: api_reference @@ -24,8 +21,6 @@ - sections: - local: support/pricing title: Pricing - - local: support/support - title: Help & Support - local: support/faq title: FAQ title: Support diff --git a/docs/source/about.mdx b/docs/source/about.mdx index e93867ce..82f9f389 100644 --- a/docs/source/about.mdx +++ b/docs/source/about.mdx @@ -18,7 +18,7 @@ Inference Endpoints brings all these pieces together into a single managed servi inference engine, and Inference Endpoints takes care of the rest—provisioning infrastructure, deploying your model, and making it accessible via a simple API. This lets you focus on building your application, while we handle the complexity of production AI deployment. -![about](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/update/large-rewrite/assets/about.png) +![about](https://raw.githubusercontent.com/huggingface/hf-endpoints-documentation/main/assets/about.png) ## Inference Enginges @@ -34,7 +34,7 @@ Currently we have native support for: For the natively supported engines we try to set sensible defaults, expose the most relevant configuration settings and collaborate closely with the teams maintaing the Inference Enginges to make sure they are optimized for production performance. -If you don't find yout favourie engine here, please reach out at [api-enterprise@huggingface.co](api-enterprise@huggingface.co). +If you don't find your favourite engine here, please reach out to us at [api-enterprise@huggingface.co](api-enterprise@huggingface.co). ## Under the Hood @@ -46,7 +46,7 @@ We manage the full lifecycle of these containers: starting, stopping, scaling (i and monitoring them for health and performance. This orchestration is completely managed for you, so you don't have to worry about the complexities of containerization, networking, or cloud resource management. -## Enterprise Hub or Team Subscription +## Enterprise or Team Subscription For more features consider subscribing to [Team or Enterprise](https://huggingface.co/enterprise). From 148534d2c00f56d063ef56e557ca4b840f31f046 Mon Sep 17 00:00:00 2001 From: erikkaum Date: Fri, 18 Jul 2025 12:55:09 +0200 Subject: [PATCH 10/10] let's use the default 1h timeout --- docs/source/tutorials/transcription.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/source/tutorials/transcription.mdx b/docs/source/tutorials/transcription.mdx index 08c8f20d..b9e85a4e 100644 --- a/docs/source/tutorials/transcription.mdx +++ b/docs/source/tutorials/transcription.mdx @@ -26,7 +26,6 @@ For transcription models, we recommend: - **GPU**: NVIDIA L4 or A10G for good performance with audio processing - **Instance Size**: x1 (sufficient for most transcription workloads) - **Auto-scaling**: Enable scale-to-zero to save costs when not in use -- **Timeout**: Set to 15 minutes to handle longer audio files Click "Create Endpoint" to deploy your transcription service.