Je pense que c'est un problème assez commun, mais je n'ai pas encore trouvé de réponse appropriée. J'ai beaucoup de fichiers audio de paroles humaines que j'aimerais briser sur les mots, ce qui peut être fait de manière heuristique en examinant les pauses dans la forme d'onde, mais quelqu'un peut-il m'indiquer une fonction/bibliothèque en python qui le fait automatiquement?
Une méthode plus simple consiste à utiliser pydub module. ajout récent de utilités silencieuses fait tout le travail lourd comme setting up silence threahold
, setting up silence length
. etc et simplifie le code de manière significative par opposition aux autres méthodes mentionnées.
Voici une implémentation de démonstration inspirée de ici
Installer:
J'avais un fichier audio avec des lettres anglaises parlées de A
à Z
dans le fichier "a-z.wav". Un sous-répertoire splitAudio
a été créé dans le répertoire de travail en cours. Lors de l’exécution du code de démonstration, les fichiers ont été divisés en 26 fichiers distincts, chaque fichier audio stockant chaque syllabe.
Observations: Certaines syllabes ont été coupées, nécessitant éventuellement une modification des paramètres suivants,min_silence_len=500
silence_thresh=-16
On peut vouloir les adapter à ses propres besoins.
Code de démonstration:
from pydub import AudioSegment
from pydub.silence import split_on_silence
sound_file = AudioSegment.from_wav("a-z.wav")
audio_chunks = split_on_silence(sound_file,
# must be silent for at least half a second
min_silence_len=500,
# consider it silent if quieter than -16 dBFS
silence_thresh=-16
)
for i, chunk in enumerate(audio_chunks):
out_file = ".//splitAudio//chunk{0}.wav".format(i)
print "exporting", out_file
chunk.export(out_file, format="wav")
Sortie:
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
exporting .//splitAudio//chunk0.wav
exporting .//splitAudio//chunk1.wav
exporting .//splitAudio//chunk2.wav
exporting .//splitAudio//chunk3.wav
exporting .//splitAudio//chunk4.wav
exporting .//splitAudio//chunk5.wav
exporting .//splitAudio//chunk6.wav
exporting .//splitAudio//chunk7.wav
exporting .//splitAudio//chunk8.wav
exporting .//splitAudio//chunk9.wav
exporting .//splitAudio//chunk10.wav
exporting .//splitAudio//chunk11.wav
exporting .//splitAudio//chunk12.wav
exporting .//splitAudio//chunk13.wav
exporting .//splitAudio//chunk14.wav
exporting .//splitAudio//chunk15.wav
exporting .//splitAudio//chunk16.wav
exporting .//splitAudio//chunk17.wav
exporting .//splitAudio//chunk18.wav
exporting .//splitAudio//chunk19.wav
exporting .//splitAudio//chunk20.wav
exporting .//splitAudio//chunk21.wav
exporting .//splitAudio//chunk22.wav
exporting .//splitAudio//chunk23.wav
exporting .//splitAudio//chunk24.wav
exporting .//splitAudio//chunk25.wav
exporting .//splitAudio//chunk26.wav
>>>
Utilisez IBM STT . En utilisant timestamps=true
, vous obtiendrez le mot de rupture avec lorsque le système détectera qu’il a été parlé.
Il y a beaucoup d'autres fonctionnalités intéressantes comme Word_alternatives_threshold
pour obtenir d'autres possibilités de mots et Word_confidence
pour obtenir la confiance avec laquelle le système prédit le mot. Définissez Word_alternatives_threshold
entre 0,1 et 0,01 pour avoir une idée réelle.
Cela nécessite une connexion, à la suite de quoi vous pouvez utiliser le nom d'utilisateur et le mot de passe générés.
IBM STT fait déjà partie du module de reconnaissance vocale mentionné, mais pour obtenir l’horodatage de Word, vous devez modifier la fonction.
Un formulaire extrait et modifié ressemble à:
def extracted_from_sr_recognize_ibm(audio_data, username=IBM_USERNAME, password=IBM_PASSWORD, language="en-US", show_all=False, timestamps=False,
Word_confidence=False, Word_alternatives_threshold=0.1):
assert isinstance(username, str), "``username`` must be a string"
assert isinstance(password, str), "``password`` must be a string"
flac_data = audio_data.get_flac_data(
convert_rate=None if audio_data.sample_rate >= 16000 else 16000, # audio samples should be at least 16 kHz
convert_width=None if audio_data.sample_width >= 2 else 2 # audio samples should be at least 16-bit
)
url = "https://stream-fra.watsonplatform.net/speech-to-text/api/v1/recognize?{}".format(urlencode({
"profanity_filter": "false",
"continuous": "true",
"model": "{}_BroadbandModel".format(language),
"timestamps": "{}".format(str(timestamps).lower()),
"Word_confidence": "{}".format(str(Word_confidence).lower()),
"Word_alternatives_threshold": "{}".format(Word_alternatives_threshold)
}))
request = Request(url, data=flac_data, headers={
"Content-Type": "audio/x-flac",
"X-Watson-Learning-Opt-Out": "true", # prevent requests from being logged, for improved privacy
})
authorization_value = base64.standard_b64encode("{}:{}".format(username, password).encode("utf-8")).decode("utf-8")
request.add_header("Authorization", "Basic {}".format(authorization_value))
try:
response = urlopen(request, timeout=None)
except HTTPError as e:
raise sr.RequestError("recognition request failed: {}".format(e.reason))
except URLError as e:
raise sr.RequestError("recognition connection failed: {}".format(e.reason))
response_text = response.read().decode("utf-8")
result = json.loads(response_text)
# return results
if show_all: return result
if "results" not in result or len(result["results"]) < 1 or "alternatives" not in result["results"][0]:
raise Exception("Unknown Value Exception")
transcription = []
for utterance in result["results"]:
if "alternatives" not in utterance:
raise Exception("Unknown Value Exception. No Alternatives returned")
for hypothesis in utterance["alternatives"]:
if "transcript" in hypothesis:
transcription.append(hypothesis["transcript"])
return "\n".join(transcription)
Vous pourriez regarder Audiolab Il fournit une API décente pour convertir les échantillons de voix en numpy arrays . Le module Audiolab utilise la bibliothèque C++ libsndfile pour faire le gros du travail.
Vous pouvez ensuite analyser les tableaux pour rechercher les valeurs les plus faibles afin de rechercher les pauses.
pyAudioAnalysis peut segmenter un fichier audio si les mots sont clairement séparés (c'est rarement le cas dans le langage naturel). Le paquet est relativement facile à utiliser:
python pyAudioAnalysis/pyAudioAnalysis/audioAnalysis.py silenceRemoval -i SPEECH_AUDIO_FILE_TO_SPLIT.mp3 --smoothing 1.0 --weight 0.3
Plus de détails sur mon blog .