Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add multilingual transcription + translation for whisper models (#87, #95) #133

Merged
merged 8 commits into from
Jun 9, 2023

Conversation

xenova
Copy link
Collaborator

@xenova xenova commented Jun 5, 2023

Allow users to transcribe non-English languages, as well as translate to English.

@HuggingFaceDocBuilderDev
Copy link

HuggingFaceDocBuilderDev commented Jun 5, 2023

The documentation is not available anymore as the PR was closed or merged.

@kungfooman
Copy link
Contributor

Currently running into this issue:

env.localModelPath = "http://127.0.0.1/transformer/models/";
const pipe = await pipeline("automatic-speech-recognition", "whisper-tiny");
const audioCTX = new AudioContext({
  sampleRate: 16000
});
const arrayBuffer = await (await fetch(SPEECH2TEXT_AUDIO.currentSrc)).arrayBuffer();
const decoded = await audioCTX.decodeAudioData(arrayBuffer);
const audio = decoded.getChannelData(0);
const result = await pipe(audio, {
  return_timestamps: true,
  chunk_length_s: 30,
  chunk_callback: (obj) => {
      const decodedTokens = pipe.tokenizer.decode(obj.tokens);
      console.log("progress tokens:", decodedTokens);
  },
  language: 'french',
  task: 'transcribe',
});
console.log("result", result);

Output:

" Je vais vous remercer une autre question. Pour John, je suis en train de faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. On va faire une autre question. Je suis un homme qui est très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très On va tout le monde voir mais c'est une bonne vidéo. Et ça va tout le monde voir. On va tout le monde voir. On va tout le monde voir. Pour une fois de dégarde, on va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout le monde voir. On va tout Il a eu un peu de temps de faire un peu de temps de la structure, et la structure de la structure. Et la première fois, c'est un peu plus de temps de la structure. Il a eu un peu de temps de la structure, et c'es
t un peu plus de temps de la structure. Il a eu un peu de temps de la structure, et c'est un peu plus de temps de la structure. Et c'est un peu plus de temps de la structure, et c'est un peu plus de temps de la structure. Et c'est un peu plus de temps de la structure, et c' est un peu plus grave, et il est un peu plus grave. Et je suis très très tr
ès très très très très grave. Et je suis très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très tr
ès très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très trè
s très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très
 très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très
 très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très très et tout ce que je l'ai dit, c'est une grande partie de la vie. Mais c'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande partie de la vie. C'est une grande vie, une grande vie,
 une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, 
une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, 
une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une grande vie, une"

Is this expected when transcribing Norwegian as French?

Transcribing Norwegian as Norwegian:

' Vi kommer til krigens avsløttning. For jeg har vært høy til første oppdrag om likvidation av nyevr på lille 3. Så, ette krigen til allerstørtjonen av en slår fører og problemet post dramatisk stress. Og så for jeg har vært høy til å få lille 3. Jeg har en ann ting i Sverige. På elbjø, uten for Stockholm, i ekmevrk, et kommunen som da kurs, winteren, 1944, 1945. Hvorfor en 1945 blir han sent tilbakete nørige sammen medleger ikke som han, halvår fem til tiltelse, som i en st en struktur, og sålde vi i öster dagen, 90-dalt, lille støy med mere. På 45 stedet, i styrkert det i nærmere 500 man. Jeg kom ned i en løve
r dag. Jeg regler til å bli en ny region hvor vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, 
og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, 
og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, 
og vi har gjort en dag, og vi har gjort en dag, en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, og vi har gjort en dag, en dag, en dag, en dag, en dag, en dag, 
en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, 
en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, 
en dag, en dag, en dag, en dag, en dag, en dag, en dag, en dag, en - og skjiter da min lovig 50 meter av slam. Men da kunne vi fortale meg at riktig er det enn vanlig avløskt, det blir riktig etterlig avsiktig altid, - og  kan man ta i dag med denne kringen, - - hvordan vi vil være til å være noen i filmen. Men grund avtipoford den her likerklart, og oppdager det var jo en avtidig noe mask.'

Test file (wav with .zip ending, because "GitHub"):
minner_fra_krigen_short.wav.zip

@xenova
Copy link
Collaborator Author

xenova commented Jun 5, 2023

Can you try with a larger model (small or base)? I've noticed that the tiny model - especially when quantized - yields quite poor performance.

Edit: I was able to reproduce the issue with tiny quantized. Let me see what's up.
Edit2: Switching to whisper.small (quantized) fixed the issues for me. I think there just aren't enough parameters in the model to accurately perform the multilingual transcription and/or translation.

@kungfooman
Copy link
Contributor

Yep, I agree with you, just tested whisper-base and the difference is like day and night - not one of these repetitions in output 👍

image

Not a perfect transcription, but I think this is due the lack or quality of Norwegian language training data 💯

@xenova
Copy link
Collaborator Author

xenova commented Jun 5, 2023

Nice 👍 If you are able to run the unquantized models, you'll probably also get a boost in performance.

  • await pipeline("automatic-speech-recognition", "whisper-small", {quantized: false});
  • await pipeline("automatic-speech-recognition", "whisper-base", {quantized: false});

I also recently added the medium, large, and large-v2 models (https://huggingface.co/models?other=transformers.js&sort=downloads&search=whisper). So, feel free to play around with those too.

Comment on lines +136 to +143
/**
* Replicate python's .pop() method for objects.
* @param {Object} obj The object to pop from.
* @param {string} key The key to pop.
* @param {*} defaultValue The default value to return if the key does not exist.
* @returns {*} The value of the popped key.
* @throws {Error} If the key does not exist and no default value is provided.
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you decide to use "strictNullChecks": true, then this will return the expected types:

image

Suggested change
/**
* Replicate python's .pop() method for objects.
* @param {Object} obj The object to pop from.
* @param {string} key The key to pop.
* @param {*} defaultValue The default value to return if the key does not exist.
* @returns {*} The value of the popped key.
* @throws {Error} If the key does not exist and no default value is provided.
*/
/**
* Replicate python's .pop() method for objects.
* @param {OBJ} obj The object to pop from.
* @param {KEY} key The key to pop.
* @param {DEF} [defaultValue=undefined] The default value to return if the key does not exist.
* @template {Record<string, any>} OBJ
* @template {string} KEY
* @template DEF
* @throws {Error} If the key does not exist and no default value is provided.
* @returns {Exclude<OBJ[KEY] | DEF, undefined>} The value of the popped key.
*/

@xenova xenova merged commit 8625f4a into main Jun 9, 2023
@xenova
Copy link
Collaborator Author

xenova commented Jun 9, 2023

@kungfooman I didn't forget about your suggestion (improved typing) - I just have to merge this in to get another project working (which you will soon see 😉).

Can you make a PR with these changes alone?

@kungfooman
Copy link
Contributor

Can you make a PR with these changes alone?

Without strictNullChecks enabled the language server cannot distinguish e.g. string | null regardless so far.

We could enable that setting, but then we see around 70 errors, which require some changes/fixes, for example:

image

(requires a tokenizer, but null is given)

I'm looking forward to the surprise 😅 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants