Enregistrement avec microphone

Godot prend en charge l'enregistrement audio en jeu pour Windows, MacOS, Linux, Android et iOS.

Une démo simple est incluse dans les projets de démonstration officiels et sera utilisée comme support pour ce tutoriel : https://github.com/godotengine/godot-demo-projects/tree/master/audio/mic_record.

La structure de la démo

La démo consiste en une seule scène. Cette scène comprend deux parties principales : l'interface graphique et l'audio.

Nous nous concentrerons sur la partie audio. Dans cette démo, un bus nommé Record avec l'effet Record est créé pour gérer l'enregistrement audio. Un AudioStreamPlayer nommé AudioStreamRecord est utilisé pour l'enregistrement.

../../_images/record_bus.png ../../_images/record_stream_player.png
var effect
var recording

func _ready():
    # We get the index of the "Record" bus.
    var idx = AudioServer.get_bus_index("Record")
    # And use it to retrieve its first effect, which has been defined
    # as an "AudioEffectRecord" resource.
    effect = AudioServer.get_bus_effect(idx, 0)

L'enregistrement audio est géré par la ressource AudioEffectRecord qui possède trois méthodes : get_recording(), is_recording_active(), et set_recording_active().

func _on_RecordButton_pressed():
    if effect.is_recording_active():
        recording = effect.get_recording()
        $PlayButton.disabled = false
        $SaveButton.disabled = false
        effect.set_recording_active(false)
        $RecordButton.text = "Record"
        $Status.text = ""
    else:
        $PlayButton.disabled = true
        $SaveButton.disabled = true
        effect.set_recording_active(true)
        $RecordButton.text = "Stop"
        $Status.text = "Recording..."

Au début de la démo, l'effet d'enregistrement n'est pas actif. Lorsque l'utilisateur appuie sur le RecordButton, l'effet est activé avec set_recording_active(true).

À la prochain pression sur le bouton, comme effect.is_recording_active() est true, le flux enregistré peut être stocké dans la variable recording en appelant effect.get_recording().

func _on_PlayButton_pressed():
    print(recording)
    print(recording.format)
    print(recording.mix_rate)
    print(recording.stereo)
    var data = recording.get_data()
    print(data)
    print(data.size())
    $AudioStreamPlayer.stream = recording
    $AudioStreamPlayer.play()

Pour lire l'enregistrement, vous affectez l'enregistrement comme le flux du AudioStreamPlayer et appelez play().

func _on_SaveButton_pressed():
    var save_path = $SaveButton/Filename.text
    recording.save_to_wav(save_path)
    $Status.text = "Saved WAV file to: %s\n(%s)" % [save_path, ProjectSettings.globalize_path(save_path)]

Pour enregistrer l'enregistrement, vous appelez save_to_wav() avec le chemin vers un fichier. Dans cette démo, le chemin d'accès est défini par l'utilisateur via une zone de saisie LineEdit.