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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user