DanielSWolf / rhubarb-lip-sync

Rhubarb Lip Sync is a command-line tool that automatically creates 2D mouth animation from voice recordings. You can use it for characters in computer games, in animated cartoons, or in any other project that requires animating mouths based on existing recordings.
Other
1.71k stars 208 forks source link

Error detecting segments of speech on Alpine Linux #107

Closed RankoR closed 2 years ago

RankoR commented 2 years ago

I have a test docker image:

FROM azul/zulu-openjdk-alpine:11.0.13-jre-headless AS base

RUN apk add --no-cache libgcc libc6-compat libstdc++

RUN mkdir /app
COPY apps /app/apps
COPY audio.wav /app/audio.wav

WORKDIR /app

CMD ["/app/apps/rhubarb/rhubarb-linux", "/app/audio.wav", "-r", "phonetic", "-f", "json", "-q"]

Then I build it and run, and I get an error:

docker run --rm rhubarb
Rhubarb Lip Sync 1.11.0 processing file /app/audio.wav:
[Fatal] Application terminating with error: Error processing file /app/audio.wav.
Error detecting segments of speech.
No error information

Audio file is valid, and macOS version of rhubarb 1.11.0 works fine with the same file on macOS Monterey. UPD. Works fine too on Debian 11.

Why it doesn't work on Alpine Linux?

RankoR commented 2 years ago

Ok, I've managed to fix it. The problem is that Alpine uses musl instead of glibc, so to get it working we need to recompile it. Sample Dockerfile:

# Build

FROM alpine:3.14.2 AS build

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

ENV RHUBARB_VERSION 1.11.0

RUN apk add --no-cache wget \
    unzip \
    cmake \
    clang \
    clang-dev \
    make \
    gcc \
    g++ \
    libc-dev \
    boost-dev \
    upx

RUN mkdir /src/
RUN mkdir /out/

WORKDIR /src/

RUN set -ex \
    && wget https://github.com/DanielSWolf/rhubarb-lip-sync/archive/refs/tags/v$RHUBARB_VERSION.zip -O rhubarb-lip-sync-$RHUBARB_VERSION.zip \
    && unzip rhubarb-lip-sync-$RHUBARB_VERSION.zip \
    && rm rhubarb-lip-sync-$RHUBARB_VERSION.zip \
    && cd rhubarb-lip-sync-$RHUBARB_VERSION \
    && rm -rf build \
    && mkdir build \
    && cd build \
    && cmake .. \
    && cmake --build . --config Release --target rhubarb \
    && cmake --build . --config Release --target runTests \
    && upx --best rhubarb/rhubarb \
    && cp rhubarb/rhubarb /out/rhubarb

# Run

FROM azul/zulu-openjdk-alpine:11.0.13-jre-headless AS base

RUN apk add --no-cache libc6-compat libstdc++ libgcc

RUN mkdir /app
COPY apps /app/apps
COPY --from=build /out/rhubarb /app/apps/rhubarb/rhubarb-linux
COPY audio.wav /app/audio.wav

WORKDIR /app

CMD ["/app/apps/rhubarb/rhubarb-linux", "/app/audio.wav", "-r", "phonetic", "-f", "json", "-q"]

UPX step is optional. If you want to get a full package, you'll need a JRE image for build. I need only the binary, so raw alpine is fine.

docker run --rm rhubarb
{
  "metadata": {
    "soundFile": "/app/audio.wav",
    "duration": 108.13
  },
  "mouthCues": [
    { "start": 0.00, "end": 0.17, "value": "X" },
...
DanielSWolf commented 2 years ago

I'm glad you got it working on Alpine.

I'd have expected implementations of the C standard library to be compatible, so I'm surprised you could build it, but not run it. In my experience, differences between standard library implementations usually show at compile time rather than runtime.