func Base64ToWave()

in api/pkg/handler/audio.go [28:72]


func Base64ToWave(ctx context.Context, content string) ([]byte, error) {
	audio, err := base64.StdEncoding.DecodeString(content)
	if err != nil {
		return nil, Errorf(ctx,
			http.StatusBadRequest,
			"invalid encoded audio",
			"failed to decode base64: %w", err)
	}

	dir, err := ioutil.TempDir("", "clouddemo")
	if err != nil {
		return nil, Errorf(ctx,
			http.StatusInternalServerError,
			http.StatusText(http.StatusInternalServerError),
			"failed to create tempdir: %w", err)
	}
	defer os.RemoveAll(dir)

	srcFile := filepath.Join(dir, "src.ogg")
	dstFile := filepath.Join(dir, "dst.wav")

	if err := ioutil.WriteFile(srcFile, audio, 0600); err != nil {
		return nil, Errorf(ctx,
			http.StatusInternalServerError,
			http.StatusText(http.StatusInternalServerError),
			"failed to write file: %s: %w", srcFile, err)
	}

	if err := exec.Command("ffmpeg", "-i", srcFile, dstFile).Run(); err != nil {
		return nil, Errorf(ctx,
			http.StatusInternalServerError,
			http.StatusText(http.StatusInternalServerError),
			"failed to exec ffmpeg: %w", err)
	}

	wav, err := ioutil.ReadFile(dstFile)
	if err != nil {
		return nil, Errorf(ctx,
			http.StatusInternalServerError,
			http.StatusText(http.StatusInternalServerError),
			"failed to read wav file: %s: %w", dstFile, err)
	}

	return wav, nil
}