tts-narrator
Version:
Generate narration with Text-To-Speech technology
1,907 lines (1,093 loc) • 48.2 kB
Markdown
# tts-narrator
Generate narration with Text-To-Speech technology.
_Please note that you need to have an Azure TTS subscription key._
[](https://npmjs.org/package/tts-narrator)
[](https://npmjs.org/package/tts-narrator)
[](https://github.com/james-hu/tts-narrator/actions/workflows/ci.yml)
The input is a script file in YAML format.
Example script files can be found under [test/fixtures](test/fixtures).
The script file is structured in this way:
* `settings`: script settings
* `voice`: voice settings at script level
* `chapters`: array of chapter
* each chapter can contain settings and multiple sections:
* `settings`: chapter level voice settings that can override script level voice settings
* `sections`: array of sections
* each section can contain settings and multiple paragraphs:
* `settings`: section level voice settings that can override upper level voice settings
* `paragraphs`: array of paragraphs
* each paragraph can contain settings and text:
* `settings`: paragraph level voice settings that can override upper level voice settings
* `text`: text content that needs to be converted into audio
* `ssml`: SSML content that needs to be converted into audio
The `text` field of a paragraph can only be pure text, any XML tags will be escaped. Multi-line strings are supported.
The `ssml` field of a paragraph can be full or partial SSML fragment. Multi-line strings are supported.
When it is present, the `text` field will be ignored.
It has command line flags `--play` and `--no-play` to control whether generated MP3s should be played back.
This feature is supported by a dev dependency [node-speaker](https://www.npmjs.com/package/speaker).
If you use it as a library in your project, and would like to have the play back capability, you need to install [node-speaker](https://www.npmjs.com/package/speaker) as a dependency in your project.
When running on MacOS, to avoid `illegal hardware instruction` issue, try `npm i speaker --mpg123-backend=openal`
# CLI
To use the CLI as an NPM package, you need to install it with all its optional dependencies, like this:
```shell
npm i -g --include=optional tts-narrator
```
<!-- help start -->
```
USAGE
$ tts-narrator FILE [-h] [-v] [-d] [-s azure] [-k <value>]
[--subscription-key-env <value>] [-r <value>] [-f <value>] [-p] [-i] [-o]
[--dry-run] [--ssml | -q] [--chapters <value>] [--sections <value>]
ARGUMENTS
FILE path to the script file (.yml)
FLAGS
-d, --debug output debug information
-f, --outputFormat=<value> [default: 3] Output format for audio
-h, --help Show help
-i, --interactive wait for key press before entering each
section
-k, --subscription-key=<value> Azure Speech service subscription key
-o, --overwrite always overwrite previously generated
audio files
-p, --[no-]play play generated audio
-q, --quiet output warn and error information only
-r, --region=<value> Region of the text-to-speech service
-s, --service=<option> text-to-speech service to use
<options: azure>
-v, --version Show CLI version
--chapters=<value> list of chapters to process, examples:
"1-10,13,15", "4-"
--dry-run don't try to generate or play audio
--sections=<value> list of sections to process, examples:
"1-10,13,15", "5-"
--ssml display generated SSML
--subscription-key-env=<value> Name of the environment variable that
holds the subscription key
DESCRIPTION
Generate narration with Text-To-Speech technology
EXAMPLES
$ tts-narrator myscript.yml --play --interactive --service azure --subscription-key-env TTS_SUBSCRIPTION_KEY --region australiaeast
$ tts-narrator ./test/fixtures/script3.yml -s azure --ssml -r australiaeast --subscription-key-env=TTS_SUB_KEY --no-play --interactive -d
$ tts-narrator ./test/fixtures/script3.yml -s azure -r australiaeast --subscription-key-env=TTS_SUB_KEY --quiet
$ tts-narrator ./test/fixtures/script3.yml
```
<!-- help end -->
# API
To use the NPM package as a dependency, you just need to install it normally, like this:
```shell
npm i tts-narrator
```
Example:
```typescript
const ttsService = new AzureTtsService(...);
const ttsNarrator = new TtsNarrator(ttsService, './output-folder');
const script = await loadScript('./my-script.yml');
await ttsNarrator.narrate(script);
console.log(`One of the generated audio file is: ${script.chapters[0].sections[0].paragraphs[0].audioFilePath}`);
```
<!-- API start -->
<a name="readmemd"></a>
## tts-narrator
### Modules
- [audio-utils](#modulesaudio_utilsmd)
- [azure-tts-service](#modulesazure_tts_servicemd)
- [index](#modulesindexmd)
- [narration-script](#modulesnarration_scriptmd)
- [script-processor](#modulesscript_processormd)
- [script-processor-flags](#modulesscript_processor_flagsmd)
- [tts-narrator](#modulestts_narratormd)
- [tts-narrator-cli](#modulestts_narrator_climd)
- [tts-service](#modulestts_servicemd)
## Classes
<a name="classesazure_tts_serviceazurettsservicemd"></a>
### Class: AzureTtsService
[azure-tts-service](#modulesazure_tts_servicemd).AzureTtsService
#### Hierarchy
- [`BaseTtsService`](#classestts_servicebasettsservicemd)
↳ **`AzureTtsService`**
#### Constructors
##### constructor
• **new AzureTtsService**(`options?`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `options?` | `Omit`\<[`AzureAudioGenerationOptions`](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd), ``"outputFilePath"``\> |
###### Overrides
[BaseTtsService](#classestts_servicebasettsservicemd).[constructor](#constructor)
#### Properties
| Property | Description |
| --- | --- |
| `Protected` `Optional` **options**: `Omit`\<[`AzureAudioGenerationOptions`](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd), ``"outputFilePath"``\> | |
#### Methods
##### buildMsttsExpressAsStartTag
▸ `Protected` **buildMsttsExpressAsStartTag**(`msttsExpressAsSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `msttsExpressAsSettings` | `Object` |
| `msttsExpressAsSettings.role?` | `string` |
| `msttsExpressAsSettings.style?` | `string` |
| `msttsExpressAsSettings.styleDegree?` | `string` |
###### Returns
`string`
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[buildMsttsExpressAsStartTag](#buildmsttsexpressasstarttag)
___
##### buildProsodyStartTag
▸ `Protected` **buildProsodyStartTag**(`prosodySettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `prosodySettings` | `Object` |
| `prosodySettings.pitch?` | `string` |
| `prosodySettings.rate?` | `string` |
| `prosodySettings.volume?` | `string` |
###### Returns
`string`
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[buildProsodyStartTag](#buildprosodystarttag)
___
##### buildSpeakStartTag
▸ `Protected` **buildSpeakStartTag**(`voiceSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `voiceSettings` | [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) |
###### Returns
`string`
###### Overrides
[BaseTtsService](#classestts_servicebasettsservicemd).[buildSpeakStartTag](#buildspeakstarttag)
___
##### buildVoiceStartTag
▸ `Protected` **buildVoiceStartTag**(`voiceSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `voiceSettings` | [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) |
###### Returns
`string`
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[buildVoiceStartTag](#buildvoicestarttag)
___
##### generateAudio
▸ **generateAudio**(`ssml`, `options`): `Promise`\<`any`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssml` | `string` |
| `options` | [`AzureAudioGenerationOptions`](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd) \| `Pick`\<[`AzureAudioGenerationOptions`](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd), ``"outputFilePath"``\> |
###### Returns
`Promise`\<`any`\>
###### Overrides
[BaseTtsService](#classestts_servicebasettsservicemd).[generateAudio](#generateaudio)
___
##### generateSSML
▸ **generateSSML**(`paragraph`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Promise`\<`string`\>
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[generateSSML](#generatessml)
___
##### generateSsmlWithoutValidation
▸ `Protected` **generateSsmlWithoutValidation**(`paragraph`): `Object`
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Object`
| Name | Type |
| :------ | :------ |
| `lineOffset` | `number` |
| `ssml` | `string` |
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[generateSsmlWithoutValidation](#generatessmlwithoutvalidation)
___
##### validateXML
▸ `Protected` **validateXML**(`xml`, `lineOffset`): `void`
###### Parameters
| Name | Type |
| :------ | :------ |
| `xml` | `string` |
| `lineOffset` | `number` |
###### Returns
`void`
###### Inherited from
[BaseTtsService](#classestts_servicebasettsservicemd).[validateXML](#validatexml)
<a name="classesnarration_scriptnarrationchaptermd"></a>
### Class: NarrationChapter
[narration-script](#modulesnarration_scriptmd).NarrationChapter
#### Implements
- [`Chapter`](#interfacesnarration_scriptnarrationscriptfilechaptermd)
#### Constructors
##### constructor
• **new NarrationChapter**(`chapter`, `index`, `script`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `chapter` | [`Chapter`](#interfacesnarration_scriptnarrationscriptfilechaptermd) |
| `index` | `number` |
| `script` | [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) |
#### Properties
| Property | Description |
| --- | --- |
| `Protected` **chapter**: [`Chapter`](#interfacesnarration_scriptnarrationscriptfilechaptermd) | |
| **index**: `number` | |
| **script**: [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | |
| **sections**: [`NarrationSection`](#classesnarration_scriptnarrationsectionmd)[] | Implementation of<br><br>[Chapter](#interfacesnarration_scriptnarrationscriptfilechaptermd).[sections](#sections) |
#### Accessors
##### key
• `get` **key**(): `string`
###### Returns
`string`
###### Implementation of
[Chapter](#interfacesnarration_scriptnarrationscriptfilechaptermd).[key](#key)
___
##### settings
• `get` **settings**(): [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Returns
[`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Implementation of
[Chapter](#interfacesnarration_scriptnarrationscriptfilechaptermd).[settings](#settings)
#### Methods
##### getSectionByKey
▸ **getSectionByKey**(`key`): `undefined` \| [`NarrationSection`](#classesnarration_scriptnarrationsectionmd)
###### Parameters
| Name | Type |
| :------ | :------ |
| `key` | `string` |
###### Returns
`undefined` \| [`NarrationSection`](#classesnarration_scriptnarrationsectionmd)
<a name="classesnarration_scriptnarrationparagraphmd"></a>
### Class: NarrationParagraph
[narration-script](#modulesnarration_scriptmd).NarrationParagraph
#### Implements
- [`Paragraph`](#interfacesnarration_scriptnarrationscriptfileparagraphmd)
#### Constructors
##### constructor
• **new NarrationParagraph**(`paragraph`, `index`, `section`, `chapter`, `script`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`Paragraph`](#interfacesnarration_scriptnarrationscriptfileparagraphmd) |
| `index` | `number` |
| `section` | [`NarrationSection`](#classesnarration_scriptnarrationsectionmd) |
| `chapter` | [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd) |
| `script` | [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) |
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **audioFilePath**: `string` | Path of the generated audio file. Only for in-memory processing, not supposed to be stored in file. |
| **chapter**: [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd) | |
| **index**: `number` | |
| `Protected` **paragraph**: [`Paragraph`](#interfacesnarration_scriptnarrationscriptfileparagraphmd) | |
| **script**: [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | |
| **section**: [`NarrationSection`](#classesnarration_scriptnarrationsectionmd) | |
#### Accessors
##### key
• `get` **key**(): `string`
###### Returns
`string`
###### Implementation of
[Paragraph](#interfacesnarration_scriptnarrationscriptfileparagraphmd).[key](#key)
___
##### settings
• `get` **settings**(): [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Returns
[`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Implementation of
[Paragraph](#interfacesnarration_scriptnarrationscriptfileparagraphmd).[settings](#settings)
___
##### ssml
• `get` **ssml**(): `undefined` \| `string`
Full or partial SSML (a kind of XML)
If provided, it will be used instead of `text`.
If both `text` and `ssml` are provided, `ssml` will be used.
If both are empty, an error will be thrown.
###### Returns
`undefined` \| `string`
###### Implementation of
[Paragraph](#interfacesnarration_scriptnarrationscriptfileparagraphmd).[ssml](#ssml)
___
##### text
• `get` **text**(): `undefined` \| `string`
Text to be narrated, it can't be XML.
If you want to use XML, use `ssml` property instead.
If both `text` and `ssml` are provided, `ssml` will be used.
If both are empty, an error will be thrown.
###### Returns
`undefined` \| `string`
###### Implementation of
[Paragraph](#interfacesnarration_scriptnarrationscriptfileparagraphmd).[text](#text)
<a name="classesnarration_scriptnarrationscriptmd"></a>
### Class: NarrationScript
[narration-script](#modulesnarration_scriptmd).NarrationScript
#### Implements
- [`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd)
#### Constructors
##### constructor
• **new NarrationScript**(`script`, `scriptFilePath`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `script` | [`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd) |
| `scriptFilePath` | `string` |
#### Properties
| Property | Description |
| --- | --- |
| **chapters**: [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd)[] | Implementation of<br><br>[Script](#interfacesnarration_scriptnarrationscriptfilescriptmd).[chapters](#chapters) |
| `Protected` **script**: [`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd) | |
| **scriptFilePath**: `string` | |
#### Accessors
##### settings
• `get` **settings**(): [`ScriptSettings`](#interfacesnarration_scriptscriptsettingsmd)
###### Returns
[`ScriptSettings`](#interfacesnarration_scriptscriptsettingsmd)
###### Implementation of
[Script](#interfacesnarration_scriptnarrationscriptfilescriptmd).[settings](#settings)
#### Methods
##### export
▸ **export**(): [`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd)
###### Returns
[`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd)
___
##### getChapterByKey
▸ **getChapterByKey**(`key`): `undefined` \| [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd)
###### Parameters
| Name | Type |
| :------ | :------ |
| `key` | `string` |
###### Returns
`undefined` \| [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd)
<a name="classesnarration_scriptnarrationsectionmd"></a>
### Class: NarrationSection
[narration-script](#modulesnarration_scriptmd).NarrationSection
#### Implements
- [`Section`](#interfacesnarration_scriptnarrationscriptfilesectionmd)
#### Constructors
##### constructor
• **new NarrationSection**(`section`, `index`, `chapter`, `script`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `section` | [`Section`](#interfacesnarration_scriptnarrationscriptfilesectionmd) |
| `index` | `number` |
| `chapter` | [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd) |
| `script` | [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) |
#### Properties
| Property | Description |
| --- | --- |
| **chapter**: [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd) | |
| **index**: `number` | |
| **paragraphs**: [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd)[] | Implementation of<br><br>[Section](#interfacesnarration_scriptnarrationscriptfilesectionmd).[paragraphs](#paragraphs) |
| **script**: [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | |
| `Protected` **section**: [`Section`](#interfacesnarration_scriptnarrationscriptfilesectionmd) | |
#### Accessors
##### key
• `get` **key**(): `string`
###### Returns
`string`
###### Implementation of
[Section](#interfacesnarration_scriptnarrationscriptfilesectionmd).[key](#key)
___
##### settings
• `get` **settings**(): [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Returns
[`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd)
###### Implementation of
[Section](#interfacesnarration_scriptnarrationscriptfilesectionmd).[settings](#settings)
<a name="classesscript_processorscriptprocessormd"></a>
### Class: ScriptProcessor
[script-processor](#modulesscript_processormd).ScriptProcessor
#### Hierarchy
- **`ScriptProcessor`**
↳ [`TtsNarrator`](#classestts_narratorttsnarratormd)
#### Constructors
##### constructor
• **new ScriptProcessor**(`scriptFilePath`, `flags`, `cliConsole?`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `scriptFilePath` | `string` |
| `flags` | `Object` & `FlagOutput` & {} |
| `cliConsole?` | `LineLogger`\<(`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`\> |
#### Properties
| Property | Description |
| --- | --- |
| `Protected` **\_chalk**: `undefined` \| ``null`` \| `Chalk` & `ChalkFunction` & {} | |
| `Protected` **\_prompts**: `undefined` \| ``null`` \| typeof `prompts` | |
| `Protected` **\_script**: [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | |
| `Protected` **audioGenerationOptions**: `undefined` \| `Omit`\<[`AudioGenerationOptions`](#interfacestts_serviceaudiogenerationoptionsmd), ``"outputFilePath"``\> | |
| `Protected` **chapterRange**: `undefined` \| `MultiRange` | |
| `Protected` **cliConsole**: `LineLogger`\<(`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`\> | |
| `Protected` **flags**: `Object` & `FlagOutput` & {} | |
| `Protected` **scriptFilePath**: `string` | |
| `Protected` **sectionRange**: `undefined` \| `MultiRange` | |
| `Protected` **ttsService**: [`TtsService`](#interfacestts_servicettsservicemd) | |
#### Accessors
##### chalk
• `Protected` `get` **chalk**(): `undefined` \| ``null`` \| typeof `prompts`
chalk, or null caused by library not available
###### Returns
`undefined` \| ``null`` \| typeof `prompts`
___
##### prompts
• `Protected` `get` **prompts**(): `undefined` \| ``null`` \| typeof `prompts`
prompts function, or null caused by library not available
###### Returns
`undefined` \| ``null`` \| typeof `prompts`
___
##### script
• `get` **script**(): [`NarrationScript`](#classesnarration_scriptnarrationscriptmd)
###### Returns
[`NarrationScript`](#classesnarration_scriptnarrationscriptmd)
#### Methods
##### determineAudioFilePath
▸ `Protected` **determineAudioFilePath**(`ssmlHash`, `_paragraph`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssmlHash` | `string` |
| `_paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Promise`\<`string`\>
___
##### hash
▸ `Protected` **hash**(`ssml`, `_paragraph`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssml` | `string` |
| `_paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`string`
___
##### initialiseTtsServiceIfNeeded
▸ `Protected` **initialiseTtsServiceIfNeeded**(): `Promise`\<`void`\>
###### Returns
`Promise`\<`void`\>
___
##### loadScriptIfNeeded
▸ `Protected` **loadScriptIfNeeded**(): `Promise`\<`void`\>
###### Returns
`Promise`\<`void`\>
___
##### parseRanges
▸ `Protected` **parseRanges**(): `void`
###### Returns
`void`
___
##### processGeneratedAudioFile
▸ `Protected` **processGeneratedAudioFile**(`audioFilePath`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `audioFilePath` | `string` |
###### Returns
`Promise`\<`string`\>
___
##### run
▸ **run**(`reconstructedCommandLine?`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `reconstructedCommandLine?` | `string` |
###### Returns
`Promise`\<`void`\>
___
##### runWithoutCatch
▸ **runWithoutCatch**(`reconstructedCommandLine?`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `reconstructedCommandLine?` | `string` |
###### Returns
`Promise`\<`void`\>
<a name="classestts_narratorttsnarratormd"></a>
### Class: TtsNarrator
[tts-narrator](#modulestts_narratormd).TtsNarrator
Class for generating narration.
Instance of this class can be used to generate narration audio for scripts by calling the `narrate(...)` method.
**`Example`**
```ts
const ttsService = new AzureTtsService(...);
const ttsNarrator = new TtsNarrator(ttsService, './output-folder');
const script = await loadScript('./my-script.yml');
await ttsNarrator.narrate(script);
console.log(`One of the generated audio file is: ${script.chapters[0].sections[0].paragraphs[0].audioFilePath}`);
```
#### Hierarchy
- [`ScriptProcessor`](#classesscript_processorscriptprocessormd)
↳ **`TtsNarrator`**
#### Constructors
##### constructor
• **new TtsNarrator**(`ttsService`, `audioFileFolder`, `options?`, `cliConsole?`)
Constructor
###### Parameters
| Name | Type | Default value | Description |
| :------ | :------ | :------ | :------ |
| `ttsService` | [`TtsService`](#interfacestts_servicettsservicemd) | `undefined` | The TTS service to be used for generating audio |
| `audioFileFolder` | `string` | `undefined` | The folder that generated audio files will be placed |
| `options?` | `Partial`\<`Object` & `FlagOutput` & {}\> | `undefined` | Optional settings |
| `cliConsole` | `LineLogger`\<(`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`\> | `silentLogger` | Optional logger |
###### Overrides
[ScriptProcessor](#classesscript_processorscriptprocessormd).[constructor](#constructor)
#### Properties
| Property | Description |
| --- | --- |
| `Protected` **\_chalk**: `undefined` \| ``null`` \| `Chalk` & `ChalkFunction` & {} | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[_chalk](#_chalk) |
| `Protected` **\_prompts**: `undefined` \| ``null`` \| typeof `prompts` | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[_prompts](#_prompts) |
| `Protected` **\_script**: [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[_script](#_script) |
| `Protected` **audioFileFolder**: `string` | The folder that generated audio files will be placed |
| `Protected` **audioGenerationOptions**: `undefined` \| `Omit`\<[`AudioGenerationOptions`](#interfacestts_serviceaudiogenerationoptionsmd), ``"outputFilePath"``\> | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[audioGenerationOptions](#audiogenerationoptions) |
| `Protected` **chapterRange**: `undefined` \| `MultiRange` | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[chapterRange](#chapterrange) |
| `Protected` **cliConsole**: `LineLogger`\<(`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`, (`message?`: `any`, ...`optionalParams`: `any`[]) => `void`\> | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[cliConsole](#cliconsole) |
| `Protected` **flags**: `Object` & `FlagOutput` & {} | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[flags](#flags) |
| `Protected` **scriptFilePath**: `string` | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[scriptFilePath](#scriptfilepath) |
| `Protected` **sectionRange**: `undefined` \| `MultiRange` | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[sectionRange](#sectionrange) |
| `Protected` **ttsService**: [`TtsService`](#interfacestts_servicettsservicemd) | Inherited from<br><br>[ScriptProcessor](#classesscript_processorscriptprocessormd).[ttsService](#ttsservice) |
#### Accessors
##### chalk
• `Protected` `get` **chalk**(): `undefined` \| ``null`` \| typeof `prompts`
chalk, or null caused by library not available
###### Returns
`undefined` \| ``null`` \| typeof `prompts`
###### Inherited from
ScriptProcessor.chalk
___
##### prompts
• `Protected` `get` **prompts**(): `undefined` \| ``null`` \| typeof `prompts`
prompts function, or null caused by library not available
###### Returns
`undefined` \| ``null`` \| typeof `prompts`
###### Inherited from
ScriptProcessor.prompts
___
##### script
• `get` **script**(): [`NarrationScript`](#classesnarration_scriptnarrationscriptmd)
###### Returns
[`NarrationScript`](#classesnarration_scriptnarrationscriptmd)
###### Inherited from
ScriptProcessor.script
#### Methods
##### determineAudioFilePath
▸ `Protected` **determineAudioFilePath**(`ssmlHash`, `_paragraph`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssmlHash` | `string` |
| `_paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Promise`\<`string`\>
###### Overrides
[ScriptProcessor](#classesscript_processorscriptprocessormd).[determineAudioFilePath](#determineaudiofilepath)
___
##### hash
▸ `Protected` **hash**(`ssml`, `_paragraph`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssml` | `string` |
| `_paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`string`
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[hash](#hash)
___
##### initialiseTtsServiceIfNeeded
▸ `Protected` **initialiseTtsServiceIfNeeded**(): `Promise`\<`void`\>
###### Returns
`Promise`\<`void`\>
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[initialiseTtsServiceIfNeeded](#initialisettsserviceifneeded)
___
##### loadScriptIfNeeded
▸ `Protected` **loadScriptIfNeeded**(): `Promise`\<`void`\>
###### Returns
`Promise`\<`void`\>
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[loadScriptIfNeeded](#loadscriptifneeded)
___
##### narrate
▸ **narrate**(`script`): `Promise`\<`void`\>
Generate narration for the script
###### Parameters
| Name | Type | Description |
| :------ | :------ | :------ |
| `script` | [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) | the input script which will also be modified for recording audioFilePath |
###### Returns
`Promise`\<`void`\>
nothing
___
##### parseRanges
▸ `Protected` **parseRanges**(): `void`
###### Returns
`void`
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[parseRanges](#parseranges)
___
##### processGeneratedAudioFile
▸ `Protected` **processGeneratedAudioFile**(`audioFilePath`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `audioFilePath` | `string` |
###### Returns
`Promise`\<`string`\>
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[processGeneratedAudioFile](#processgeneratedaudiofile)
___
##### run
▸ **run**(`reconstructedCommandLine?`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `reconstructedCommandLine?` | `string` |
###### Returns
`Promise`\<`void`\>
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[run](#run)
___
##### runWithoutCatch
▸ **runWithoutCatch**(`reconstructedCommandLine?`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `reconstructedCommandLine?` | `string` |
###### Returns
`Promise`\<`void`\>
###### Inherited from
[ScriptProcessor](#classesscript_processorscriptprocessormd).[runWithoutCatch](#runwithoutcatch)
<a name="classestts_narrator_cliexport_md"></a>
### Class: export=
[tts-narrator-cli](#modulestts_narrator_climd).export=
#### Hierarchy
- `Command`
↳ **`export=`**
#### Constructors
##### constructor
• **new export=**(`argv`, `config`)
###### Parameters
| Name | Type |
| :------ | :------ |
| `argv` | `string`[] |
| `config` | `Config` |
###### Inherited from
Command.constructor
#### Properties
| Property | Description |
| --- | --- |
| `Static` **args**: `Object` | Type declaration<br><br>| Name | Type |<br>| :------ | :------ |<br>| `file` | `Arg`\<`string`, `Record`\<`string`, `unknown`\>\> |<br>Overrides<br><br>Command.args |
| `Static` **description**: `string` = `'Generate narration with Text-To-Speech technology'` | Overrides<br><br>Command.description |
| `Static` **examples**: `string`[] | Overrides<br><br>Command.examples |
| `Static` **flags**: `Object` | Type declaration<br><br>| Name | Type |<br>| :------ | :------ |<br>| `chapters` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>| `debug` | `BooleanFlag`\<`boolean`\> |<br>| `dry-run` | `BooleanFlag`\<`boolean`\> |<br>| `interactive` | `BooleanFlag`\<`boolean`\> |<br>| `outputFormat` | `OptionFlag`\<`number`, `CustomOptions`\> |<br>| `overwrite` | `BooleanFlag`\<`boolean`\> |<br>| `play` | `BooleanFlag`\<`boolean`\> |<br>| `quiet` | `BooleanFlag`\<`boolean`\> |<br>| `region` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>| `sections` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>| `service` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>| `ssml` | `BooleanFlag`\<`boolean`\> |<br>| `subscription-key` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>| `subscription-key-env` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |<br>Overrides<br><br>Command.flags |
| `Static` **id**: `string` = `' '` | Overrides<br><br>Command.id |
#### Methods
##### run
▸ **run**(): `Promise`\<`void`\>
###### Returns
`Promise`\<`void`\>
###### Overrides
Command.run
<a name="classestts_servicebasettsservicemd"></a>
### Class: BaseTtsService
[tts-service](#modulestts_servicemd).BaseTtsService
#### Hierarchy
- **`BaseTtsService`**
↳ [`AzureTtsService`](#classesazure_tts_serviceazurettsservicemd)
#### Implements
- [`TtsService`](#interfacestts_servicettsservicemd)
#### Constructors
##### constructor
• **new BaseTtsService**()
#### Methods
##### buildMsttsExpressAsStartTag
▸ `Protected` **buildMsttsExpressAsStartTag**(`msttsExpressAsSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `msttsExpressAsSettings` | `Object` |
| `msttsExpressAsSettings.role?` | `string` |
| `msttsExpressAsSettings.style?` | `string` |
| `msttsExpressAsSettings.styleDegree?` | `string` |
###### Returns
`string`
___
##### buildProsodyStartTag
▸ `Protected` **buildProsodyStartTag**(`prosodySettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `prosodySettings` | `Object` |
| `prosodySettings.pitch?` | `string` |
| `prosodySettings.rate?` | `string` |
| `prosodySettings.volume?` | `string` |
###### Returns
`string`
___
##### buildSpeakStartTag
▸ `Protected` **buildSpeakStartTag**(`voiceSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `voiceSettings` | [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) |
###### Returns
`string`
___
##### buildVoiceStartTag
▸ `Protected` **buildVoiceStartTag**(`voiceSettings`): `string`
###### Parameters
| Name | Type |
| :------ | :------ |
| `voiceSettings` | [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) |
###### Returns
`string`
___
##### generateAudio
▸ **generateAudio**(`_ssml`, `_options`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `_ssml` | `string` |
| `_options` | [`AudioGenerationOptions`](#interfacestts_serviceaudiogenerationoptionsmd) |
###### Returns
`Promise`\<`void`\>
###### Implementation of
[TtsService](#interfacestts_servicettsservicemd).[generateAudio](#generateaudio)
___
##### generateSSML
▸ **generateSSML**(`paragraph`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Promise`\<`string`\>
###### Implementation of
[TtsService](#interfacestts_servicettsservicemd).[generateSSML](#generatessml)
___
##### generateSsmlWithoutValidation
▸ `Protected` **generateSsmlWithoutValidation**(`paragraph`): `Object`
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Object`
| Name | Type |
| :------ | :------ |
| `lineOffset` | `number` |
| `ssml` | `string` |
___
##### validateXML
▸ `Protected` **validateXML**(`xml`, `lineOffset`): `void`
###### Parameters
| Name | Type |
| :------ | :------ |
| `xml` | `string` |
| `lineOffset` | `number` |
###### Returns
`void`
## Enums
<a name="enumstts_servicettsservicetypemd"></a>
### Enumeration: TtsServiceType
[tts-service](#modulestts_servicemd).TtsServiceType
#### Enumeration Members
##### Azure
• **Azure** = ``"azure"``
## Interfaces
<a name="interfacesazure_tts_serviceazureaudiogenerationoptionsmd"></a>
### Interface: AzureAudioGenerationOptions
[azure-tts-service](#modulesazure_tts_servicemd).AzureAudioGenerationOptions
#### Hierarchy
- [`AudioGenerationOptions`](#interfacestts_serviceaudiogenerationoptionsmd)
↳ **`AzureAudioGenerationOptions`**
#### Properties
| Property | Description |
| --- | --- |
| **outputFilePath**: `string` | Inherited from<br><br>[AudioGenerationOptions](#interfacestts_serviceaudiogenerationoptionsmd).[outputFilePath](#outputfilepath) |
| `Optional` **outputFormat**: `SpeechSynthesisOutputFormat` | |
| `Optional` **serviceRegion**: `string` | |
| `Optional` **subscriptionKey**: `string` | |
<a name="interfacesnarration_scriptnarrationscriptfilechaptermd"></a>
### Interface: Chapter
[narration-script](#modulesnarration_scriptmd).[NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd).Chapter
#### Implemented by
- [`NarrationChapter`](#classesnarration_scriptnarrationchaptermd)
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **key**: `string` | |
| **sections**: [`Section`](#interfacesnarration_scriptnarrationscriptfilesectionmd)[] | |
| `Optional` **settings**: [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) | |
<a name="interfacesnarration_scriptnarrationscriptfileparagraphmd"></a>
### Interface: Paragraph
[narration-script](#modulesnarration_scriptmd).[NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd).Paragraph
#### Implemented by
- [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd)
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **key**: `string` | |
| `Optional` **settings**: [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) | |
| `Optional` **ssml**: `string` | Full or partial SSML (a kind of XML)<br>If provided, it will be used instead of `text`.<br>If both `text` and `ssml` are provided, `ssml` will be used.<br>If both are empty, an error will be thrown. |
| `Optional` **text**: `string` | Text to be narrated, it can't be XML.<br>If you want to use XML, use `ssml` property instead.<br>If both `text` and `ssml` are provided, `ssml` will be used.<br>If both are empty, an error will be thrown. |
<a name="interfacesnarration_scriptnarrationscriptfilescriptmd"></a>
### Interface: Script
[narration-script](#modulesnarration_scriptmd).[NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd).Script
#### Implemented by
- [`NarrationScript`](#classesnarration_scriptnarrationscriptmd)
#### Properties
| Property | Description |
| --- | --- |
| **chapters**: [`Chapter`](#interfacesnarration_scriptnarrationscriptfilechaptermd)[] | |
| **settings**: [`ScriptSettings`](#interfacesnarration_scriptscriptsettingsmd) | |
<a name="interfacesnarration_scriptnarrationscriptfilesectionmd"></a>
### Interface: Section
[narration-script](#modulesnarration_scriptmd).[NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd).Section
#### Implemented by
- [`NarrationSection`](#classesnarration_scriptnarrationsectionmd)
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **key**: `string` | |
| **paragraphs**: [`Paragraph`](#interfacesnarration_scriptnarrationscriptfileparagraphmd)[] | |
| `Optional` **settings**: [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) | |
<a name="interfacesnarration_scriptscriptsettingsmd"></a>
### Interface: ScriptSettings
[narration-script](#modulesnarration_scriptmd).ScriptSettings
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **service**: [`Azure`](#azure) | |
| `Optional` **voice**: [`VoiceSettings`](#interfacesnarration_scriptvoicesettingsmd) | |
<a name="interfacesnarration_scriptvoicesettingsmd"></a>
### Interface: VoiceSettings
[narration-script](#modulesnarration_scriptmd).VoiceSettings
#### Properties
| Property | Description |
| --- | --- |
| `Optional` **effect**: `string` | Voice effect, corresponding to `speak.voice#effect` in SSML. |
| `Optional` **language**: `string` | Language, corresponding to `speak#xml:lang` in SSML. |
| `Optional` **msttsExpressAs**: `Object` | Corresponding to `speak.voice.mstts:express-as` in SSML.<br>Type declaration<br><br>| Name | Type |<br>| :------ | :------ |<br>| `role?` | `string` |<br>| `style?` | `string` |<br>| `styleDegree?` | `string` | |
| `Optional` **name**: `string` | Voice name, corresponding to `speak.voice#name` in SSML. |
| `Optional` **prosody**: `Object` | Corresponding to `speak.voice.prosody` in SSML.<br>Type declaration<br><br>| Name | Type |<br>| :------ | :------ |<br>| `pitch?` | `string` |<br>| `rate?` | `string` |<br>| `volume?` | `string` | |
<a name="interfacestts_serviceaudiogenerationoptionsmd"></a>
### Interface: AudioGenerationOptions
[tts-service](#modulestts_servicemd).AudioGenerationOptions
#### Hierarchy
- **`AudioGenerationOptions`**
↳ [`AzureAudioGenerationOptions`](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd)
#### Properties
| Property | Description |
| --- | --- |
| **outputFilePath**: `string` | |
<a name="interfacestts_servicettsservicemd"></a>
### Interface: TtsService
[tts-service](#modulestts_servicemd).TtsService
#### Implemented by
- [`BaseTtsService`](#classestts_servicebasettsservicemd)
#### Methods
##### generateAudio
▸ **generateAudio**(`ssml`, `options`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `ssml` | `string` |
| `options` | [`AudioGenerationOptions`](#interfacestts_serviceaudiogenerationoptionsmd) |
###### Returns
`Promise`\<`void`\>
___
##### generateSSML
▸ **generateSSML**(`paragraph`): `Promise`\<`string`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `paragraph` | [`NarrationParagraph`](#classesnarration_scriptnarrationparagraphmd) |
###### Returns
`Promise`\<`string`\>
## Modules
<a name="modulesaudio_utilsmd"></a>
### Module: audio-utils
#### Functions
##### getAudioFileDuration
▸ **getAudioFileDuration**(`filePath`): `Promise`\<`number`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `filePath` | `string` |
###### Returns
`Promise`\<`number`\>
___
##### playMp3File
▸ **playMp3File**(`filePath`, `infoLogger`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `filePath` | `string` |
| `infoLogger` | (`msg`: `string`) => `void` |
###### Returns
`Promise`\<`void`\>
<a name="modulesazure_tts_servicemd"></a>
### Module: azure-tts-service
#### Classes
- [AzureTtsService](#classesazure_tts_serviceazurettsservicemd)
#### Interfaces
- [AzureAudioGenerationOptions](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd)
<a name="modulesindexmd"></a>
### Module: index
#### References
##### AudioGenerationOptions
Re-exports [AudioGenerationOptions](#interfacestts_serviceaudiogenerationoptionsmd)
___
##### AzureAudioGenerationOptions
Re-exports [AzureAudioGenerationOptions](#interfacesazure_tts_serviceazureaudiogenerationoptionsmd)
___
##### AzureTtsService
Re-exports [AzureTtsService](#classesazure_tts_serviceazurettsservicemd)
___
##### BaseTtsService
Re-exports [BaseTtsService](#classestts_servicebasettsservicemd)
___
##### NarrationChapter
Re-exports [NarrationChapter](#classesnarration_scriptnarrationchaptermd)
___
##### NarrationParagraph
Re-exports [NarrationParagraph](#classesnarration_scriptnarrationparagraphmd)
___
##### NarrationScript
Re-exports [NarrationScript](#classesnarration_scriptnarrationscriptmd)
___
##### NarrationScriptFile
Re-exports [NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd)
___
##### NarrationSection
Re-exports [NarrationSection](#classesnarration_scriptnarrationsectionmd)
___
##### ScriptProcessor
Re-exports [ScriptProcessor](#classesscript_processorscriptprocessormd)
___
##### ScriptSettings
Re-exports [ScriptSettings](#interfacesnarration_scriptscriptsettingsmd)
___
##### TtsNarrator
Re-exports [TtsNarrator](#classestts_narratorttsnarratormd)
___
##### TtsService
Re-exports [TtsService](#interfacestts_servicettsservicemd)
___
##### TtsServiceType
Re-exports [TtsServiceType](#enumstts_servicettsservicetypemd)
___
##### VoiceSettings
Re-exports [VoiceSettings](#interfacesnarration_scriptvoicesettingsmd)
___
##### getAudioFileDuration
Re-exports [getAudioFileDuration](#getaudiofileduration)
___
##### loadScript
Re-exports [loadScript](#loadscript)
___
##### playMp3File
Re-exports [playMp3File](#playmp3file)
___
##### saveScript
Re-exports [saveScript](#savescript)
<a name="modulesnarration_scriptnarrationscriptfilemd"></a>
### Namespace: NarrationScriptFile
[narration-script](#modulesnarration_scriptmd).NarrationScriptFile
#### Interfaces
- [Chapter](#interfacesnarration_scriptnarrationscriptfilechaptermd)
- [Paragraph](#interfacesnarration_scriptnarrationscriptfileparagraphmd)
- [Script](#interfacesnarration_scriptnarrationscriptfilescriptmd)
- [Section](#interfacesnarration_scriptnarrationscriptfilesectionmd)
<a name="modulesnarration_scriptmd"></a>
### Module: narration-script
#### Namespaces
- [NarrationScriptFile](#modulesnarration_scriptnarrationscriptfilemd)
#### Classes
- [NarrationChapter](#classesnarration_scriptnarrationchaptermd)
- [NarrationParagraph](#classesnarration_scriptnarrationparagraphmd)
- [NarrationScript](#classesnarration_scriptnarrationscriptmd)
- [NarrationSection](#classesnarration_scriptnarrationsectionmd)
#### Interfaces
- [ScriptSettings](#interfacesnarration_scriptscriptsettingsmd)
- [VoiceSettings](#interfacesnarration_scriptvoicesettingsmd)
#### Functions
##### loadScript
▸ **loadScript**(`scriptFilePath`): `Promise`\<[`NarrationScript`](#classesnarration_scriptnarrationscriptmd)\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `scriptFilePath` | `string` |
###### Returns
`Promise`\<[`NarrationScript`](#classesnarration_scriptnarrationscriptmd)\>
___
##### saveScript
▸ **saveScript**(`script`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `script` | [`NarrationScript`](#classesnarration_scriptnarrationscriptmd) |
###### Returns
`Promise`\<`void`\>
▸ **saveScript**(`script`, `scriptFilePath`): `Promise`\<`void`\>
###### Parameters
| Name | Type |
| :------ | :------ |
| `script` | [`Script`](#interfacesnarration_scriptnarrationscriptfilescriptmd) |
| `scriptFilePath` | `string` |
###### Returns
`Promise`\<`void`\>
<a name="modulesscript_processormd"></a>
### Module: script-processor
#### Classes
- [ScriptProcessor](#classesscript_processorscriptprocessormd)
<a name="modulesscript_processor_flagsmd"></a>
### Module: script-processor-flags
#### Type Aliases
##### ScriptProcessorFlags
Ƭ **ScriptProcessorFlags**: `CommandOptions`\<\{ `flags`: typeof [`scriptProcessorFlags`](#scriptprocessorflags-1) }\>[``"flags"``]
#### Variables
##### scriptProcessorFlags
• `Const` **scriptProcessorFlags**: `Object`
CLI flags that are required/used by the ScriptProcessor.
###### Type declaration
| Name | Type |
| :------ | :------ |
| `chapters` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
| `debug` | `BooleanFlag`\<`boolean`\> |
| `dry-run` | `BooleanFlag`\<`boolean`\> |
| `interactive` | `BooleanFlag`\<`boolean`\> |
| `outputFormat` | `OptionFlag`\<`number`, `CustomOptions`\> |
| `overwrite` | `BooleanFlag`\<`boolean`\> |
| `play` | `BooleanFlag`\<`boolean`\> |
| `quiet` | `BooleanFlag`\<`boolean`\> |
| `region` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
| `sections` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
| `service` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
| `ssml` | `BooleanFlag`\<`boolean`\> |
| `subscription-key` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
| `subscription-key-env` | `OptionFlag`\<`undefined` \| `string`, `CustomOptions`\> |
<a name="modulestts_narratormd"></a>
### Module: tts-narrator
#### Classes
- [TtsNarrator](#classestts_narratorttsnarratormd)
<a name="modulestts_narrator_climd"></a>
### Module: tts-narrator-cli
#### Classes
- [export=](#classestts_narrator_cliexport_md)
<a name="modulestts_servicemd"></a>
### Module: tts-service
#### Enumerations
- [TtsServiceType](#enumstts_servicettsservicetypemd)
#### Classes
- [BaseTtsService](#classestts_servicebasettsservicemd)
#### Interfaces
- [AudioGenerationOptions](#interfacestts_serviceaudiogenerationoptionsmd)
- [TtsService](#interfacestts_servicettsservicemd)
<!-- API end -->