echogarden
Version:
An easy-to-use speech toolset. Includes tools for synthesis, recognition, alignment, speech translation, language detection, source separation and more.
54 lines (38 loc) • 1.58 kB
text/typescript
import { languageCodeToName } from '../utilities/Locale.js'
import { OpenPromise } from '../utilities/OpenPromise.js'
import { resolveModuleMainPath, roundToDigits } from '../utilities/Utilities.js'
import { LanguageDetectionResults } from '../api/LanguageDetectionCommon.js'
import { getDirName, joinPath } from '../utilities/PathUtilities.js'
let fastTextLanguageDetectionModel: any
export async function detectLanguage(text: string) {
const model = await loadLanguageDetectionModel()
const predictionsVector = model.predict(text, -1, 0.0)
const predictions: LanguageDetectionResults = []
for (let i = 0; i < predictionsVector.size(); i++) {
const prediction = predictionsVector.get(i)
const languageCode = prediction[1].substring(9)
const probability = roundToDigits(prediction[0], 3)
predictions.push({
language: languageCode,
languageName: languageCodeToName(languageCode),
probability
})
}
return predictions
}
async function loadLanguageDetectionModel() {
if (fastTextLanguageDetectionModel) {
return fastTextLanguageDetectionModel
}
const { FastText, addOnPostRun } = await import('@echogarden/fasttext-wasm')
const resultPromise = new OpenPromise<any>()
addOnPostRun(async () => {
const fastText = new FastText()
const moduleMainPath = await resolveModuleMainPath('@echogarden/fasttext-wasm')
const modelPath = joinPath(getDirName(moduleMainPath), 'lid.176.ftz')
const model = await fastText.loadModel(modelPath)
fastTextLanguageDetectionModel = model
resultPromise.resolve(model)
})
return resultPromise.promise
}