J'utilise l'API de la parole à la parole de Google pour convertir un fichier audio en texte. Il peut identifier les haut-parleurs, ce qui est vraiment cool, mais il formule les informations d'une manière dont j'ai eu des problèmes. Voici leur Docs sur la séparation des enceintes .
Mon objectif est d'avoir une seule chaîne séparant des lignes de sortie par leurs haut-parleurs, comme celui-ci: p> si j'envoie un fichier audio pour être transcrit, je reçois Retour Quelque chose comme ceci: p> Il y a un objet pour chaque mot, je veux juste économiser de l'espace. Tout ce que Tom dit dans cet exemple doit être représenté par Voici le plus proche que j'ai obtenu jusqu'à présent: p> Serrertag: 2 Code> P>
const unformattedTranscript = wordsObjects.map((currentWord, idx, arr) => {
if (arr[idx + 1]) {
if (currentWord.speakerTag === arr[idx + 1].speakerTag) {
return [currentWord.word, arr[idx + 1].word];
} else {
return ["SPEAKER CHANGE"];
}
}
});
const formattedTranscript = unformattedTranscript.reduce(
(acc, wordArr, idx, arr) => {
if (arr[idx + 1]) {
if (wordArr[wordArr.length - 1] === arr[idx + 1][0]) {
wordArr.pop();
acc.push(wordArr.concat(arr[idx + 1]));
} else {
acc.push(["\n"]);
}
}
return acc;
},
[]
);
3 Réponses :
Je pense que vous surchargez des choses. Vous pouvez simplement itérus sur les mots des mots et suivre la balise de haut-parleurs actuelle. Chaque fois que les modifications de balises de haut-parleur de mots actuelles, vous pouvez ajouter une nouvelle ligne (et s'il n'a pas changé - appendez le mot actuel à la ligne en cours). Voici un exemple:
"Speaker1: Hello Tom Speaker2: Howdy Speaker1: How was your weekend"
Merci d'avoir remplacé cela pour moi et même d'écrire le code pour une solution. C'est beaucoup plus simple que d'où mon esprit me prenait.
C'est comme ça que je le ferais en utilisant un réducteur:
Vous pouvez ajouter un p> chunkwhile
fonction génératrice a>. Chunk les éléments tant que la balise de haut-parleur est la même, puis convertissez chaque morceau en ligne. function* chunkWhile(iterable, fn) {
const iterator = iterable[Symbol.iterator]();
let {done, value: valueA} = iterator.next();
if (done) return;
let chunk = Array.of(valueA);
for (const valueB of iterator) {
if (fn(valueA, valueB)) {
chunk.push(valueB);
} else {
yield chunk;
chunk = Array.of(valueB);
}
valueA = valueB;
}
yield chunk;
}
const wordsObjects = [
{ word: 'Hello' , speakerTag: 1 },
{ word: 'Tom' , speakerTag: 1 },
{ word: 'Howdy' , speakerTag: 2 },
{ word: 'How' , speakerTag: 1 },
{ word: 'was' , speakerTag: 1 },
{ word: 'your' , speakerTag: 1 },
{ word: 'weekend', speakerTag: 1 },
];
const chunkGenerator = chunkWhile(
wordsObjects,
(a, b) => a.speakerTag == b.speakerTag,
);
let string = "";
for (const wordsObjects of chunkGenerator) {
const speakerTag = wordsObjects[0].speakerTag;
const words = wordsObjects.map(({word}) => word).join(" ");
string += `Speaker${speakerTag}: ${words}\n`;
}
console.log(string);