javascript - voces - texto a voz mp3
¿Cómo crear o convertir texto a audio en el navegador chromium? (1)
Al intentar determinar una solución para ¿Cómo utilizar Web Speech API en chromium? encontrado que
var voices = window.speechSynthesis.getVoices();
devuelve una matriz vacía para el identificador de
voices
.
No estoy seguro si la falta de soporte en el navegador Chromium está relacionada con este problema. No está bien, Google: ¿La extensión de voz Chromium fue eliminada después de espiar ?
Preguntas:
1) ¿Hay alguna solución alternativa que pueda implementar el requisito de crear o convertir audio de texto en el navegador Chrome?
2) ¿Cómo podemos, la comunidad de desarrolladores, crear una base de datos de código abierto de archivos de audio que reflejen palabras comunes y poco comunes;
servido con encabezados
CORS
apropiados?
Se han encontrado varias soluciones alternativas que proporcionan la capacidad de crear audio a partir de texto; dos de los cuales requieren solicitar un recurso externo, el otro usa meSpeak.js de @masswerk.
Usando el enfoque descrito en
Descargar la pronunciación de audio de palabras de Google
, que sufre de no poder predeterminar qué palabras existen realmente como un archivo en el recurso sin
escribir un script de shell
o realizar una solicitud
HEAD
para verificar si se produce un error de red .
Por ejemplo, la palabra "hacer" no está disponible en el recurso utilizado a continuación.
window.addEventListener("load", () => {
const textarea = document.querySelector("textarea");
const audio = document.createElement("audio");
const mimecodec = "audio/webm; codecs=opus";
audio.controls = "controls";
document.body.appendChild(audio);
audio.addEventListener("canplay", e => {
audio.play();
});
let words = textarea.value.trim().match(//w+/g);
const url = "https://ssl.gstatic.com/dictionary/static/sounds/de/0/";
const mediatype = ".mp3";
Promise.all(
words.map(word =>
fetch(`https://query.yahooapis.com/v1/public/yql?q=select * from data.uri where url="${url}${word}${mediatype}"&format=json&callback=`)
.then(response => response.json())
.then(({query: {results: {url}}}) =>
fetch(url).then(response => response.blob())
.then(blob => blob)
)
)
)
.then(blobs => {
// const a = document.createElement("a");
audio.src = URL.createObjectURL(new Blob(blobs, {
type: mimecodec
}));
// a.download = words.join("-") + ".webm";
// a.click()
})
.catch(err => console.log(err));
});
<textarea>what it does my ninja?</textarea>
Recursos en Wikimedia Commons Categoría: El dominio público no se necesita desde el mismo directorio, consulte ¿Cómo recuperar el contenido de palabras de Wiktionary? , wikionary API - significado de las palabras .
Si se conoce la ubicación precisa del recurso, se puede solicitar el audio, aunque la URL puede incluir prefijos que no sean la propia palabra.
fetch("https://upload.wikimedia.org/wikipedia/commons/c/c5/En-uk-hello-1.ogg")
.then(response => response.blob())
.then(blob => new Audio(URL.createObjectURL(blob)).play());
No estoy completamente seguro de cómo usar la
API de Wikipedia
,
¿Cómo obtener contenido de Wikipedia usando la API de Wikipedia?
,
¿Existe una API de wikipedia limpia solo para recuperar el resumen del contenido?
para obtener solo el archivo de audio.
La respuesta
JSON
debería analizarse para el texto que termina en
.ogg
, luego se debe realizar una segunda solicitud para el recurso en sí.
fetch("https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello")
.then(response => response.text())
.then(data => {
new Audio(location.protocol + data.match(/////upload/.wikimedia/.org//wikipedia//commons//[/d-/]+[/w-]+/.ogg/).pop()).play()
})
// "//upload.wikimedia.org/wikipedia/commons/5/52/En-us-hello.ogg/"
que registros
Fetch API cannot load https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello. No ''Access-Control-Allow-Origin'' header is present on the requested resource
cuando no se solicita del mismo origen.
Tendríamos que intentar usar
YQL
nuevamente, aunque no
YQL
seguros de cómo formular la consulta para evitar errores.
El tercer enfoque utiliza una versión ligeramente modificada de
meSpeak.js
para generar el audio sin realizar una solicitud externa.
La modificación fue crear una devolución de llamada adecuada para el método
.loadConfig()
fetch("https://gist.githubusercontent.com/guest271314/f48ee0658bc9b948766c67126ba9104c/raw/958dd72d317a6087df6b7297d4fee91173e0844d/mespeak.js")
.then(response => response.text())
.then(text => {
const script = document.createElement("script");
script.textContent = text;
document.body.appendChild(script);
return Promise.all([
new Promise(resolve => {
meSpeak.loadConfig("https://gist.githubusercontent.com/guest271314/8421b50dfa0e5e7e5012da132567776a/raw/501fece4fd1fbb4e73f3f0dc133b64be86dae068/mespeak_config.json", resolve)
}),
new Promise(resolve => {
meSpeak.loadVoice("https://gist.githubusercontent.com/guest271314/fa0650d0e0159ac96b21beaf60766bcc/raw/82414d646a7a7ef11bb04ddffe4091f78ef121d3/en.json", resolve)
})
])
})
.then(() => {
// takes approximately 14 seconds to get here
console.log(meSpeak.isConfigLoaded());
meSpeak.speak("what it do my ninja", {
amplitude: 100,
pitch: 5,
speed: 150,
wordgap: 1,
variant: "m7"
});
})
.catch(err => console.log(err));
Una advertencia del enfoque anterior es que los tres archivos tardan aproximadamente 14 segundos y medio en cargarse antes de reproducir el audio. Sin embargo, evita solicitudes externas.
Sería positivo para uno o ambos 1) crear un
FOSS
, una base de datos mantenida por el desarrollador o un directorio de sonidos para palabras comunes y no comunes;
2) realice un mayor desarrollo de
meSpeak.js
para reducir el tiempo de carga de los tres archivos necesarios;
y utilice enfoques basados en
Promise
para proporcionar notificaciones del progreso de la carga de los archivos y la disponibilidad de la aplicación.
Según esta estimación de los usuarios, sería un recurso útil si los propios desarrolladores crearan y contribuyeran a una base de datos en línea de archivos que respondieran con un archivo de audio de la palabra específica. ¿No está completamente seguro de si github es el lugar apropiado para alojar archivos de audio? Tendrá que considerar las posibles opciones si se muestra interés en dicho proyecto.