Update constants from api (#607)

* fix caption ipa display

* fetch gpt/tts providers from API

* fetch remote gpt presets

* update constants

* fix conversavtion save

* refactor ipa convert

* fetch ipa mapping from api

* fix ipa mark

* fix constant

* validate camdict pron audio src
This commit is contained in:
an-lee
2024-05-14 20:37:51 +08:00
committed by GitHub
parent e5f682c6c5
commit 49dabc89a3
13 changed files with 379 additions and 198 deletions

View File

@@ -1,5 +1,5 @@
import Pitchfinder from "pitchfinder";
import { IPA_MAPPING } from "./constants";
import { IPA_CONSONANTS, IPA_MAPPINGS, IPA_VOWELS } from "./constants";
export const extractFrequencies = (props: {
peaks: Float32Array;
@@ -19,15 +19,18 @@ export const extractFrequencies = (props: {
quantization: bpm,
});
const cleanedFrequencies = removeNoise(frequencies)
const cleanedFrequencies = removeNoise(frequencies);
return cleanedFrequencies;
};
export const removeNoise = (numbers: number[], threshold: number = 0.2): number[] => {
export const removeNoise = (
numbers: number[],
threshold: number = 0.2
): number[] => {
numbers.forEach((num, i) => {
if (i === 0) return;
if (typeof num !== 'number') return;
if (typeof num !== "number") return;
const prevNum = numbers[i - 1] || num;
const nextNum = numbers[i + 1] || num;
@@ -37,7 +40,7 @@ export const removeNoise = (numbers: number[], threshold: number = 0.2): number[
if (deviation > threshold * avgNeighbor) {
numbers[i] = null;
}
})
});
return numbers;
};
@@ -53,12 +56,62 @@ export function milisecondsToTimestamp(ms: number) {
)}:${seconds.padStart(2, "0")},${milliseconds}`;
}
export const convertIpaToNormal = (ipa: string) => {
export const convertWordIpaToNormal = (
ipas: string[],
options?: { mappings?: any }
): string[] => {
const { mappings = IPA_MAPPINGS } = options || {};
const consonants = Object.keys(IPA_CONSONANTS)
.map((key) => IPA_CONSONANTS[key])
.reduce((acc, val) => acc.concat(val), []);
const consonantsRegex = new RegExp(`^(\ˈ|ˌ)?` + consonants.join("|"));
const vowels = Object.keys(IPA_VOWELS)
.map((key) => IPA_VOWELS[key])
.reduce((acc, val) => acc.concat(val), []);
const vowelsRegex = new RegExp(`^(\ˈ|ˌ)?` + vowels.join("|"));
const converted: string[] = [];
// convert each ipa to normal
// if ipa is a vowel and marked, check if the previous ipa is a consonant,
// if so, mark the consonant instead
for (let i = 0; i < ipas.length; i++) {
const ipa = ipas[i];
converted.push(convertIpaToNormal(ipa, { mappings, marked: false }));
const isVowel = vowelsRegex.test(ipa);
const mark = ipa.match(/(\ˈ|ˌ)/);
let j = i - 1;
for (; j >= 0; j--) {
if (consonantsRegex.test(ipas[j]) && !consonantsRegex.test(ipas[j - 1])) {
break;
}
}
if (isVowel && mark) {
if (ipas[j]) {
converted[j] = mark[0] + converted[j];
} else {
converted[i] = mark[0] + converted[i];
}
}
}
return converted;
};
export const convertIpaToNormal = (
ipa: string,
options?: { mappings?: any; marked?: boolean }
): string => {
const { mappings = IPA_MAPPINGS, marked = false } = options || {};
const mark = ipa.match(/(\ˈ|ˌ)/);
const cleanIpa = ipa.replace(mark ? mark[0] : "", "");
const converted = IPA_MAPPING[cleanIpa] || cleanIpa;
if (mark) {
const converted = mappings[cleanIpa] || cleanIpa;
if (mark && marked) {
return `${mark[0]}${converted}`;
} else {
return converted;