videocaptioner-asr

n8n community node that transcribes audio into subtitles with the free B interface (Bcut / Bilibili) and J interface (JianYing / CapCut) ASR services. Ported from VideoCaptioner.

Package Information

Released: this month
Downloads: 0 weekly / 0 monthly
Latest Version: 0.2.0
Author: waynew8623

Documentation

n8n-nodes-videocaptioner-asr

This is an n8n community node. It lets you transcribe audio into subtitles inside your n8n
workflows using the two free speech recognition interfaces that ship with
VideoCaptioner:

Engine Value Service Notes
B 接口 bcut Bilibili Bcut (必剪) member.bilibili.com/x/bcut/rubick-interface Multipart upload, model_id 8
J 接口 jianying JianYing / CapCut (剪映) lv-pc-api-sinfonlinec.ulikecam.com ByteDance VOD upload, songs_info window

Both engines are free and require no credentials — they are the "免费在线" engines from
VideoCaptioner's ASR configuration docs. Source parity is intentional: the request flows,
headers, signing, polling and response parsing are ported one-to-one from
videocaptioner/core/asr/bcut.py and videocaptioner/core/asr/jianying.py.

Because this is a derivative work of GPL-3.0 code, the package is licensed under the
GNU General Public License v3.0 — see License and NOTICE.md.

n8n is a fair-code licensed workflow automation platform.

Installation
Operations
Credentials
Compatibility
Usage
Resources
Version history

Installation

Follow the installation guide in the n8n community nodes documentation.

npm install n8n-nodes-videocaptioner-asr

Operations

A single node, ASR Transcriber, with one operation: Transcribe audio.

Input

  • Input Source — Binary File (read the audio from an input binary property) or File URL
    (download the audio first).
  • Engine — B Interface (Bcut / Bilibili) or J Interface (JianYing / CapCut).
  • Word Level Timestamps — return one entry per word instead of one entry per sentence.

Output

  • Output Mode — how the result is emitted:

    • Single Item (default) — one item per input item. Combine with Output Format below.
    • Split Into Segments — one output item per segment, ready to be written to a sheet,
      database or one file per line. Output Format does not apply in this mode.
  • Output Format — only shown for Single Item. Multi-select, so you get exactly what you
    need and nothing else (all five are selected by default, matching earlier behaviour):

    Format Field Description
    Plain Text (One Line per Segment) txt Plain transcript, one segment per line — a clean .txt script
    Plain Text (Single Line) text Whole transcript joined without separators — handy as an LLM prompt
    SRT Subtitle srt SubRip document with timestamps, ready to be written as a .srt file
    Subtitle Segments (JSON) segments Array of { index, text, startTime, endTime, start, end, words? } (startTime / endTime in milliseconds)
    WebVTT Subtitle vtt WebVTT document with timestamps, ready to be written as a .vtt file

    Every item always carries engine, engineLabel and segmentCount in addition to the
    selected formats; raw is added when Include Raw Response is enabled. Selecting only
    Plain Text (One Line per Segment) gives you just txt, selecting only SRT Subtitle
    gives you just srt.

Options

Option Default Applies to Description
Adjust Caption End Time 200 J Milliseconds added to each segment end time
Include Raw Response false B / J Add the untouched upstream payload to the output
Max Polling Attempts 300 B / J How many times the result endpoint is polled
Model ID 8 B model_id for upload and task creation
Poll Interval (MS) 1000 B / J Delay between two result polls
Recognition End Time 6000 J Forwarded as songs_info[0].end_time
Recognition Start Time 0 J Forwarded as songs_info[0].start_time
Request Timeout (MS) 120000 B / J Timeout applied to each HTTP request
Resource File Type auto B Audio container advertised to Bcut (mp3, wav, m4a, flac)
Sign Service URL https://asrtools-update.bkfeng.top/sign J Remote signer for J interface requests
Sign User Agent n8n-nodes-videocaptioner-asr/0.2.0 J User-Agent sent to the sign service

Credentials

No credentials are required. The B and J interfaces are public free services; the node simply
talks to them directly. See the notes on rate limits below.

Compatibility

  • Requires n8n 1.x and Node.js 22 or higher.
  • n8nNodesApiVersion: 1
  • No runtime dependencies: CRC32, AWS Signature V4 and the device fingerprint are implemented
    locally on top of Node's built-in crypto module, and waiting is done with the sleep helper
    exported by n8n-workflow.

Known limitations

  • The free services only accept audio containers (mp3, wav, m4a, flac). A video file
    must be converted to MP3 first (for example with n8n's Execute Command node and ffmpeg).
  • Long audio is uploaded in one piece. VideoCaptioner splits audio into 10-minute chunks with
    10-second overlap before calling these same services — for very long files you should chunk
    upstream (or reuse VideoCaptioner) rather than relying on this node.
  • Both services are shared community endpoints with rate limits (VideoCaptioner caps them at
    100 calls / 360 minutes per 12 hours) and no availability guarantee. The J interface additionally
    depends on a third-party signing service, which is configurable via Sign Service URL.
  • Input audio always leaves your n8n instance and is uploaded to Bilibili / ByteDance. Do not use
    these engines for confidential material.
  • The B and J endpoints are unofficial and may change without notice. If they do, the node
    needs a matching update — the request flow lives in nodes/AsrTranscriber/shared/.

License

GPL-3.0-only. See LICENSE.md and NOTICE.md.

This package is a TypeScript port of GPL-3.0 code, so it inherits that license. Two practical
consequences:

  • It can be published to npm and installed in self-hosted n8n without any problem.
  • It is not eligible for n8n's verified-node program (the nodes panel in n8n Cloud), because
    n8n's verification guidelines
    require verified community nodes to be MIT licensed. n8n additionally states that a package
    should integrate a single third-party service; this one wraps two.

Accordingly, n8n.strict is false in package.json and eslint.config.mjs switches off the
single rule that demands an MIT declaration (community-package-json-license-not-default), with
the reason documented inline. Every other rule of n8n's preset remains active, and both
npm run lint and npm run build pass.

Usage

Minimal workflow:

Read Binary File  →  ASR Transcriber (Binary File, B Interface)
                  →  Convert to File (name: transcript.srt, content: {{ $json.srt }})

Using a remote URL:

HTTP Request (download audio)  →  ASR Transcriber (File URL, J Interface, Word Level Timestamps)
                               →  Split Into Segments  →  Google Sheets

The srt and vtt fields are plain strings, so they can be handed straight to Convert to File
or Move Binary Data to produce subtitle files.

Development

npm install          # installs @n8n/node-cli, eslint, prettier, typescript
npm run dev          # start n8n with this node loaded (http://localhost:5678)
npm run lint         # n8n-node lint
npm run build        # n8n-node build -> dist/

The scripts/ folder contains the verification harness used while porting the two engines:

Script Purpose
scripts/reference_values.py Prints reference values computed with the original Python implementation (zlib.crc32 + the AWS4 signer from jianying.py).
scripts/compare_reference.js Diffs the compiled TypeScript helpers against those reference values.
scripts/smoke.js Real end-to-end call against both services using a local audio file and a minimal httpRequest shim built on Node's fetch.
npm run build
<python> scripts/reference_values.py > ref.json
node scripts/compare_reference.js ref.json
node scripts/smoke.js ./sample.mp3 both

Before publishing, replace the placeholder author, homepage and repository values in
package.json (they currently read your-github-username / dev@example.com) with your own
details — n8n's linter rejects unresolved template placeholders and empty author fields.
Publishing must go through the bundled GitHub Actions workflow
(.github/workflows/publish.yml) so the package carries an npm provenance statement.

Resources

Version history

  • 0.1.0 — Initial release. B interface (Bcut) and J interface (JianYing) transcription, binary
    and URL input, word-level timestamps, single-item and split-segment output, SRT/TXT/VTT
    generation.

Discussion