Podcast Transcription Software with Express.js
Tags: 100daysofcode, node, webdev, ai
Published: 2023-03-07 04:03:34

We've had several tutorials with [Leopard Speech-to-Text](https://picovoice.ai/platform/cat/). Leopard offers fully on-device audio transcription. Today we'll build podcast transcription software using Leopard Speech-to-Text downloading new items from the RSS feed directly.

**1. Backend Set up with Express.js**
The backend setup will be straightforward. A single endpoint for transcription!

```
const express = require('express');

const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', function (req, res) {
  res.redirect('/index')
});

app.post('/rss-transcribe', async (req, res) => {
  console.log("RSS feed = " + req.body.rss)
});

module.exports = app;
```
The test page is designed to allows entering  a podcast RSS feed URL manually which will be sent to the `/rss-transcribe` backend for processing.
**2. Parsing the RSS Feed**
For parsing, use this great [RSS parser from Robert Brennan](https://www.npmjs.com/package/rss-parser). It takes the URL and provides a JSON representation of the feed:
const Parser = require('rss-parser');
```
app.post('/rss-transcribe', async (req, res) => {
  console.log("Parsing RSS feed " + req.body.rss)
  let parser = new Parser();
  let feed = await parser.parseURL(req.body.rss)
  console.log("Parse complete.")
}
```
**3. Fetching the Audio**
After having the JSON of the RSS, you can find where the podcast audio link was located in the object:

```
const fs = require('fs');
const path = require('path');
const axios = require('axios');

app.post('/rss-transcribe', async (req, res) => {
  
  // .. parse feed

  const podcastAudioUrl = feed.items[0].enclosure.url
  console.log("Fetching file from " + podcastAudioUrl)
  let dlResponse = await axios.get(podcastAudioUrl, { responseType: "arraybuffer" })
  console.log("File obtained.")

  console.log("Writing data to local file...")
  const fileName = `${Math.random().toString(36).substr(2, 5)}.mp3`
  fs.writeFileSync(fileName, dlResponse.data)
  console.log("File write complete")

});
```
**4. Transcribing the Podcast**
Once you have the audio file, it's time to feed it into Leopard Speech-to-Text. Grab your `AccessKey` from the [Picovoice Console](https://console.picovoice.ai/login) for free if you haven't done yet. Replace the placeholder with your `AccessKey` and run the code below:

```
const { Leopard } = require('@picovoice/leopard-node')

app.post('/rss-transcribe', async (req, res) => {
  // .. parse feed
  
  // .. get audio file
  
  console.log("Transcribing audio...")
  const leo = new Leopard("${YOUR ACCESS KEY HERE}")
  const transcript = leo.processFile(fileName)
  leo.release()
  fs.unlinkSync(fileName)
  console.log("Transcription complete")

  res.send(transcript)
});
```
Now, you can have the transcription being sent in the response.
What's next?
You can take it from here and enrich your solutions. Options are:
1. You can write to a text file in the browser for download
2. Add automation with a solution like Zapier
3. Build front end with a search bar and a new endpoint for queries to make transcriptions searchable.

Resource:
[Original Medium Article](https://medium.com/picovoice/making-a-podcast-transcription-server-with-express-js-e73861f10660)
[Tutorial Source Code](https://github.com/Picovoice/leopard/tree/master/demo/expressjs)
[Picovoice Leopard](https://picovoice.ai/platform/cat/)
[Picovoice Console](https://console.picovoice.ai/login)