voz transformador probar online linea internet gratis grabar grabadora grabador autotune algorithm machine-learning audio

algorithm - transformador - probar autotune online



¿Cómo detectar qué tan similar es una grabación de voz a otra grabación de voz? (8)

El musicg api https://code.google.com/p/musicg/ tiene un generador y un anotador de huellas digitales de audio junto con el código fuente para mostrar cómo se hace.

Creo que busca el punto más similar en cada pista, luego puntúa en función de hasta qué punto puede coincidir.

Puede parecer algo como

import com.musicg.wave.Wave com.musicg.fingerprint.FingerprintSimilarity com.musicg.fingerprint.FingerprintSimilarityComputer com.musicg.fingerprint.FingerprintManager double score = new FingerprintsSimilarity( new Wave("voice1.wav").getFingerprint(), new Wave("voice2.wav").getFingerprint() ).getSimilarity();

Me gustaría construir un programa para detectar qué tan cerca está la grabación de audio de un usuario de otra grabación para corregir la pronunciación del usuario. Por ejemplo:

  1. Me grabo diciendo "buenos días"
  2. Dejo que un estudiante extranjero grabe "buenos días"
  3. Compara su grabación con la mía para ver si su pronunciación fue lo suficientemente buena.

He visto esto en algunas herramientas de aprendizaje de idiomas (creo que Rosetta Stone hace esto), pero ¿cómo se hace? Tenga en cuenta que solo estamos tratando con el habla (y no, digamos, con la música). ¿Cuáles son algunos algoritmos o bibliotecas que debería estudiar?


Muchas personas parecen estar sugiriendo algún tipo de distancia de edición, que IMO es un enfoque totalmente erróneo para determinar la similitud de dos patrones de voz, especialmente para patrones tan cortos como lo implica OP. Los algoritmos específicos utilizados por el reconocimiento de voz, de hecho, son casi lo contrario de lo que le gustaría usar aquí. El problema en el reconocimiento de voz es resolver muchas pronunciaciones similares a la misma representación. El problema aquí es tomar un número de pronunciaciones ligeramente diferentes y obtener algún tipo de distancia significativa entre ellos.

He hecho un poco de estas cosas para la ciencia de datos a gran escala, y aunque no puedo comentar exactamente cómo lo hacen los programas propietarios, puedo comentar sobre cómo se hace en el mundo académico y proporcionar una solución que sea directa y proporcionará Usted es el poder y la flexibilidad que desea para este enfoque.

En primer lugar: suponiendo que lo que tienes es un fragmento de audio sin ningún tipo de filtrado realizado. Así como sería adquirido desde un micrófono. El primer paso es eliminar el ruido de fondo. Hay varios métodos diferentes para esto, pero voy a asumir que lo que quieres es algo que funcione bien sin que sea increíblemente difícil de implementar.

  • Filtra el audio usando el módulo de filtrado de scipy here . Hay una gran cantidad de frecuencias que los micrófonos recogen que simplemente no son útiles para categorizar el habla. Yo sugeriría un filtro Bessel o un filtro Butterworth para asegurar que su forma de onda sea perseverada a través del filtrado. Las frecuencias fundamentales para el habla cotidiana están generalmente entre 800 y 2000 Hz ( reference ), por lo que un corte razonable sería algo así como de 300 a 4000 Hz, solo para asegurarse de no perder nada.
  • Busque la parte menos activa de la voz y suponga que es una representación razonable del ruido de fondo. En este punto, querrá ejecutar una serie de transformadas de Fourier a lo largo de sus datos (o generar un espectrograma) y encontrar la parte de su grabación de voz que tenga la respuesta de frecuencia promedio más baja. Una vez que tenga esa instantánea, debe restarla de todos los demás puntos en su muestra de audio.
  • En este punto, debe tener un archivo de audio que sea principalmente el discurso de su usuario y debe estar listo para compararlo con otro archivo que haya pasado por este proceso. Ahora, queremos en realidad recortar el sonido y comparar este clip con algún clip maestro.

En segundo lugar: va a querer establecer una métrica de distancia entre dos patrones de voz, hay varias formas de hacerlo, pero asumiré que tenemos la salida de la primera parte y algún archivo maestro que tiene Ha pasado por un proceso similar.

  • Genere un espectrograma del archivo de audio en cuestión ( example ). La salida de esto será, en última instancia, una imagen que puede representarse como una matriz bidimensional de valores de respuesta de frecuencia. Un espectrograma es esencialmente una transformada de Fourier en el tiempo donde el color corresponde a la intensidad.

  • Use OpenCV (tiene enlaces de python, example ) para ejecutar la detección de manchas en su espectrograma. Efectivamente, esto buscará la gran mancha colorida en medio de su espectrograma y le dará algunos límites a esto. Efectivamente, lo que debería hacer es devolver una versión significativamente más dispersa de la matriz 2d original que representa únicamente el discurso en cuestión. (Con la suposición de que su archivo de audio tendrá algunos elementos finales en la parte frontal y posterior de la grabación)

  • Normalice los dos blobs para tener en cuenta las diferencias en la velocidad del habla. Todos hablan a una velocidad diferente, y como tal, sus manchas probablemente tendrán diferentes tamaños a lo largo del eje x (tiempo). Esto introducirá en última instancia un nivel de controles en su algoritmo que no desea para la velocidad del habla. Este paso no es necesario si también quiere asegurarse de que hablen a la misma velocidad que la copia maestra, pero lo sugeriría. Básicamente, quieres extender la versión más corta multiplicando su eje de tiempo por alguna constante que sea solo la proporción de las longitudes de tus dos burbujas.

  • También debe normalizar los dos blobs en función de la intensidad máxima y mínima para tener en cuenta a las personas que hablan en diferentes volúmenes. Nuevamente, esto depende de su discreción, pero para solucionarlo, debe encontrar relaciones similares para el intervalo total de intensidades que tiene, así como las intensidades máximas de los dos registros y asegurarse de que estos dos valores coincidan entre sus matrices de 2 días. .

Tercero: ahora que tiene matrices en 2-D que representan sus dos eventos de habla, que en teoría deberían contener toda su información útil, es hora de compararlos directamente. Afortunadamente, comparar dos matrices es un problema bien resuelto y hay varias formas de avanzar.

  • Personalmente, sugeriría usar una métrica como Cosine Similarity para determinar la diferencia entre sus dos manchas, pero esa no es la única solución y, aunque le dará una validación rápida, puede hacerlo mejor.

  • Podría intentar restar una matriz de la otra y obtener una evaluación de cuánta diferencia hay entre ellas, lo que probablemente sería más preciso que la simple distancia del coseno.

  • Podría ser una exageración, pero podría suponer que hay ciertas regiones del habla que son más o menos importantes para evaluar la diferencia entre las burbujas (no importa si alguien usa una i larga en lugar de una i corta, pero ag en lugar de ak podría ser una palabra completamente diferente). Para algo como eso, querría desarrollar una máscara para la matriz de diferencia en el paso anterior y multiplicar todos sus valores por eso.

  • Sea cual sea el método que elija, ahora puede establecer simplemente un umbral de diferencia y asegurarse de que la diferencia entre las dos burbujas esté por debajo del umbral deseado. Si es así, el habla capturada es lo suficientemente similar para ser correcta. De lo contrario, haz que lo intenten de nuevo.

Espero que sea útil, y una vez más, no puedo asegurarle que este es el algoritmo exacto que usa una compañía, ya que esa información es muy confidencial y no está abierta al público, pero puedo asegurarle que se utilizan métodos similares a estos en Los mejores artículos en el mundo académico y que estos métodos le proporcionarán un gran equilibrio de precisión y facilidad de implementación. ¡Avíseme si tiene alguna pregunta y buena suerte con sus futuras hazañas científicas de datos!


Sé que esta pregunta está desactualizada pero ...

Para resolver un problema similar, utilicé la API Google Speech Recognized para verificar QUÉ se dijo y comparé visualmente las formas de onda escaladas de los cambios de volumen para detectar diferencias en el ritmo.

Code y video del resultado.


Si esto es solo para verificar la pronunciación [por supuesto, con acento diferente], puede hacer esto:

Paso 1: usando alguna herramienta de voz [di dictado del dragón ], puedes llevar el texto contigo.

Paso 2: Compare la cadena o la palabra formada y compárela con la cadena que en realidad estaba destinada a ser pronunciada.

Paso 3: Si encuentra alguna discrepancia en las cadenas, significa que la palabra no se escribió correctamente. Y puedes sugerir la pronunciación correcta.


Tienes que mirar en algoritmos de reconocimiento de voz. Entiendo que no es necesario traducir voz a texto (esto se hace mediante algoritmos de reconocimiento de voz), sin embargo, en su caso, muchos algoritmos serían iguales.

Probablemente, HMM sería útil aquí (modelos ocultos de Markov). También mire aquí: http://htk.eng.cam.ac.uk/



puede utilizar Musicg https://code.google.com/p/musicg/ como sugiere roy zhang. En Android, solo incluye el archivo jar de musicg en tu proyecto de Android y úsalo. Un ejemplo probado:

import com.musicg.wave.Wave; import com.musicg.fingerprint.FingerprintSimilarity; //somewhere in your code add String file1 = Environment.getExternalStorageDirectory().getAbsolutePath(); file1 += "/test.wav"; String file2 = Environment.getExternalStorageDirectory().getAbsolutePath(); file2 += "/test.wav"; Wave w1 = new Wave(file1); Wave w2 = new Wave(file2); FingerprintSimilarity fps = w1.getFingerprintSimilarity(w2); float score = fps.getScore(); float sim = fps.getSimilarity(); Log.d("score", score+""); Log.d("similarities", sim+"");

Buena suerte


Idea: La forma en que los biotecnólogos alinean dos secuencias de proteínas es la siguiente: Cada secuencia se representa como una cadena en un alfabeto como (A / C / G / T - estos son diferentes tipos de proteínas, irrelevantes para nosotros), donde cada letra (aquí , una entrada) representa un aminoácido particular. La calidad de una alineación (su puntuación) se calcula a partir de la similitud de cada par de entradas correspondientes, y el número y la longitud de las entradas en blanco que deben insertarse para producir esa alineación.

Se puede usar el mismo algoritmo ( http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm ) para la pronunciación, desde las frecuencias de sustitución en un conjunto de pronunciaciones alternativas. Luego, puede calcular las puntuaciones de alineación para medir la similitud entre las dos pronunciaciones de manera que sea sensible a las diferencias entre los fonemas. Las medidas de similitud que se pueden usar aquí son la distancia de Levenshtein, la tasa de errores de fonema y la tasa de errores de palabras.

Algoritmos El número mínimo de inserciones, eliminaciones y sustituciones necesarias para la transformación de una secuencia en otra es la distancia de Levenshtein. Más información en http://php.net/manual/en/function.levenshtein.php La tasa de error de fonema (PER) es la distancia de Levenshtein entre una pronunciación predicha y la pronunciación de referencia, dividida por el número de fonemas en la pronunciación de referencia. La tasa de error de palabra (WER) es la proporción de pronunciaciones pronosticadas con al menos un error de fonema al número total de pronunciaciones.

Fuente : Hice una pasantía en esto en UW-Madison