mirror of https://github.com/Chocobozzz/PeerTube
103 lines
2.6 KiB
TypeScript
103 lines
2.6 KiB
TypeScript
import { SimpleLogger } from '@peertube/peertube-models'
|
|
import { buildSUUID, SUUID } from '@peertube/peertube-node-utils'
|
|
import { $ } from 'execa'
|
|
import { PerformanceObserver } from 'node:perf_hooks'
|
|
import { join } from 'path'
|
|
import { TranscriptFile, TranscriptFormat } from './transcript-file.js'
|
|
import { TranscriptionEngine } from './transcription-engine.js'
|
|
import { TranscriptionModel } from './transcription-model.js'
|
|
import { TranscriptionRun } from './transcription-run.js'
|
|
|
|
export interface TranscribeArgs {
|
|
mediaFilePath: string
|
|
model: TranscriptionModel
|
|
format: TranscriptFormat
|
|
transcriptDirectory: string
|
|
|
|
language?: string
|
|
runId?: SUUID
|
|
}
|
|
|
|
export abstract class AbstractTranscriber {
|
|
engine: TranscriptionEngine
|
|
|
|
protected binDirectory: string
|
|
protected enginePath: string
|
|
|
|
protected logger: SimpleLogger
|
|
|
|
protected performanceObserver?: PerformanceObserver
|
|
protected run?: TranscriptionRun
|
|
|
|
constructor (options: {
|
|
engine: TranscriptionEngine
|
|
binDirectory?: string
|
|
enginePath?: string
|
|
|
|
logger: SimpleLogger
|
|
performanceObserver?: PerformanceObserver
|
|
}) {
|
|
const { engine, logger, enginePath, binDirectory, performanceObserver } = options
|
|
|
|
this.engine = engine
|
|
this.enginePath = enginePath
|
|
this.logger = logger
|
|
this.binDirectory = binDirectory
|
|
this.performanceObserver = performanceObserver
|
|
}
|
|
|
|
createRun (uuid: SUUID = buildSUUID()) {
|
|
this.run = new TranscriptionRun(this.logger, uuid)
|
|
}
|
|
|
|
startRun () {
|
|
this.run.start()
|
|
}
|
|
|
|
stopRun () {
|
|
this.run.stop()
|
|
delete this.run
|
|
}
|
|
|
|
assertLanguageDetectionAvailable (language?: string) {
|
|
if (!this.engine.languageDetection && !language) {
|
|
throw new Error(`Language detection isn't available in ${this.engine.name}. A language must me provided explicitly.`)
|
|
}
|
|
}
|
|
|
|
supports (model: TranscriptionModel) {
|
|
return model.format === 'PyTorch'
|
|
}
|
|
|
|
protected getEngineBinary () {
|
|
if (this.enginePath) return this.enginePath
|
|
if (this.binDirectory) return join(this.binDirectory, this.engine.command)
|
|
|
|
return this.engine.command
|
|
}
|
|
|
|
protected getExec (env?: { [ id: string ]: string }) {
|
|
const logLevels = {
|
|
command: 'debug',
|
|
output: 'debug',
|
|
ipc: 'debug',
|
|
error: 'error',
|
|
duration: 'debug'
|
|
}
|
|
|
|
return $({
|
|
verbose: (_verboseLine, { message, ...verboseObject }) => {
|
|
const level = logLevels[verboseObject.type]
|
|
|
|
this.logger[level](message, verboseObject)
|
|
},
|
|
|
|
env
|
|
})
|
|
}
|
|
|
|
abstract transcribe (options: TranscribeArgs): Promise<TranscriptFile>
|
|
|
|
abstract install (path: string): Promise<void>
|
|
}
|