forked from huggingface/transformers
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* add qwen2audio * Update check_repo.py * fix style * fix test * fix style * add model size * Qwen2AudioEncoderModel->Qwen2AudioEncoder; add copy info * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * switch the attention_mask and the feature_attention_mask * add to PRIVATE_MODELS in check_repo.py; add to MODEL_NAMES_TO_IGNORE in check_table.py * fix initialization * update chat_template * fix consistency issue after copy * add docstrings to _merge_input_ids_with_audio_features * add copied from to prepare_inputs_for_generation * add more details to docs * rm comment * add init_std * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * Update src/transformers/models/qwen2_audio/modeling_qwen2_audio.py Co-authored-by: Yoach Lacombe <[email protected]> * update * Update docs/source/en/model_doc/qwen2_audio.md Co-authored-by: amyeroberts <[email protected]> * update tests * rm ignore_index * update processor * rm ffmpeg_read * Update tests/models/qwen2_audio/test_modeling_qwen2_audio.py Co-authored-by: amyeroberts <[email protected]> * Update docs/source/en/model_doc/qwen2_audio.md Co-authored-by: amyeroberts <[email protected]> * Update docs/source/en/model_doc/qwen2_audio.md Co-authored-by: amyeroberts <[email protected]> * Update docs/source/en/model_doc/qwen2_audio.md Co-authored-by: amyeroberts <[email protected]> * update * typo * [run_slow] qwen2_audio * [run_slow] qwen2_audio * [run_slow] qwen2_audio * fix quality * [run_slow] qwen2_audio * [run_slow] qwen2_audio * [run_slow] qwen2_audio * add official model --------- Co-authored-by: Yoach Lacombe <[email protected]> Co-authored-by: amyeroberts <[email protected]>
- Loading branch information
1 parent
b51d414
commit 16ed064
Showing
20 changed files
with
2,563 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
<!--Copyright 2024 The HuggingFace Team. All rights reserved. | ||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | ||
the License. You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | ||
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | ||
specific language governing permissions and limitations under the License. | ||
⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be | ||
rendered properly in your Markdown viewer. | ||
--> | ||
|
||
# Qwen2Audio | ||
|
||
## Overview | ||
|
||
The Qwen2-Audio is the new model series of large audio-language models from the Qwen team. Qwen2-Audio is capable of accepting various audio signal inputs and performing audio analysis or direct textual responses with regard to speech instructions. We introduce two distinct audio interaction modes: | ||
|
||
* voice chat: users can freely engage in voice interactions with Qwen2-Audio without text input | ||
* audio analysis: users could provide audio and text instructions for analysis during the interaction | ||
|
||
It was proposed in [Qwen2-Audio Technical Report](https://arxiv.org/abs/2407.10759) by Yunfei Chu, Jin Xu, Qian Yang, Haojie Wei, Xipin Wei, Zhifang Guo, Yichong Leng, Yuanjun Lv, Jinzheng He, Junyang Lin, Chang Zhou, Jingren Zhou. | ||
|
||
The abstract from the paper is the following: | ||
|
||
*We introduce the latest progress of Qwen-Audio, a large-scale audio-language model called Qwen2-Audio, which is capable of accepting various audio signal inputs and performing audio analysis or direct textual responses with regard to speech instructions. In contrast to complex hierarchical tags, we have simplified the pre-training process by utilizing natural language prompts for different data and tasks, and have further expanded the data volume. We have boosted the instruction-following capability of Qwen2-Audio and implemented two distinct audio interaction modes for voice chat and audio analysis. In the voice chat mode, users can freely engage in voice interactions with Qwen2-Audio without text input. In the audio analysis mode, users could provide audio and text instructions for analysis during the interaction. Note that we do not use any system prompts to switch between voice chat and audio analysis modes. Qwen2-Audio is capable of intelligently comprehending the content within audio and following voice commands to respond appropriately. For instance, in an audio segment that simultaneously contains sounds, multi-speaker conversations, and a voice command, Qwen2-Audio can directly understand the command and provide an interpretation and response to the audio. Additionally, DPO has optimized the model's performance in terms of factuality and adherence to desired behavior. According to the evaluation results from AIR-Bench, Qwen2-Audio outperformed previous SOTAs, such as Gemini-1.5-pro, in tests focused on audio-centric instruction-following capabilities. Qwen2-Audio is open-sourced with the aim of fostering the advancement of the multi-modal language community. * | ||
|
||
|
||
## Usage tips | ||
|
||
`Qwen2-Audio-7B` and `Qwen2-Audio-7B-Instruct` can be found on the [Huggingface Hub](https://huggingface.co/Qwen) | ||
|
||
In the following, we demonstrate how to use `Qwen2-Audio-7B-Instruct` for the inference, supporting both voice chat and audio analysis modes. Note that we have used the ChatML format for dialog, in this demo we show how to leverage `apply_chat_template` for this purpose. | ||
|
||
### Voice Chat Inference | ||
In the voice chat mode, users can freely engage in voice interactions with Qwen2-Audio without text input: | ||
```python | ||
from io import BytesIO | ||
from urllib.request import urlopen | ||
import librosa | ||
from transformers import Qwen2AudioForConditionalGeneration, AutoProcessor | ||
|
||
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct") | ||
model = Qwen2AudioForConditionalGeneration.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct", device_map="auto") | ||
|
||
conversation = [ | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/guess_age_gender.wav"}, | ||
]}, | ||
{"role": "assistant", "content": "Yes, the speaker is female and in her twenties."}, | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/translate_to_chinese.wav"}, | ||
]}, | ||
] | ||
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False) | ||
audios = [] | ||
for message in conversation: | ||
if isinstance(message["content"], list): | ||
for ele in message["content"]: | ||
if ele["type"] == "audio": | ||
audios.append(librosa.load( | ||
BytesIO(urlopen(ele['audio_url']).read()), | ||
sr=processor.feature_extractor.sampling_rate)[0] | ||
) | ||
|
||
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True) | ||
inputs.input_ids = inputs.input_ids.to("cuda") | ||
|
||
generate_ids = model.generate(**inputs, max_length=256) | ||
generate_ids = generate_ids[:, inputs.input_ids.size(1):] | ||
|
||
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] | ||
``` | ||
|
||
### Audio Analysis Inference | ||
In the audio analysis, users could provide both audio and text instructions for analysis: | ||
```python | ||
from io import BytesIO | ||
from urllib.request import urlopen | ||
import librosa | ||
from transformers import Qwen2AudioForConditionalGeneration, AutoProcessor | ||
|
||
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct") | ||
model = Qwen2AudioForConditionalGeneration.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct", device_map="auto") | ||
|
||
conversation = [ | ||
{'role': 'system', 'content': 'You are a helpful assistant.'}, | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/glass-breaking-151256.mp3"}, | ||
{"type": "text", "text": "What's that sound?"}, | ||
]}, | ||
{"role": "assistant", "content": "It is the sound of glass shattering."}, | ||
{"role": "user", "content": [ | ||
{"type": "text", "text": "What can you do when you hear that?"}, | ||
]}, | ||
{"role": "assistant", "content": "Stay alert and cautious, and check if anyone is hurt or if there is any damage to property."}, | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/1272-128104-0000.flac"}, | ||
{"type": "text", "text": "What does the person say?"}, | ||
]}, | ||
] | ||
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False) | ||
audios = [] | ||
for message in conversation: | ||
if isinstance(message["content"], list): | ||
for ele in message["content"]: | ||
if ele["type"] == "audio": | ||
audios.append( | ||
librosa.load( | ||
BytesIO(urlopen(ele['audio_url']).read()), | ||
sr=processor.feature_extractor.sampling_rate)[0] | ||
) | ||
|
||
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True) | ||
inputs.input_ids = inputs.input_ids.to("cuda") | ||
|
||
generate_ids = model.generate(**inputs, max_length=256) | ||
generate_ids = generate_ids[:, inputs.input_ids.size(1):] | ||
|
||
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] | ||
``` | ||
|
||
### Batch Inference | ||
We also support batch inference: | ||
```python | ||
from io import BytesIO | ||
from urllib.request import urlopen | ||
import librosa | ||
from transformers import Qwen2AudioForConditionalGeneration, AutoProcessor | ||
|
||
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct") | ||
model = Qwen2AudioForConditionalGeneration.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct", device_map="auto") | ||
|
||
conversation1 = [ | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/glass-breaking-151256.mp3"}, | ||
{"type": "text", "text": "What's that sound?"}, | ||
]}, | ||
{"role": "assistant", "content": "It is the sound of glass shattering."}, | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/f2641_0_throatclearing.wav"}, | ||
{"type": "text", "text": "What can you hear?"}, | ||
]} | ||
] | ||
|
||
conversation2 = [ | ||
{"role": "user", "content": [ | ||
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/1272-128104-0000.flac"}, | ||
{"type": "text", "text": "What does the person say?"}, | ||
]}, | ||
] | ||
|
||
conversations = [conversation1, conversation2] | ||
|
||
text = [processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False) for conversation in conversations] | ||
|
||
audios = [] | ||
for conversation in conversations: | ||
for message in conversation: | ||
if isinstance(message["content"], list): | ||
for ele in message["content"]: | ||
if ele["type"] == "audio": | ||
audios.append( | ||
librosa.load( | ||
BytesIO(urlopen(ele['audio_url']).read()), | ||
sr=processor.feature_extractor.sampling_rate)[0] | ||
) | ||
|
||
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True) | ||
inputs['input_ids'] = inputs['input_ids'].to("cuda") | ||
inputs.input_ids = inputs.input_ids.to("cuda") | ||
|
||
generate_ids = model.generate(**inputs, max_length=256) | ||
generate_ids = generate_ids[:, inputs.input_ids.size(1):] | ||
|
||
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False) | ||
``` | ||
|
||
## Qwen2AudioConfig | ||
|
||
[[autodoc]] Qwen2AudioConfig | ||
|
||
## Qwen2AudioConfig | ||
|
||
[[autodoc]] Qwen2AudioEncoderConfig | ||
|
||
## Qwen2AudioProcessor | ||
|
||
[[autodoc]] Qwen2AudioProcessor | ||
|
||
## Qwen2AudioForConditionalGeneration | ||
|
||
[[autodoc]] Qwen2AudioForConditionalGeneration | ||
- forward |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -189,6 +189,7 @@ | |
pvt, | ||
pvt_v2, | ||
qwen2, | ||
qwen2_audio, | ||
qwen2_moe, | ||
rag, | ||
recurrent_gemma, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.