Video Narrator
by @scikkk
Generate SenseAudio TTS narration tracks for videos, including timestamped segments, style variants, and editor-ready voiceover exports. Use when users need...
clawhub install video-narratorπ About This Skill
name: senseaudio-video-narrator description: Generate SenseAudio TTS narration tracks for videos, including timestamped segments, style variants, and editor-ready voiceover exports. Use when users need voiceovers, video narration, timed commentary, or accessibility narration. metadata: openclaw: requires: env: - SENSEAUDIO_API_KEY bins: - python3 - ffmpeg primaryEnv: SENSEAUDIO_API_KEY homepage: https://senseaudio.cn install: - kind: uv package: requests - kind: uv package: pydub compatibility: required_credentials: - name: SENSEAUDIO_API_KEY description: API key from https://senseaudio.cn/platform/api-key env_var: SENSEAUDIO_API_KEY homepage: https://senseaudio.cn
SenseAudio Video Narrator
Create professional narration audio for videos with timing-aware segmentation, natural delivery, and editor-friendly exports.
What This Skill Does
Credential and Dependency Rules
SENSEAUDIO_API_KEY.Authorization: Bearer .python3, requests, and pydub.pydub is used only for optional local audio assembly and mixing.Official TTS Constraints
Use the official SenseAudio TTS rules summarized below:
POST https://api.senseaudio.cn/v1/t2a_v2SenseAudio-TTS-1.010000 charactersvoice_setting.voice_id is requiredvoice_setting.speed range: 0.5-2.0voice_setting.pitch range: -12 to 12mp3, wav, pcm, flac8000, 16000, 22050, 24000, 32000, 4410032000, 64000, 128000, 2560001 or 2extra_info.audio_length returns segment duration in milliseconds is supported in textRecommended Workflow
1. Prepare the script:
10000 character limit.2. Choose a voice and pacing profile:
voice_id and tune speed, pitch, and optional vol.3. Generate audio segments:
data.audio from hex before saving.extra_info.audio_length for timeline metadata.4. Assemble the narration track locally:
pydub to position clips on a silent master track.5. Validate timing against the video:
Minimal Timed Narration Helper
import binascii
import os
import reimport requests
API_KEY = os.environ["SENSEAUDIO_API_KEY"]
API_URL = "https://api.senseaudio.cn/v1/t2a_v2"
def parse_timed_script(script):
pattern = r"\[(\d{2}):(\d{2}):(\d{2})\]\s*(.+?)(?=\n\[|\Z)"
segments = []
for match in re.finditer(pattern, script, re.DOTALL):
hours, minutes, seconds, text = match.groups()
timestamp_ms = (int(hours) * 3600 + int(minutes) * 60 + int(seconds)) * 1000
segments.append({"timestamp": timestamp_ms, "text": text.strip()})
return segments
def synthesize_segment(text, voice_id, speed=1.0, pitch=0, vol=1.0):
response = requests.post(
API_URL,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "SenseAudio-TTS-1.0",
"text": text,
"stream": False,
"voice_setting": {
"voice_id": voice_id,
"speed": speed,
"pitch": pitch,
"vol": vol,
},
"audio_setting": {
"format": "mp3",
"sample_rate": 32000,
"bitrate": 128000,
"channel": 2,
},
},
timeout=60,
)
response.raise_for_status()
data = response.json()
return {
"audio_bytes": binascii.unhexlify(data["data"]["audio"]),
"duration_ms": data["extra_info"]["audio_length"],
"trace_id": data.get("trace_id"),
}
Local Assembly Pattern
from pydub import AudioSegmentdef create_synced_narration(audio_segments, video_duration_ms):
narration_track = AudioSegment.silent(duration=video_duration_ms)
for segment in audio_segments:
clip = AudioSegment.from_file(segment["file"])
narration_track = narration_track.overlay(clip, position=segment["timestamp"])
return narration_track
Style Presets
speed such as 0.95, neutral pitchspeed near 1.0, slightly warmer pitchspeed, slightly higher pitchPrefer conservative tuning and script editing over extreme voice parameter changes.
Output Options
mp3 or wavjsonSafety Notes
trace_id and generated narration assets as potentially sensitive production data.