48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
import { SimpleLogger } from '@peertube/peertube-models'
|
|
import { TranscriptionEngine, TranscriptionEngineName } from './transcription-engine.js'
|
|
import { Ctranslate2Transcriber, OpenaiTranscriber } from './whisper/index.js'
|
|
|
|
export class TranscriberFactory {
|
|
engines: TranscriptionEngine[]
|
|
|
|
constructor (engines: TranscriptionEngine[]) {
|
|
this.engines = engines
|
|
}
|
|
|
|
createFromEngineName (options: {
|
|
engineName: TranscriptionEngineName
|
|
enginePath?: string
|
|
binDirectory?: string
|
|
|
|
logger: SimpleLogger
|
|
}) {
|
|
const { engineName } = options
|
|
|
|
const transcriberArgs = {
|
|
...options,
|
|
|
|
engine: this.getEngineByName(engineName)
|
|
}
|
|
|
|
switch (engineName) {
|
|
case 'openai-whisper':
|
|
return new OpenaiTranscriber(transcriberArgs)
|
|
|
|
case 'whisper-ctranslate2':
|
|
return new Ctranslate2Transcriber(transcriberArgs)
|
|
|
|
default:
|
|
throw new Error(`Unimplemented engine ${engineName}`)
|
|
}
|
|
}
|
|
|
|
getEngineByName (engineName: string) {
|
|
const engine = this.engines.find(({ name }) => name === engineName)
|
|
if (!engine) {
|
|
throw new Error(`Unknow engine ${engineName}`)
|
|
}
|
|
|
|
return engine
|
|
}
|
|
}
|