{"openapi":"3.1.0","info":{"title":"VoiceLabs free tools API","version":"1.0.0","description":"No-key utilities behind the free tools on voicelabs.now/tools. No authentication, CORS *, JSON by default and Markdown for Accept: text/markdown, RFC 9457 errors, 30 calls a minute and 300 a day per address. Every operation also answers GET with the same fields as query parameters."},"externalDocs":{"url":"https://voicelabs.now/docs/free-tools-api"},"servers":[{"url":"https://voicelabs.now"}],"tags":[{"name":"Free tools","description":"Free, no-key tools."}],"security":[],"paths":{"/api/tools/srt-to-vtt":{"post":{"operationId":"convertSubtitles","summary":"Convert SRT to WebVTT or WebVTT to SRT","description":"Converts a SubRip (.srt) file to WebVTT (.vtt) or the reverse. Keeps cue timing and <b>, <i>, <u>; reports anything the target format cannot hold in `warnings`.","tags":["Free tools"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"to":{"type":"string","enum":["srt","vtt"],"description":"Target format. Default: the other one."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."}},"required":["input"]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"to":{"type":"string","enum":["srt","vtt"],"description":"Target format. Default: the other one."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."}},"required":["input"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"to":{"type":"string","enum":["srt","vtt"],"description":"Target format. Default: the other one."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."},"file":{"type":"string","format":"binary"}},"required":[]}}}},"responses":{"200":{"description":"The result. Markdown when the request sends Accept: text/markdown.","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"type":"string","description":"The resulting subtitle file's text."},"format":{"type":"string","enum":["srt","vtt"]},"cueCount":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"},"description":"Anything that was dropped or could not be read."}},"required":["output","format","cueCount","warnings"]}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"413":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"415":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"422":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"429":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}}}}},"/api/tools/subtitle-timing-shift":{"post":{"operationId":"shiftSubtitles","summary":"Shift subtitle timing earlier or later","description":"Moves every cue of a .srt or .vtt file (or every cue from `from_seconds` on) by `offset_seconds`, keeping the file's format. Cues that would end before 00:00:00 are removed and reported.","tags":["Free tools"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"offset_seconds":{"type":"number","minimum":-86400,"maximum":86400,"description":"Seconds to add; negative moves the subtitles earlier. Millisecond precision."},"from_seconds":{"type":"number","minimum":0,"description":"Shift only the cues that start at or after this time. Default 0."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."}},"required":["input","offset_seconds"]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"offset_seconds":{"type":"number","minimum":-86400,"maximum":86400,"description":"Seconds to add; negative moves the subtitles earlier. Millisecond precision."},"from_seconds":{"type":"number","minimum":0,"description":"Shift only the cues that start at or after this time. Default 0."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."}},"required":["input","offset_seconds"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"input":{"type":"string","maxLength":2000000,"description":"The whole .srt or .vtt file as text. The format is detected from the content."},"offset_seconds":{"type":"number","minimum":-86400,"maximum":86400,"description":"Seconds to add; negative moves the subtitles earlier. Millisecond precision."},"from_seconds":{"type":"number","minimum":0,"description":"Shift only the cues that start at or after this time. Default 0."},"download":{"type":"string","enum":["1","true"],"description":"Answer with the file itself (Content-Disposition: attachment) instead of JSON."},"file":{"type":"string","format":"binary"}},"required":["offset_seconds"]}}}},"responses":{"200":{"description":"The result. Markdown when the request sends Accept: text/markdown.","content":{"application/json":{"schema":{"type":"object","properties":{"output":{"type":"string","description":"The resulting subtitle file's text."},"format":{"type":"string","enum":["srt","vtt"]},"cueCount":{"type":"integer"},"warnings":{"type":"array","items":{"type":"string"},"description":"Anything that was dropped or could not be read."}},"required":["output","format","cueCount","warnings"]}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"413":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"415":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"422":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"429":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}}}}},"/api/tools/speech-time":{"post":{"operationId":"speechTime","summary":"Reading-aloud time for a text, or words for a time","description":"Send text (or a word count) to get how long it takes to read aloud, or minutes to get how many words fit. The default rate, 183 words a minute, is the average adult oral reading rate in English (https://doi.org/10.1016/j.jml.2019.104047).","tags":["Free tools"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":1000000,"description":"The script. `input` is accepted as an alias."},"words":{"type":"integer","minimum":0,"description":"A word count, instead of text."},"minutes":{"type":"number","exclusiveMinimum":0,"maximum":1440,"description":"Ask the other way: how many words fit in this many minutes."},"wpm":{"type":"number","minimum":40,"maximum":400,"description":"Words a minute. Default 183."}},"required":[]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":1000000,"description":"The script. `input` is accepted as an alias."},"words":{"type":"integer","minimum":0,"description":"A word count, instead of text."},"minutes":{"type":"number","exclusiveMinimum":0,"maximum":1440,"description":"Ask the other way: how many words fit in this many minutes."},"wpm":{"type":"number","minimum":40,"maximum":400,"description":"Words a minute. Default 183."}},"required":[]}},"multipart/form-data":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":1000000,"description":"The script. `input` is accepted as an alias."},"words":{"type":"integer","minimum":0,"description":"A word count, instead of text."},"minutes":{"type":"number","exclusiveMinimum":0,"maximum":1440,"description":"Ask the other way: how many words fit in this many minutes."},"wpm":{"type":"number","minimum":40,"maximum":400,"description":"Words a minute. Default 183."},"file":{"type":"string","format":"binary"}},"required":[]}}}},"responses":{"200":{"description":"The result. Markdown when the request sends Accept: text/markdown.","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["duration","budget"]},"words":{"type":"integer"},"characters":{"type":["integer","null"],"description":"Characters of the text sent, if any."},"wordsPerMinute":{"type":"number"},"seconds":{"type":"integer","description":"kind=duration: reading-aloud time."},"duration":{"type":"string","description":"kind=duration: e.g. \"5 min 28 s\"."},"minutes":{"type":"number","description":"kind=budget: the time asked about."}},"required":["kind","words","wordsPerMinute"]}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"413":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"415":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"422":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"429":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}}}}},"/api/tools/ssml-validator":{"post":{"operationId":"validateSsml","summary":"Validate an SSML document against SSML 1.1","description":"Checks that the document is well-formed XML and valid SSML 1.1 (elements, nesting, required attributes, value grammars), with a line and column for every error. Vendor extensions such as <amazon:effect> or <mstts:express-as> are reported as warnings. An invalid document is still a 200 with valid: false.","tags":["Free tools"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ssml":{"type":"string","maxLength":200000,"description":"The SSML document. `input` is accepted as an alias."}},"required":["ssml"]}},"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"ssml":{"type":"string","maxLength":200000,"description":"The SSML document. `input` is accepted as an alias."}},"required":["ssml"]}},"multipart/form-data":{"schema":{"type":"object","properties":{"ssml":{"type":"string","maxLength":200000,"description":"The SSML document. `input` is accepted as an alias."},"file":{"type":"string","format":"binary"}},"required":[]}}}},"responses":{"200":{"description":"The result. Markdown when the request sends Accept: text/markdown.","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean","description":"True when there is no error; warnings are allowed."},"errors":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer"},"column":{"type":"integer"},"message":{"type":"string"}},"required":["line","column","message"]}},"warnings":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer"},"column":{"type":"integer"},"message":{"type":"string"}},"required":["line","column","message"]}},"elementCount":{"type":"integer"},"textCharacters":{"type":"integer","description":"Characters of spoken text, markup excluded, whitespace runs collapsed."}},"required":["valid","errors","warnings","elementCount","textCharacters"]}},"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"413":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"415":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"422":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}},"429":{"description":"RFC 9457 problem document","content":{"application/problem+json":{"schema":{"type":"object","properties":{"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["title","status","detail"]}}}}}}}}}